工控编程吧
标题:
213上位机VC MFC使用快捷键
[打印本页]
作者:
qq263946146
时间:
2016-1-31 22:11
标题:
213上位机VC MFC使用快捷键
(, 下载次数: 3)
上传
点击文件名下载附件
213上位机VC MFC使用快捷键
功能展示
快捷键能够提高软件 的操作效率,比如QQ发送消息快捷键可以设置为Enter键或Ctrl+Enter键, 我们当前例程实现快捷键的使用功能,按Ctrl+A, Ctrl+S, Ctrl+D三个快捷键可以快速调用不同对话框,效果如图;
要点提示
快捷键的使用可以用函数RegisterHotKey()进行注册;
函数原型:BOOLRegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk)
参数含义:
1.hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中进行处理。
2.id:定义热键的标识符。调用线程中的其他热键,不能使用同样的标识符。应用程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个范围为0xC000-0xFFFF的值(GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。
3.fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合:
MOD_ALT
0x0001按下的可以是任一Alt键。
MOD_SHIFT
0x0004按下的可以是任一Shift键。
MOD_WIN
0x0008按下的可以是任一Windows徽标键。
MOD_NOREPEAT
0x4000更改热键行为,以便键盘自动重复不会产生多个热键通知。
MOD_CONTROL
0x0002按下的可以是任一Ctrl键。
4.vk:定义热键的虚拟键码。
数调用成功,返回一个非0值。若函数调用失败,则返回值为0。 可以调用GetLastError函数获取具体错误代码。
一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应
用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中WM_HOTKEY消 息的格式为: idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用
fuModifiers = (UINT) LOWORD(lParam); //热键的辅助按键
uVirtKey = (UINT) HIWORD(lParam); //热键的键值
在程序退出时 再调用函数UnRegisterHotKey(handle, HotKeyId); 进行注销;
实现功能
1.新建基于对话框的应用程序
2.添加三个对话资源,关联对话框类,再将三个对话框类的头文件包含到主对话框中进行热键的测试用;
3.添加三个对话框变量及三个热键ID及热键消息处理函数private:ATOM m_HotkeyID0;
ATOM m_HotkeyID1; ATOM m_HotkeyID2; void HotKey(WPARAMwParam,LPARAM lParam); CDlg1 m_Dlg1;CDlg1 m_Dlg2;CDlg1m_Dlg3; 并在主对话框初始化函数OnInitDialog()中初始化
m_HotkeyID0 = GlobalAddAtom("MyHotKey0")-0XC000;
m_HotkeyID1 = GlobalAddAtom("MyHotKey1")-0XC000;
m_HotkeyID2 = GlobalAddAtom("MyHotKey2")-0XC000;
if(!RegisterHotKey(this->m_hWnd,m_HotkeyID0,MOD_CONTROL,'A') )
MessageBox("注册热键失败");
if(!RegisterHotKey(this->m_hWnd,m_HotkeyID1,MOD_CONTROL,'S') )
MessageBox("注册热键失败");
if(!RegisterHotKey(this->m_hWnd,m_HotkeyID2,MOD_CONTROL,'D') )
MessageBox("注册热键失败");
m_Dlg1.Create(IDD_DIALOG1,this);
m_Dlg2.Create(IDD_DIALOG2,this);
m_Dlg3.Create(IDD_DIALOG3,this);
4.程序能出时注销热键
void CGkbc8Dlg::OnDestroy()
{
CDialog::OnDestroy();
::UnregisterHotKey(this->m_hWnd,m_HotkeyID0);//注销热键
::UnregisterHotKey(this->m_hWnd,m_HotkeyID1);
::UnregisterHotKey(this->m_hWnd,m_HotkeyID2);
}
复制代码
5。热键的处理函数为void CGkbc8Dlg::HotKey(WPARAM wParam,LPARAM lParam)
{
if(m_HotkeyID0 == (int)wParam)
{
m_Dlg1.SetWindowPos(&wndTop,300,300,400,400,SWP_NOSIZE);
m_Dlg1.ShowWindow(SW_SHOW);
m_Dlg2.ShowWindow(SW_HIDE);
m_Dlg3.ShowWindow(SW_HIDE);
}
if(m_HotkeyID1 == (int)wParam)
{
m_Dlg2.SetWindowPos(&wndTop,600,300,400,400,SWP_NOSIZE);
m_Dlg2.ShowWindow(SW_SHOW);
m_Dlg1.ShowWindow(SW_HIDE);
m_Dlg3.ShowWindow(SW_HIDE);
}
if(m_HotkeyID2 == (int)wParam)
{
m_Dlg3.SetWindowPos(&wndTop,900,300,400,400,SWP_NOSIZE);
m_Dlg3.ShowWindow(SW_SHOW);
m_Dlg1.ShowWindow(SW_HIDE);
m_Dlg2.ShowWindow(SW_HIDE);
}
}
复制代码
记得将热键的处理函数与消息WM_HOTKEY进行映射关联,这样用户按下热键时我们的热键处理函数才会被调用
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4