WinAPI - 按钮无法单击
WinAPI - button cannot be clicked
我想做一个面板,它自己对按钮进行分组:
HWND my_panel = CreateWindow(
"STATIC",
"",
WS_VISIBLE | WS_CHILD | WS_BORDER,
30,
100,
300,
300,
main_window, // main dialog
NULL,
( HINSTANCE ) GetWindowLong( main_window, GWL_HINSTANCE ),
NULL
);
然后我在此面板上添加一个按钮:
HWND button_in_a_group = CreateWindow(
"BUTTON",
"Hello world",
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
20,
20,
50,
50,
my_panel, // as a child for above
NULL,
( HINSTANCE ) GetWindowLong( main_window, GWL_HINSTANCE ),
NULL
);
当我单击该按钮时,它不会发送WM_COMMAND
而是WM_PARENTNOTIFY
回调函数。然后,如果我按 Enter 键,它可以工作 - WM_COMMAND
由按钮发送。
如何在嵌套按钮上启用鼠标单击,为什么嵌套窗口无法按预期工作?
消息被发送到父窗口。在这种情况下,静态窗口是按钮的父级。因此,主窗口不接收按钮消息,除了WM_PARENTNOTIFY
。
您可以对静态窗口进行子类化:
SetWindowSubclass(my_panel, ChildProc, 0, 0);
定义用于捕获按钮消息的ChildProc
。另请参阅子类化控件
该按钮还需要标识符,如下所示:
CreateWindow("BUTTON", "Hello world", ... my_panel, HMENU(BUTTON_ID) ...);
单击按钮时WM_COMMAND
消息将发送给ChildProc
。BN_CLICKED
通知带有BUTTON_ID
注意,SetWindowSubclass
需要额外的标头和库:
#include <CommCtrl.h>
#pragma comment(lib, "Comctl32.lib") //Visual Studio option for adding libraries
...
LRESULT CALLBACK ChildProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam, UINT_PTR, DWORD_PTR)
{
switch(msg) {
case WM_COMMAND:
switch(LOWORD(wParam)) {
case BUTTON_ID:
MessageBox(0, "hello world", 0, 0);
break;
}
break;
case WM_NCDESTROY:
RemoveWindowSubclass(hwnd, ChildProc, 0);
break;
}
return DefSubclassProc(hwnd, msg, wParam, lParam);
}
相关文章:
- ImGui 在单击按钮后冻结
- 如何在单击按钮FLTK的确切时刻获得小部件的值
- 如何使linedit准备好在单击按钮时键入
- 如何通过单击按钮在QTextEdit中显示文本?
- 通过单击按钮更改标签 GTK C.
- Qt在单击按钮时调用Child-Window
- 如何使 UI 对象仅在单击按钮后显示在对话框中
- Qt C++单击按钮的事件
- 如何使用C++禁用窗口上的右键单击按钮
- 事件仅在单击按钮时检查
- 右键单击按钮GTKMM-3.0的信号
- 如何通过单击按钮在窗口上生成对象
- 单击按钮后,如何在QT中更改窗口中的信息
- 单击按钮时控制qt中的循环
- 尝试在单击按钮时捕获编辑框中的文本,然后显示到另一个编辑框
- 单击按钮时,全局变量包含垃圾
- 单击按钮后对QML矩形的颜色设置动画
- 正在检测何时单击按钮?[C++,WinAPI]
- 单击按钮时显示另一个 UI 文件
- 如果我单击按钮,则在 MFC 中调用函数