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

如何启用鼠标点击嵌套按钮,以及为什么嵌套的窗户不能按预期工作?

+0

*回调函数*?按钮将消息发送到父窗口,而不是某些功能 – RbMm

消息被发送到父窗口。在这种情况下,静态窗口是按钮的父窗口。所以主窗口没有收到按钮消息,除了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); 
} 
+1

STATIC控件还需要'WS_EX_CONTROLPARENT' [扩展窗口样式](https://msdn.microsoft.com/en-us/library/windows/desktop/ff700543.aspx ),以便键盘导航工作。可以说,更好的解决方案是根本不引入儿童/父母关系,并制作框架和按钮的兄弟姐妹。管理起来要容易得多,并且不会改变感知的视觉表现。 – IInspectable

+0

我试过'SetWindowLongPtr(my_panel,GWLP_WNDPROC,(LONG_PTR)DlgMain);'因为'SetWindowSubclass'没有编译。它的作品 - 但现在'my_panel'似乎是不可见的。我错过了什么? 'ShowWindow'不起作用。 – creepyman900

+0

您可能错过了标题和库。查看更新答案。 –