• 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
  • 相关阅读:
    Linux中应用程序如何使用系统调用syscall
    Spring Service、Dao进行Junit单元测试
    spring service层单元测试
    java-随机生成用户名(中文版及英文版)
    Java获取随机数
    JUnit单元测试框架的使用
    Mock以及Mockito的使用
    Spring Boot 各Starter介绍
    编写自己的SpringBoot-starter
    Spring Boot使用单元测试
  • 原文地址:https://www.cnblogs.com/greenleaf1976/p/15376695.html
Copyright © 2020-2023  润新知