今天在学习的时候,发现对话框上不响应键盘消息,查了老半天,终于成功了,现分享出来,
1,首先要在消息循环的时候加如下代码.
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { MyDialog *pDlg = new MyDialog(); HWND hWnd=pDlg->QCreateDlg(hInstance, IDD_DIALOG1, NULL); pDlg->QShowWindow(); pDlg->QUpdateWindow(); HACCEL hAccel = NULL; //加速键句柄,如果要用就加载资源中的加速键 //消息循环 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if (!pDlg->PreTranslateMessage(&msg))//捕获所有消息 { //判断是否是加速键消息和是否是对话框消息 if (!TranslateAccelerator(hWnd, hAccel, &msg) && //捕获加速键消息 !IsDialogMessage(hWnd, &msg)) //响应Tab键消息 { TranslateMessage(&msg); DispatchMessage(&msg); } } } delete pDlg; return 0; }
2.响应WM_KEYDOWN消息
BOOL MyDialog::PreTranslateMessage(MSG* pMsg) { if ((pMsg->hwnd == m_hWnd) || ::IsChild(m_hWnd, pMsg->hwnd)) { // 如果消息是 WM_KEYDOWN ,我们就弹出一个消息框。 sunxin if (pMsg->message == WM_KEYDOWN && pMsg->wParam==VK_RETURN) { HWND hChild=GetFocus(); //获得当前有焦点的控件句柄 if (hChild != NULL) { if (GetDlgCtrlID(hChild) == IDOK) { OnIDOK(hChild); } } //获得下一个有Tab索引的控件句柄 //(父窗口句柄,当前有焦点的句柄,FALSE为向下查找,TRUE为向上) hChild = GetNextDlgTabItem(m_hWnd,hChild,FALSE); if (hChild2) { SetFocus(hChild); //设置找到的控件为焦点 return TRUE; } } } return FALSE; }
3.响应加速键消息
在前面添加加速键句柄的时候加载资源中的加速键ID
HACCEL hAccel = LoadAccelerators(m_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));//添加资源中的加速键
其实加速键就是在菜单点击事件消息的时候发送的WM_COMMAND消息中
LRESULT MyDialog::OnCommand(UINT CtrlId, UINT CtrlEvent, HWND hCtrlWnd) { //普通按钮消息 if (CtrlId == IDOK) return OnIDOK(hCtrlWnd); //加速键消息 if (CtrlId == IDOK && CtrlEvent == 1) return OnIDOK(hCtrlWnd); //就这么点区别 return QDialogEx::OnCommand(CtrlId, CtrlEvent, hCtrlWnd); }
WM_COMMAND 消息说明:
声明:
#define WM_COMMAND 0x0111
参数:
wParam
1,菜单 (HIWORD)wParam=0,(LOWORD)wParam=菜单id
2,加速键(HIWORD)wParam=1,(LOWORD)wParam=加速键id
3,控件 (HIWORD)wParam=通知id,(LOWORD)wParam=控件id
lParam
1,菜单=0
2,加速键=0;
3,控件=HWND
返回值
LRESULT
学习后感觉是不是很简单????????????????