2017-10-28 22 views
2

클릭 할 수 없습니다 :WinAPI를 - 버튼이있는 그룹 버튼 자체에서 나는 패널을 만들고 싶어

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 
); 

것은 내가 버튼을 클릭

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 
); 

가 그럼 난이 패널에 단추를 추가 콜백 함수에 WM_COMMAND을 보내지 않고 WM_PARENTNOTIFY을 전송합니다. 그런 다음 Enter 키를 누르면 작동합니다 - WM_COMMAND이 버튼으로 전송됩니다.

중첩 단추를 마우스로 클릭하는 방법과 중첩 된 창이 예상대로 작동하지 않는 이유는 무엇입니까?

+0

*이 기능을 콜백 * 다음 BN_CLICKED 알림 BUTTON_ID

주, SetWindowSubclass 요구 추가 헤더와 라이브러리를 운반? 버튼은 어떤 함수가 아닌 부모 윈도우에 메시지를 보낸다. – 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로 전송됩니다.

#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

정적 컨트롤은 WS_EX_CONTROLPARENT' [확장 윈도우 스타일] (https://msdn.microsoft.com/en-us/library/windows/desktop/ff700543.aspx)도 필요하다. 키보드 탐색 기능이 작동합니다. 아마 더 나은 해결책은 자식/부모 관계를 전혀 도입하지 않고 프레임과 버튼 형제를 만드는 것입니다. 관리하기가 훨씬 쉬우 며 인식 된 시각적 표현을 변경하지 않습니다. – IInspectable

+0

'SetWindowSubclass'가 컴파일되지 않았으므로 SetWindowLongPtr (my_panel, GWLP_WNDPROC, (LONG_PTR) DlgMain);을 시도했습니다. 그것은 작동하지만 - 이제는'my_panel'이 보이지 않는 것 같습니다. 내가 뭐 놓친 거 없니? 'ShowWindow'는 효과가 없습니다. – creepyman900

+0

헤더 및 lib가 누락 된 것 같습니다. 업데이트 대답을 참조하십시오. –