序
和别人讨论问题,用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;
}