2009-10-13 4 views
1

자식 창 내부를 그리는 방법은 무엇입니까?Win32 WM_PAINT 및 자식 창

CreateWindow(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN)WndProc (WM_PAINT 제외)과 함께 주 창을 만들어야한다고 생각했습니다. 그 WM_CREATEWM_PAINT에 반응하는 다른 WndProc2과 함께 또 다른 창 CreateWindow(WS_CHILD | WS_CLIPCHILDREN)을 만듭니다. 그러나 다른 처리기가 무한 루프에 들어간 것으로 보입니다. 나는 무엇을 잘못 했는가?

제발, 조언이나 시험이 있으십니까?

PS : WS_CLIPCHILDREN이 영향을 미칠 것으로 보인다 및 DefWindowProc

WndProc 기본적으로 모두하지 않는 코드 :


LRESULT CALLBACK Proc2(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(msg) 
    { 
     case WM_CREATE: 
      printf("-------\n"); 
      return 0; 
     case WM_PAINT: 
      printf("-"); 
      return 0; 

     default: 
      return DefWindowProc(hWnd, msg, wParam, lParam); 
    } 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
... 
case WM_CREATE: 
    CreateWindowClass(hInstance, Proc2, "Window2"); 
    w2 = CreateWindowEx(WS_EX_STATICEDGE, "Window2", "Win", WS_CHILD | WS_CLIPCHILDREN, 0, 0, 100, 100, hWnd, NULL, hInstance, NULL); 


void createWindowClass(HINSTANCE hInstance, WNDPROC WndProc, LPCSTR lpszClassName) 
{ 
    WNDCLASSEX wc; 
    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = 0; 
    wc.lpfnWndProc = WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
    wc.lpszMenuName = "test"; 
    wc.lpszClassName = lpszClassName; 
    RegisterClassEx(&wc); 
} 

int WINAPI WinMain 
... 
createWindowClass(hInstance, WndProc, "MainWindow"); 
w = CreateWindow("MainWindow", "Main", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); 


+0

WM_PAINT 처리를 수행 한 후 0을 반환합니까? 그 너머에 ... wndprocs와 Create와 RegisterClass 호출을 보여주세요. – Goz

답변

5

유효성을 검사하기 위해 WM_PAINT 메시지에 대한 응답으로 BeginPaint 함수와 EndPaint를 호출한다 창. 그렇지 않으면, 시스템은 윈도우가 페인트되지 않았다고 생각하여 페인트 메시지를 다시 보내 게됩니다. Microsoft documentation.