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
由按钮发送。
如何启用鼠标点击嵌套按钮,为什么嵌套 windows 不能按预期工作?
消息已发送给父 window。在这种情况下,静态 windows 是按钮的父级。所以主要 window 没有收到按钮消息,除了 WM_PARENTNOTIFY
.
您可以子类化静态 window:
SetWindowSubclass(my_panel, ChildProc, 0, 0);
定义一个ChildProc
来捕捉按钮消息。另见 Subclassing Controls
该按钮还需要如下标识符:
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);
}
我想做一个面板,它自己对按钮进行分组:
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
由按钮发送。
如何启用鼠标点击嵌套按钮,为什么嵌套 windows 不能按预期工作?
消息已发送给父 window。在这种情况下,静态 windows 是按钮的父级。所以主要 window 没有收到按钮消息,除了 WM_PARENTNOTIFY
.
您可以子类化静态 window:
SetWindowSubclass(my_panel, ChildProc, 0, 0);
定义一个ChildProc
来捕捉按钮消息。另见 Subclassing Controls
该按钮还需要如下标识符:
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);
}