Dlaczego BeginPaint zwraca inną strukturę RECT, niż ta co jest ustawiona w InvalidateRect?

0

Procedura okna:

LRESULT CALLBACK ProceduraOkna(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc = 0;
    PAINTSTRUCT ps = {0};
    RECT pole = { 0 };
 
    pole.left = 1;
    pole.top = 1;
    pole.right = 200;
    pole.bottom = 200;
 
    switch (message)
    {
    case WM_CREATE:
        MessageBox(0, "Zaraz Wyświetle Okno!! Okno zostaje własnie utworzone", "informacja", MB_OK | MB_ICONINFORMATION);
        return 0;
    case WM_PAINT:
    {
                     InvalidateRect(hwnd, &pole, TRUE);
                     hdc = BeginPaint(hwnd, &ps);
 
                     std::cout << "Pozycja bottom: " << ps.rcPaint.bottom << std::endl;
                     WyswietlTekst(hdc, ps.rcPaint);
                     EndPaint(hwnd, &ps);
                     return 0;
    }
    case WM_CLOSE:
        if (IDYES == MessageBox(hwnd, "Czy na pewno zamknąć okno??", "Informacja", MB_YESNO | MB_ICONQUESTION))
            return DefWindowProc(hwnd, message, wParam, lParam);
        else
            return 0;
    case WM_DESTROY:
        MessageBox(0, "Koniec Programu Okno zostaje zniszczone!!", "Informacja", MB_OK | MB_ICONINFORMATION);
        PostQuitMessage(0);
        return 0;
    }
 
    return DefWindowProc(hwnd, message, wParam, lParam);
}

i teraz tak jak podaje w funkcji InvalidateRect strukturę RECT wypełnioną własnymi współrzędnymi , a funkcja BeginPaint zwraca w Pointstruct jakąś inną wartość, dlaczego?? tak ma być?? z tego co wyczytałem begin paint powinno my malować według tego co podam w invaliddatarect

Teraz np bottom ma 261, ja podałem 200 w invaliddatarect, a samo okno ma większe wymiary, więc skąd ta wartość??

Zauważyłem że ta funkcja nie jest mi potrzebna.
Mogę ją usunąć, i wyjdzie to samo

odpowiedź użytkownika kAzek

Mogę się mylić ale wydaje mi się że skoro wywołujesz InvalidateRect w obsłudze komunikatu WM_PAINT a 2 komunikaty nie mogą przecież być jednocześnie obsługiwane musisz czekać na WM_ERASEBKGND (komunikat prawdopodobnie wtedy jest wysyłany z tym że nie wiem czy zawsze jest wysyłany czy zależy od
0

Nie spodziewaj się że będzie ten sam RECT.
InvalidateRect określa, który prostokąt trzeba odrysować. Windows może mieć inny pomysł w danej chwili, np. że trzeba odrysować więcej, albo nawet całe okno z jakiegoś powodu. Wtedy ten twój RECT straci znaczenie.

0

czyli jeśli chce aby to był mój RECT, to powinienem zmienić go w PAINTSTRUCT na własny??

1 użytkowników online, w tym zalogowanych: 0, gości: 1