250上位机VC MFC文件类型与指定程序关联
250上位机VC MFC文件类型与指定程序关联 功能展示 上位机程序开发,都要进行文件相关操作,那么我们自己保存的文件如何让它具有自己的图标以及双击可以打开我们自己的程序呢,当前例程通过修改注册表的方法,实现文件图标的设置及文件打开程序的关联,效果如图,点击执行关联,会将后缀.GKBC8的文件关联上指定的图标,指定的打开程序,并且在双击.GKBC8文件类型时,程序会获取双击文件的路径,方便后续操作 要点提示 修改注册表进行文件关联的操作为 1 增加注册表项 HKEY_CLASSES_ROOT\.gkbc8(.gkbc8为我们要关联的后缀) 1.1设置此项默认键值为.gkbc(.gkbc为我们随意定义的值,要与第二步相同) 2 增加注册表项 HKEY_CLASSES_ROOT\.gkbc(.gkbc与1.1步值相同)(可修改默认值:为文件描述) 2.1 增加注册表项 HKEY_CLASSES_ROOT\.gkbc\shell\open\command 2.1.1修改 HKEY_CLASSES_ROOT\.gkbc\shell\open\command的默认键值为打开文件程序的绝对路径; 2.2 增加注册表项 HKEY_CLASSES_ROOT\.gkbc\shell\print\command 2.2.1修改 HKEY_CLASSES_ROOT\.gkbc\shell\print\command的默认键值为打印文件程序的绝对路径; 2.3 增加注册表项 HKEY_CLASSES_ROOT\.gkbc\DefaultIcon 2.3.1修改 HKEY_CLASSES_ROOT\.gkbc\DefaultIcon的默认键值为文件显示用图标的绝对路径 3.文件关联的显示图标未立即生效,使修改的注册表立即生效可使用函数 SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST, NULL, NULL); SHChangeNotify(SHCNE_UPDATEIMAGE,SHCNF_DWORD,NULL,NULL); 注册表项的创建可以用函数RegCreateKey(),键值的设置可以用函数RegSetValue() RegCreateKey 函数原型:LONG RegCreateKey(HKEYhKey,LPCTSTRlpSubKey,PHKEYphkResult); hKey:指向当前打开表项的句柄,或者是下列预定义保留句柄值之一,实际上就是注册表中的几个分支。 HKEY_CLASSES_ROOT ,HKEY_CURRENT_CONFIG,HKEY_CURRENT_USER ,HKEY_USERS,HKEY_LOCAL_MACHINE lpSubKey:指向一个空终止的字符串指针,指示这个函数将打开或创建的表项的名称。这个表项必须是由hKey参数所标识的项的子项 phkResult:这是一个返回值,指向一个变量的指针,用来接受创建或打开的表项的句柄。当不再需要此返回的注册表项句柄时,调用RegCloseKey函数关闭这个句柄。 RegSetValue函数原型为: LONG RegSetValue(HKEYhKey,LPCTSTRlpSubKey,DWORDdwType, // type of value LPCTSTR lpData, DWORD cbData); hKey:指向当前打开表项的句柄,或者预定保留值之一 lpSubKey:指向一个空终止的字符串指针,指示这个函数将打开或创建表项的名称。可以为NULL,或空字符串,那么此函数将为参数hkey所指定的注册表项默认设置值。这个表项必须是由hkey参数所标识的子项。 dwType:指示将被存储的信息类型。该参数必须为REG_SZ lpData:指向一个空终止的字符串,该字符串中包含了要为指定项的默认值设置的数据。 cbData:指示lpData参数所指向的字符串的大小,单位是字节,但不包含字符串最后的空终止字符 在双击文件打开程序时,系统会传递文件的路径,路径的获取可以参阅例程,要注意的是写注册表关联文件打开程序的格式格式为:程序的绝对路径(空格)%1如 c:\\gkbc8.exe %; ; 实现功能 1.新建基于对话框的应用程序 2.拖拽4编辑框ID分别为IDC_EDIT1,IDC_EDIT2, IDC_EDIT3, IDC_EDIT4及一按钮<执行关联>关联函数 - void CGkbc8Dlg::OnButton1()
- {
- //<>默认设定值
- CString sExtent=".gkbc8";//要关联的文件后缀
- CString sDescribe = "工控编程吧测试用文件";//鼠标悬浮文件上,文件类型的描述
- CString sIconPath ="";//文件显示用图标路径
- CString sOpenProcPath ="F:\\Software\\福昕PDF阅读器.exe %1";//文件打开用程序路径
- CString sPrintProcPath="F:\\Software\\福昕PDF阅读器.exe %1";//文件打印用程序路径
- //<>
- CString sTemp;
- GetDlgItemText(IDC_EDIT1,sTemp);
- sExtent = sTemp.IsEmpty()?sExtent:sTemp;
- GetDlgItemText(IDC_EDIT2,sTemp);
- sOpenProcPath = sTemp.IsEmpty()?sOpenProcPath:sTemp;
- GetDlgItemText(IDC_EDIT3,sTemp);
- sPrintProcPath = sTemp.IsEmpty()?sPrintProcPath:sTemp;
- GetDlgItemText(IDC_EDIT4,sTemp);
- sIconPath = sTemp.IsEmpty()?sIconPath:sTemp;
- //<>
- HKEY sub;
- CString sDefualtValue =".GkbcExecute";
- ::RegCreateKey(HKEY_CLASSES_ROOT,sExtent,&sub);//建立扩展名
- ::RegSetValue(sub,NULL,REG_SZ,sDefualtValue,sDefualtValue.GetLength());//设置扩展名的默认值
复制代码- //创建默认值
- ::RegCreateKey(HKEY_CLASSES_ROOT,sDefualtValue,&sub);
- ::RegSetValue(sub,NULL,REG_SZ,sDescribe,sDescribe.GetLength());
- //<>创建DefaultIcon子项
- CString sKey;
- sKey.Format("%s\\DefaultIcon",sDefualtValue);
- ::RegCreateKey(HKEY_CLASSES_ROOT,sKey,&sub);
- ::RegSetValueEx(sub,NULL,NULL,REG_EXPAND_SZ,(BYTE*)sIconPath.GetBuffer(0),
- sIconPath.GetLength());
- //创建shell\open\command子项
- sKey.Format("%s\\shell\\open\\command",sDefualtValue);
- ::RegCreateKey(HKEY_CLASSES_ROOT,sKey,&sub);
- ::RegSetValueEx(sub,NULL,NULL,REG_EXPAND_SZ,(BYTE*)sOpenProcPath.GetBuffer(0),
- sOpenProcPath.GetLength());
- //创建shell\print\command子项
- sKey.Format("%s\\shell\\print\\command",sDefualtValue);
- ::RegCreateKey(HKEY_CLASSES_ROOT,sKey,&sub);
- ::RegSetValueEx(sub,NULL,NULL,REG_EXPAND_SZ,(BYTE*)sPrintProcPath.GetBuffer(0),
- sPrintProcPath.GetLength());
- RegCloseKey(sub);//关闭注册表
- SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);//使注册表的修改立即生效
- SHChangeNotify(SHCNE_UPDATEIMAGE,SHCNF_DWORD,NULL,NULL);
- }
复制代码3.添加一自定义函数InitCtrl()用于初始化控件 - void CGkbc8Dlg::InitCtrl()
- {
- char czPath[_MAX_PATH];
- GetModuleFileName(NULL,czPath,_MAX_PATH);
- CString sPath(czPath);
- CString sTemp=sPath+" %1";
- SetDlgItemText(IDC_EDIT1,".gkbc8");
- SetDlgItemText(IDC_EDIT2,sTemp);
- SetDlgItemText(IDC_EDIT3,sTemp);
- sPath=sPath.Left(sPath.ReverseFind('\\'));
- sPath+="\\res\\gkbc8.ico";
- SetDlgItemText(IDC_EDIT4,sPath);}
复制代码我们来演示下功能实现的整个过程
|