引自免费微信小程序:皆我百晓生
在您的代码中,您已经定义了一个菜单资源(IDR_MENU1)并在主窗口类("MainWClass")中设置了窗口过程(MainWinProc)。但是,在这个窗口过程中,并没有处理菜单消息,因此当用户点击菜单项时不会有任何反应。
为了解决这个问题,您需要在MainWinProc中添加对WM_COMMAND消息的处理。当用户选择菜单项时,系统会发送一个WM_COMMAND消息到窗口过程。下面是如何修改MainWinProc来处理菜单命令:
首先,更新MainWinProc函数,加入对WM_COMMAND消息的处理:
LRESULT CALLBACK MainWinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
// 在这里创建子窗口
break;
case WM_COMMAND:
{
int idCtrl = LOWORD(wParam); // 控件ID
int notificationCode = HIWORD(wParam); // 消息代码
HWND hWndCtrl = reinterpret_cast(lParam); // 控件句柄
switch (idCtrl)
{
case IDM_TYPE: // 文件->类型
// 处理"类型"菜单项
break;
case IDM_START: // 文件->开始
// 处理"开始"菜单项
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE)
{
int nRet = MessageBox(hwnd, "是否关闭", "infe", MB_YESNO);
if (nRet == IDYES)
{
DestroyWindow(hwnd);
}
else
{
return 0;
}
}
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
接下来,为了实现具体的菜单功能,你需要在相应的case分支中编写代码。例如,如果你想要在点击“类型”菜单项时显示一条消息框,可以这样写:
case IDM_TYPE:
MessageBox(hwnd, "选择了类型菜单项", "提示", MB_OK);
break;
对于“开始”菜单项,你可以根据实际需求进行类似的操作。
注意:在这个例子中,我假设你已经在WinMain函数中正确地加载了菜单资源。确保你在创建主窗口时将菜单句柄传递给CreateWindowEx函数,就像这样:
hwnd = CreateWindowEx(
0,
"MainWClass", "window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
544,
375,
HWND_DESKTOP,
LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)), // 菜单句柄
hInstance, /* Program Instance handler */
NULL
);
经过这些修改,你应该能在点击菜单项时看到预期的行为。记得重新编译并运行你的程序。
