Win32 WM_PAINT и дочернее окно - PullRequest
1 голос
/ 14 октября 2009

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

Я подумал, что мне нужно создать главное окно CreateWindow(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN) с некоторыми WndProc (без 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);


1 Ответ

5 голосов
/ 14 октября 2009

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

...