strax
strax

Reputation: 303

Why Drawtext is still drawing text when I haven`t validated my RECT?

I am replacing BeginPaint-EndPaint in a simple window with GetDC-ReleaseDC. I am reading Charles Petzold Programming Windows 5th Edition.

Here is my code with the changes and the lines changed as comments:

#include<Windows.h>
#include<mmsystem.h>



LRESULT CALLBACK myWndProc(HWND windowHandle, UINT winMessage, WPARAM wParam, LPARAM lParam);

int 
WINAPI 
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    WNDCLASSEX myWndClass;
    MSG msg;
    HWND myWndHandle;

    wchar_t szmyWndClassName[] = TEXT("SotoWindClass");
    wchar_t szmyWndowName[] = TEXT("SotoWindow");

    myWndClass.cbClsExtra = 0;
    myWndClass.cbSize = sizeof(WNDCLASSEX);
    myWndClass.cbWndExtra = 0;
    myWndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    myWndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    myWndClass.hIcon = LoadIcon(NULL, IDI_HAND);
    myWndClass.hIconSm = NULL;
    myWndClass.hInstance = hInstance;
    myWndClass.lpfnWndProc = myWndProc;
    myWndClass.lpszClassName = szmyWndClassName;
    myWndClass.lpszMenuName = NULL;
    myWndClass.style = CS_HREDRAW | CS_VREDRAW;

    if (!RegisterClassEx(&myWndClass))
    {
        MessageBoxEx(NULL, TEXT("I need at least WINNT"), szmyWndClassName, MB_ICONERROR, 0);
    }


    myWndHandle = CreateWindowEx(
        WS_EX_LEFT,
        szmyWndClassName,
        szmyWndowName,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);

    ShowWindow(myWndHandle, iCmdShow);
    UpdateWindow(myWndHandle);

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

    return msg.wParam;
}

LRESULT CALLBACK myWndProc(HWND windowHandle, UINT winMessage, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    //PAINTSTRUCT ps;
    RECT rc;

    wchar_t displayText[] = TEXT("Display My Text!!!!");

    switch (winMessage)
    {
        case WM_CREATE:
        {
            PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
            return(0);
        }break;

        case WM_PAINT:
        {
            /*
            hdc = BeginPaint(WindowHandle, &ps);
            DrawText(hdc, TEXT("Hello Win 7!!!"), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            EndPaint(WindowHandle, &ps);
            return(0);
            */

            hdc = GetDC(windowHandle);
            GetClientRect(windowHandle, &rc);
            //ValidateRect(windowHandle, &rc);
            DrawText(hdc, displayText, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            ReleaseDC(windowHandle, hdc);
            return(0);
        }

        case WM_DESTROY:
        {
            PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC);
            PostQuitMessage(0);
            return(0);
        }
    }

    return(DefWindowProc(windowHandle, winMessage, wParam, lParam));
}

My question is: Why DrawText is still displaying the message when i haven't called ValidateRect? From what i understand(which is obviously incorrect) the text inside RECT rc shouldn't appear, unless I call ValidateRect. When the window is displayed the text drawn is flickering which i assume happens because Windows are calling WM_PAINT and are trying to validate rc (my client area) but DrawText still manages to display the text line every time. I am a bit confused.

FLICKERING TEXT

Upvotes: 0

Views: 155

Answers (1)

user3386109
user3386109

Reputation: 34829

Your text is rendered again and again, because you haven't called ValidateRect. EndPaint calls ValidateRect to mark the area rendered during this paint cycle as valid, i.e. doesn't need rendering.

Leaving an area marked as invalid doesn't stop you drawing to it, it just means the system won't think you have drawn to it and will keep asking you to.

(posted as community wiki, since the question was answered in the comments)

Upvotes: 1

Related Questions