2017-10-28 79 views
2

我想打一個面板,該面板組按鈕本身: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

回答

2

消息被髮送到父窗口。在這種情況下,靜態窗口是按鈕的父窗口。所以主窗口沒有收到按鈕消息,除了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

您可能錯過了標題和庫。查看更新答案。 –