【问题标题】:DrawText issuesDrawText 问题
【发布时间】:2020-10-18 18:10:40
【问题描述】:

我对这个函数有几个问题:

  • 如果我稍微移动窗口或将其切换到另一台显示器(顺便说一下,它具有不同的缩放比例),文本就会变成乱码
  • 如果我在打印文本之前调用 CreateFont 和 SelectObject,则会在初始文本之前显示较小版本的文本

我做得对吗?也许 WM_PAINT 案例中有太多的调用?我不知道还能怎么做

我的代码:

case(WM_PAINT):
{
    HDC hDC = GetWindowDC(Window);

    RECT lpRect;
    GetClientRect(Window,
                  &lpRect
    );

    SetTextColor(hDC, RGB(0, 0, 0));
    SetBkMode(hDC, TRANSPARENT);

    DrawTextW(hDC,
              L"Loading...",
              -1,
              &lpRect,
              (DT_SINGLELINE | DT_TOP | DT_VCENTER | DT_NOCLIP)
    );

    DeleteDC(hDC);
    break;
}
case(WM_ERASEBKGND):
{
    HDC hDC = GetWindowDC(Window);

    RECT lpRect;
    GetClientRect(Window, &lpRect); 

    HBRUSH hBrush = CreateSolidBrush(RGB(255, 255, 255));

    FillRect(hDC, &lpRect, hBrush); 
    DeleteObject(hBrush);
    break;
}

【问题讨论】:

  • 不相关,但我建议您将lpRect 更改为rect,因为它不是指向RECT 结构的指针。

标签: c++ c winapi win32gui


【解决方案1】:

WM_PAINT 中,您必须调用BeginPaint()EndPaint()。通过这种方式您可以获得设备上下文。如果您不调用 EndPaint(),则不会验证 rect。

【讨论】:

  • 如果您在成功调用BeginPaint 后不调用EndPaint,则您的程序已损坏。但验证无效区域的是BeginPaint,而不是EndPaint
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多