WinAPI的 - 按钮不能点击
我想打一个面板,该面板组按钮本身:WinAPI的 - 按钮不能点击
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
赶上按钮的消息。也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);
}
STATIC控件还需要'WS_EX_CONTROLPARENT' [扩展窗口样式](https://msdn.microsoft.com/en-us/library/windows/desktop/ff700543.aspx ),以便键盘导航工作。可以说,更好的解决方案是根本不引入儿童/父母关系,并制作框架和按钮的兄弟姐妹。管理起来要容易得多,并且不会改变感知的视觉表现。 – IInspectable
我试过'SetWindowLongPtr(my_panel,GWLP_WNDPROC,(LONG_PTR)DlgMain);'因为'SetWindowSubclass'没有编译。它的作品 - 但现在'my_panel'似乎是不可见的。我错过了什么? 'ShowWindow'不起作用。 – creepyman900
您可能错过了标题和库。查看更新答案。 –
*回调函数*?按钮将消息发送到父窗口,而不是某些功能 – RbMm