2009-10-13 8 views
1

Как нарисовать внутри дочернего окна?Win32 WM_PAINT и дочернее окно

Я думал, что должен создать главное окно CreateWindow(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN) с некоторыми (без WM_PAINT). На своем WM_CREATE я создаю другое окно CreateWindow(WS_CHILD | WS_CLIPCHILDREN) с другим WndProc2, которое реагирует на WM_PAINT. Однако кажется, что другой обработчик входит в бесконечный цикл. Что я делаю неправильно?

У вас нет совета или экзамена?

PS: WS_CLIPCHILDREN, кажется, не влияет на это, и оба WndProc по умолчанию DefWindowProc

Код:


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

Вы возвращаете 0 после выполнения обработки WM_PAINT? Помимо этого ... покажите нам свои wndprocs и ваши вызовы Create и your RegisterClass. – Goz

ответ

5

Вы должны называть BeginPaint и EndPaint в ответ на сообщение WM_PAINT для проверки окно. В противном случае система думает, что ваше окно не было нарисовано, и поэтому оно снова отправит сообщение с краской (и снова). См. Microsoft documentation.