WIN32SDK : TranslateAccelerator参数1填错引起加速键失效

本文介绍了一个简单的Windows对话框应用程序,演示如何正确使用TranslateAccelerator函数处理加速键,并解决了一个常见问题:即加速键只在主窗口上有效。

和别人讨论问题,用CreateDialog起一个对话框,载入加速键表。
就那么随手写的demo, 发现加速键居然不好使。
对了msdn, 没发现啥问题啊。
后来发现TranslateAccelerator的参数1必须是主窗口才行, 眼大漏神啊:)

实验工程下载点

src_test_dialog_Accelerator.zip

实验

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include "resource.h"

BOOL CALLBACK DlgProcAbout(
    HWND hDlg, 
    UINT message, 
    WPARAM wParam, 
    LPARAM lParam);

HACCEL g_hAccelTable = NULL; 

int WINAPI WinMain(  
    HINSTANCE hInstance,  // handle to current instance  
    HINSTANCE hPrevInstance,  // handle to previous instance  
    LPSTR lpCmdLine,      // pointer to command line  
    int nCmdShow          // show state of window  
    )
{  
    HWND hWnd;  
    hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN), NULL, (DLGPROC)DlgProcAbout);
    if (NULL == hWnd) {  
        goto WINMAIN_END;  
    }  

    ShowWindow(hWnd, SW_SHOWNORMAL);  
    UpdateWindow(hWnd);

    MSG msg;  

    g_hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR_MY));
    if (g_hAccelTable == NULL) {
        MessageBoxA(NULL, "", "", MB_OK);
    }

    while (GetMessage(  
        &msg,         // address of structure with message  
        hWnd,           // handle of window  
        0,  // first message  
        0   // last message  
        )) {  
            // 加速键处理的关键,TranslateAccelerator的参数1是主窗口
            // 否则主窗口收不到加速键消息
            // 参数1不能是msg.hwnd
            if (!TranslateAccelerator(hWnd, g_hAccelTable, &msg)) {
                TranslateMessage(&msg);  
                DispatchMessage(&msg);  
            }
    }  

WINMAIN_END:

    return EXIT_SUCCESS;
}

BOOL CALLBACK DlgProcAbout(
    HWND hDlg, 
    UINT message, 
    WPARAM wParam, 
    LPARAM lParam)
{
    BOOL bRc = FALSE; // not process
    WORD wmId = 0;
    WORD wmEvent = 0;
    HWND hCtrlWnd = NULL;
    const DWORD dwTmpID = ID_ACCELERATOR_SETTEXT_BTN;

    // 测试加速键的流程:
    // 运行程序
    // 按F3键,按钮文字变成"change text"
    // 点击按钮, 按钮文字变成"test1"
    // 再按F3键,按钮文字变成"change text"
    // 证明了加速键F3有效
    switch (message)
    {
    case WM_INITDIALOG:
        hCtrlWnd = GetDlgItem(hDlg, IDC_STATIC_MSG);
        if (NULL != hCtrlWnd) {
            ::SetWindowText(hCtrlWnd, _T("测试加速键的流程:\n")
                _T("运行程序\n")
                _T("按F3键,按钮文字变成\"change text\"\n")
                _T("点击按钮, 按钮文字变成\"test1\"\n")
                _T("再按F3键,按钮文字变成\"change text\"\n")
                _T("证明了加速键F3有效\n"));
        }
        bRc = TRUE;  
        break;

    case WM_COMMAND:
        wmId    = LOWORD(wParam);   
        wmEvent = HIWORD(wParam); 
        if (ID_ACCELERATOR_SETTEXT_BTN == wmId) {
            hCtrlWnd = GetDlgItem(hDlg, IDC_BUTTON1);
            if (NULL != hCtrlWnd) {   
                ::SetWindowText(hCtrlWnd, _T("change text"));
            }
            bRc = TRUE;  
        } else if (IDC_BUTTON1 == wmId) {
            hCtrlWnd = GetDlgItem(hDlg, IDC_BUTTON1);
            if (NULL != hCtrlWnd) {   
                ::SetWindowText(hCtrlWnd, _T("test1"));
            }
            bRc = TRUE;  
        }

        break;

    case WM_CLOSE:  
        PostMessage(hDlg, WM_QUIT, 0, 0);
        break; 

    default:
        break;
    }

    return bRc;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值