我有一个C++中的Window窗体应用程序
我添加了一个新按钮,并将其链接到一个名为ChangeTitle
的函数。
但当我运行应用程序并按下按钮时,它不会调用函数
我检查了一下,注意到当我单击按钮并检查按钮的窗口ID(wmId
(时,我将其设置为110
(IDM_CHANGE_TITLE
(,其值为1
。
我不确定是什么问题,也许是与资源文件有关?
再现:
打开Visual Studio并创建新项目Visual C++
->Windows Desktop Application
将其设置为名称WindowsProject1
。
WindowsProject1.cpp代码
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK ChangeTitle(HWND hWnd);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDM_CHANGE_TITLE:
ChangeTitle(hWnd);
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_CREATE:
CreateWindowW(L"button", L"Change Title",
WS_VISIBLE | WS_CHILD,
20, 50, 95, 25, hWnd, (HMENU)1, (HINSTANCE)ChangeTitle(hWnd), NULL);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Message handler for about box.
INT_PTR CALLBACK ChangeTitle(HWND hWnd)
{
SetWindowText(hWnd, L"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
return TRUE;
}
Resource.h的部件代码
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by WindowsProject1.rc
#define IDM_ABOUT 104
#define IDM_CHANGE_TITLE 110
WindowsProject1.rc的部分代码
IDC_WINDOWSPROJECT1 MENU
BEGIN
BEGIN
MENUITEM "&About ...", IDM_ABOUT
END
END
IDC_WINDOWSPROJECT1 ACCELERATORS
BEGIN
"?", IDM_ABOUT, ASCII, ALT
"/", IDM_ABOUT, ASCII, ALT
END
我解决了这个问题。问题是我创建了hMenu
设置为1
的按钮控件
我将其更改为#define IDM_CHANGE_TITLE 110
,现在它可以工作了
这是固定代码:
CreateWindowW(L"button", L"Change Title",
WS_VISIBLE | WS_CHILD,
20, 50, 95, 25, hWnd, (HMENU)IDM_CHANGE_TITLE, NULL, NULL);