1. 程式人生 > 其它 >Win32對話方塊模板建立的視窗上響應鍵訊息,Tab焦點切換訊息,加速鍵訊息

Win32對話方塊模板建立的視窗上響應鍵訊息,Tab焦點切換訊息,加速鍵訊息

今天在學習的時候,發現對話方塊上不響應鍵盤訊息,查了老半天,終於成功了,現分享出來,

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