2009-11-10 3 views
0

I asked a question이되고, 어떤 사람들은 내 질문이 명확하지 않은 것으로 의견을 말했습니다. 그래서 여기에 새로운 것이 있습니다.CreateWindow() [Win32 API] : 부모 창만이

WIN32 API를 사용하여 여러 개의 창으로 응용 프로그램을 만들려고합니다. 두 개의 창을 만들었습니다. 하나는 부모의 자식입니다. 그런 다음 메시지 루프가 있습니다. 불행히도 부모 WndProc 만 메시지를 가져 오지만 자식은 그렇지 않습니다. - 은 wndProc가 두 번이 아니라 한 번만 호출됩니다. (예상되는 동작입니까?)

또한 자식 창에 대해 다른 WndProcChild 함수를 만들고 자체 클래스를 등록하려고했지만 여전히 유용하지 않습니다. 다음은

wcEdit.lpfnWndProc = WndProcChild; 
wcEdit.style   = CS_HREDRAW | CS_VREDRAW; 
wcEdit.cbClsExtra = 0; 
wcEdit.cbWndExtra = 0; 
wcEdit.hInstance  = hInstance;; 
wcEdit.hCursor  = 0; 
wcEdit.lpszMenuName = 0; 
wcEdit.lpszClassName = L"child"; 
RegisterClass(&wcEdit); 
edit_hwnd = CreateWindow(L"child", L"child_title", NULL,  
    0, 0, 0, 0, ParentWindow,  
    NULL, global_instance, NULL);  

UpdateWindow(edit_hwnd); 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

코드 추출물 (자식 윈도우의 선언, 메시지 루프)

내가 그렇게 감사합니다 ... 부드럽게,는 Win32의 안돼서입니다


그냥 달성하기를 원하는 것을 다시 설명하기 위해 - 나는 WM_KEYDOWN 메시지를 두 번 처리하려고합니다. 한 번은 부모 창에서, 한 번은 자식 창에서 처리합니다. 실제로 부모 - 자식이 될 필요는 없습니다. 두 개의 다른 wndProcs를 만들면 저를 구할 수 있다고 생각했습니다.

+0

그냥 달성하고자하는 것을 다시 설명하기 위해 - 나는 WM_KEYDOWN 메시지를 두 번 처리하려고합니다. 한 번 부모 창과 한 번 자식 창에서. 실제로 부모 - 자식이 될 필요가 없습니다. 단지 두 개의 다른 wndProcs를 만드는 데 도움이 될 것이라고 생각했습니다. – dan

+3

새로운 질문을 게시하는 대신 방금 원래 게시물을 편집해야합니다. – Aaron

답변

1

WM_KEYDOWN 메시지가 두 번 나올 것으로 예상됩니다. 그런 일은 일어나지 않을 것입니다. 키 포커스가있는 창만 WM_KEYDOWN 메시지를 받게됩니다.

+0

부모 메시지/자식 메시지 창을 연쇄 메시지 처리로 가져올 수 있습니다. 재귀 이벤트 처리에주의해야합니다. –

+0

SetFocus를 사용하여 키보드 포커스를 가져올 창을 설정할 수 있습니다. 편집 상자와 같은 표준 컨트롤은 자신 주위에 포커스 사각형을 그리고 키보드 입력을받을 창 *임을 나타내는 캐럿을 표시합니다. –

0

상속 창에는 상위와 소유자의 두 가지 특성이 있습니다. OS/2에서 이것은 별도의 속성 이었지만 Win32에서는 하나로 결합되었습니다. 이 체크 아웃 SO thread :

0

Windows에서이 방법을 직접 구현할 수 없으므로이 문제를 해결하기 위해 후크 또는 유사한 방법을 시도 할 수 있습니다. 기본적으로, 당신은 다른 윈도우를 소유하고있는 스레드에서 키 다운 이벤트를 모니터하고 인터셉트해야합니다. 나는 SetWinEventHook 함수로 시작할 것입니다.