如何接收CreateWindow()创建的按钮向父窗口发送的消息?
手动创建Win32按钮的消息处理问题
你使用以下代码创建了按钮:
HWND hwndButton = CreateWindow( "BUTTON", // Predefined class; "Options", // Button text WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles 250, // x position 0, // y position 50, // Button width 30, // Button height hwnd, // Parent window NULL, // No menu. (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL);
你提到可视化创建对话框按钮时,可通过父窗口过程的WM_COMMAND消息+控件ID(如IDC_BUTTON)来处理按钮事件,但手动创建时没有预设的控件ID,想知道按钮按下时发送的消息。
解答
手动创建的按钮按下时,同样会向父窗口发送WM_COMMAND消息,核心是你需要给按钮指定自定义控件ID:
- 设置控件ID:
CreateWindow的第7个参数(hMenu)对于子控件来说实际是控件ID,你之前传的是NULL,可以替换成自定义的数值(建议选1000以上,避免和系统预设ID冲突):
// 先定义自定义控件ID #define IDC_OPTIONS_BUTTON 1001 HWND hwndButton = CreateWindow( "BUTTON", "Options", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, 250, 0, 50, 30, hwnd, (HMENU)IDC_OPTIONS_BUTTON, // 这里传入自定义控件ID (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL);
- 处理WM_COMMAND消息:在父窗口的窗口过程中,通过
LOWORD(wParam)获取控件ID,结合通知码判断按钮事件:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_COMMAND: // LOWORD(wParam) 是控件ID,HIWORD(wParam) 是通知码(BN_CLICKED表示按钮被点击) if(LOWORD(wParam) == IDC_OPTIONS_BUTTON && HIWORD(wParam) == BN_CLICKED) { // 这里写按钮按下后的处理逻辑 MessageBox(hwnd, "Options按钮被按下", "提示", MB_OK); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }
额外说明:因为你给按钮设置了BS_DEFPUSHBUTTON样式,用户按下回车键时,也会触发这个按钮的WM_COMMAND消息。
内容的提问来源于stack exchange,提问作者bugger
相关产品推荐
相关产品推荐

