Win32對話方塊模板建立的視窗上響應鍵訊息,Tab焦點切換訊息,加速鍵訊息
阿新 • • 發佈:2021-10-07
今天在學習的時候,發現對話方塊上不響應鍵盤訊息,查了老半天,終於成功了,現分享出來,
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
學習後感覺是不是很簡單????????????????
簽名:GreenLeaf1976