246上位机VC MFC组合快捷键获取与设置
246上位机VC MFC组合快捷键获取与设置 功能展示 在我们开发的程序中,有时为了快速的执行常用的功能我们会设置一些组合键进行快速执行功能,当前例程实现有组合键的设置与用户使用组合键时的截获功能,按SHIFT+Q或W,可以快捷的执行两个按钮的功能。另外我们按键盘上CTRL+INSERT或DELETE等等一些组合键,例程会截获并显示出来,效果如图,组合组合键有很多,我们开发程序时,可根据自己功能需要,截获自己的想要的组合键; 要点提示 组合键也就是快捷键,我们前面例程介绍了快捷键的注册与使用,当前例程我也再介绍另一方法: 通过新建一个加速键表ACCELERATOR,在此表文件内设置组合键,通过LoadAccelerators()加载此文件,再通过 函数TranslateAccelerator()转换已加载的文件句柄就可以使在文件内设置的组合键生效; 1.LoadAccelerators 函数原型: HACCEL LoadAccelerators(HINSTANCEhlnstance,LPCTSTR lpTableName); 函数参数说明: hlnstance:模块的一个实例的句柄,该模块的可执行文件中包含将要调入的加速键表。 IpTableName:指向一个以空结尾的字符串的指针,该字符串包含了即将调入的加速键表的名字。另一种可选的方案是,该参数可以在加速键表资源的低位字中指定资源标识符,而高位字中全零。MADEINTRESOURCE宏可被用于创建该值。 返回值:若函数调用成功,则返回所加载的加速键表句柄。若函数调用失败,则返回值为NULL。可以调用GetLastError函数获取具体错误代码信息。 2.TranslateAccelerator函数原型: int TranslateAccelerator(HWNDhWnd,HACCEL hAccTable,LPMSG IpMsg); hWnd:窗口句柄,该窗口的消息将被翻译。 函数参数说明: hAccTable:加速键表句柄。加速键表必须由LoadAccelerators函数调用装入或由CreateAccd_eratorTable函数调用创建。 LpMsg:MSG结构指针,MSG结构中包含了从使用GetMessage或PeekMessage函数调用线程消息队列中得到的 消息内容。 返回值:若函数调用成功,则返回非零值;若函数调用失败,则返回值为零。若要获得更多的错误信息,可调用GetLastError函数。 3.另外判断键盘系统按键如SHIFT,CTRL等是否按下可以用函数GetKeyState()获得;此函数跟一个虚拟键参数如GetKeyState(VK_CONTROL),判断CTRL虚拟的状态,返回值给出了给定虚拟键的状态,状态如下: 若高序位为1,则键处于DOWN状态,否则为UP状态,如 BOOLbCtrl=::GetKeyState(VK_CONTROL)&0x8000; bCtrl值为真表示CTRL键按下,反之就没按下 实现功能 1.新建基于对话框的应用程序 2.拖拽一编辑框ID为IDC_EDIT1,再添加两按钮<快捷键SHIFT+Q ><快捷键SHIFT+W >两按钮ID分别为IDC_BUTTON1,IDC_BUTTON2,再关联函数: - void CGkbc8Dlg::OnButton2()
- {
- SetDlgItemText(IDC_EDIT1,"响应快捷键 SHIFT+Q");
- }
- void CGkbc8Dlg::OnButton1()
- {
- SetDlgItemText(IDC_EDIT1,"响应快捷键 SHIFT+W");
- }
复制代码3.插入一加速键表ID为IDR_ACCELERATOR1,在表内添加些组合键,如当前例程添加了SHIFT+Q,SHIFT+W与按钮函数关联的组合键; 4.添加对话框变量HACCEL m_Accelerator;,并初始化加载回事键表 m_Accelerator=:oadAccelerators(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1)); 5.添加对话框PreTranslateMessage()函数,在函数体内实现加速键表的转换与键盘组合键的截获 - BOOL CGkbc8Dlg::PreTranslateMessage(MSG* pMsg)
- {
- if(pMsg->message==WM_KEYDOWN)
- {
- CString sText;
- BOOL bCtrl=::GetKeyState(VK_CONTROL)&0x8000;
- BOOL bShift=::GetKeyState(VK_SHIFT)&0x8000;
- BOOL bAlt=::GetKeyState(VK_MENU)&0x8000;
- switch(pMsg->wParam)
- {
- case VK_DELETE:
- if(bCtrl&&bAlt&&bShift)
- sText="你按下的是Ctrl+Shift+Alt+Delete组合键";
- else if(bCtrl&&bShift)
- sText="你按下的是Ctrl+Shift+Delete组合键";
- else if(bCtrl)
- sText="你按下的是Ctrl+Delete组合键";
- SetDlgItemText(IDC_EDIT1,sText);
- return TRUE;
- case VK_INSERT:
- if(bCtrl&&bAlt&&bShift)
- sText="你按下的是Ctrl+Shift+Alt+Insert组合键";
- else if(bCtrl&&bAlt)
- sText="你按下的是Ctrl+Alt+Insert组合键";
- else if(bCtrl)
- sText="你按下的是Ctrl+Insert组合键";
- SetDlgItemText(IDC_EDIT1,sText);
- return TRUE;
- }
- if(bCtrl||bAlt||bShift)//有系统键按下,响应快捷键
- {
- TranslateAccelerator(this->m_hWnd,m_Accelerator,pMsg);
- return TRUE;
- }
- }
- return CDialog::PreTranslateMessage(pMsg);
- }
复制代码我们来演示下功能实现的整个过程
|