c - 当我尚未验证 RECT 时,为什么 Drawtext 仍在绘制文本?

标签 c winapi drawtext

我正在用 GetDC-ReleaseDC 替换简单窗口中的 BeginPaint-EndPaint。 我正在阅读 Charles Petzold 编程 Windows 第五版。

这是我的代码,其中包含更改以及作为注释更改的行:

#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));
}

我的问题是: 为什么DrawText当我没有调用ValidateRect时仍然显示该消息? 据我了解(这显然是不正确的) RECT rc 内的文字不应该出现,除非我打电话 ValidateRect 。 当显示窗口时,绘制的文本正在闪烁,我认为这是因为 Windows 正在调用 WM_PAINT并正在尝试验证 rc (我的客户区)但是DrawText每次仍然设法显示文本行。 我有一点困惑。

FLICKERING TEXT

最佳答案

您的文本会一次又一次地呈现,因为您尚未调用ValidateRectEndPaint 调用 ValidateRect 将在此绘制周期中渲染的区域标记为有效,即不需要渲染。

将一个区域标记为无效并不会阻止您绘制该区域,它只是意味着系统不会认为您已经绘制到该区域,并且会继续要求您绘制。

(作为社区维基发布,因为问题已在评论中得到解答)

关于c - 当我尚未验证 RECT 时,为什么 Drawtext 仍在绘制文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28550927/

相关文章:

c++ - win32api : incorporate bitmaps in text lines

Android Canvas - 在所有屏幕分辨率上将带有 drawText 的文本定位在同一位置

通过检查 C 中的魔数(Magic Number)来检查可执行文件或 shell 文件是否有效

c - fscanf 无法读取我在 C 中输入的文件的第一个整数,但读取其余部分

c++ - 使用来自系统级进程(Windows 服务)的登录用户上下文模拟和运行任何方法 :

c++ - 如何从 Adob​​e AIR 应用程序获取 HDC 或屏幕截图?

c - 是否可以在预处理时或编译时修改 "function call"

我们可以在 C 中更改 size_t 的大小吗?

一系列帧上的FFmpeg drawtext

ffmpeg 移动文本 drawtext