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

 

 

学习后感觉是不是很简单????????????????

 

Tags: