2009-11-10 4 views
3

HI 하나 이상의 창을 포함하는 Win32 환경에서 응용 프로그램을 만들려고합니다. 어떻게하면됩니까? 웹에서 발견 된 모든 Win32 자습서에서는 하나의 창을 관리하는 방법 만 보여주었습니다. 어떻게 두 번째 창을 만들고 두 가지 메시지를 함께 처리합니까? (나는 하나의 메시지 루프 만 있어야 함을 알고 있음)여러 창 처리하기 WIN32 API

Thankslot!

답변

1

그러면 하위 창을 만들 예정입니까? 어떤 종류의 창을 만들지 결정해야합니다. 두 가지 유형의 모달 (대화 상자라고도 함)과 모덜리스가 있습니다.

그냥 CreateDialog, 대화 상자 및 CreateWindow 함수 기능 당신은 모덜리스 창을 메인 윈도우와 동일한의 WndProc를 사용하는 동안 당신을 위해 새로운 모달 창을의 WndProc를 제공해야

를 찾습니다. 내가 뭔가를 착각 한 경우

죄송합니다, 아주 오래 전에 나는 원시 WinAPI를 프로그래밍 ..

+0

안녕하세요, 빠른 답장을 보내 주셔서 감사합니다. 당신이 창문을 자식 창으로 말했을 때 나는 추가했다. - 그러나 나는 WndProc가 부모 창 HWND로 한 번만 호출된다는 것을 알았다. 나의 이상은 WndProc가 두 번 호출되어서 어떤 HWND를 처리하는지 알기위한 스위치가 있어야했을 것이다. 이것이 가능합니까? 자체 Wndproc가있는 다른 창을 만들어야합니까? Thanksalot – dan

6

귀하의 메시지 루프를 가져, 그리고 됐어요 파견, 현재 스레드에서 만든 모든 창에 대한 메시지.

이와 같은 간단한 메시지 루프이면 충분합니다.

MSG msg; 
while(GetMessage(&msg,0,0,0,0)>0) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

그렇지 않으면 스레드에서 창을 만들려면 원하는대로 자주 CreateWindow (...)를 호출하고 UI를 작성해야합니다.

경고 : 많은 간단한 프로그램에서 볼 수있는 일반적인 패턴은 WindowProc에서 WM_DESTROY을 처리하여 PostQuitMessage()를 호출하는 것입니다. PostQuitMessage()는 메시지 루프를 끝내라고 알리는 메시지를 스레드에 게시합니다. 이것은 응용 프로그램을 종료하고, 모두 스레드의 창을 파괴합니다. 닫혀있는 경우 응용 프로그램을 종료해야하는 주 응용 프로그램 창이있는 경우 해당 창만 PostQuitMessage를 호출해야합니다. 임의의 순서로 닫을 수있는 창이 두 개 이상있는 경우 열려있는 창의 수를 유지하고 사용자가 마지막 창을 닫은 경우에만 PostQuitMessage를 호출해야합니다.

실제로 대화 상자를 보여주는 샘플 프로그램은 대화 상자의 모든 컨트롤이 windowproc가있는 창이기 때문에 스레드에 많은 창을 만드는 방법을 보여줍니다.

많은 새로운 윈도우 개발자는 특정 윈도우 메시지를 필터링하려고의 함정에 빠지지 : 그것은 그들의 메시지를 받고 자식 윈도우를 방지로

while(GetMessage(&msg,hwnd,0,0,0)... 

이것은 잘못된 것입니다. utilitie 라이브러리를 많이 사용하면 스레드에 숨겨진 창을 만들고 다른 프로세스/스레드에서 메시지를 수신 할 때 사용합니다. 응용 프로그램 창의 메시지 만 필터링하면 메시지 큐가 커지고 다른 것들은 이상한 방법으로 실패합니다 . 특정 창에 대한 메시지를 잠시 동안 필터링해야하는 이유를 정확히 이해할 때까지 hwnd에 NULL을 전달하십시오.