【问题标题】:GDI+ not clearing my window on repaint for vistaGDI+ 没有清除我的 vista 重绘窗口
【发布时间】:2010-05-09 11:14:49
【问题描述】:

在 WM_PAINT 上,我执行以下操作:

//RectF mNameRect;
//WCHAR* mName;
//HWND mWin; // this is the window handle
{
PAINTSTRUCT ps;

HDC hdc = BeginPaint(mWin, &ps);
Graphics g(hdc);
g.Clear(Color::White);

StringFormat stringForm;
stringForm.SetLineAlignment(StringAlignmentCenter);
stringForm.SetAlignment(StringAlignmentCenter);

// set the rectangle to the size of the whole window

mNameRect.Width = static_cast<float>(size.cx);
mNameRect.Height = static_cast<float>(size.cy);

g.DrawString(mName, -1, &mNameFont, mNameRect, &stringForm, &mNameBrush);

EndPaint(mWin, &ps);
}

在 XP 中这工作正常,mName 显示在窗口中间。但是在 Vista 上,文本不会移动,无论我如何调整窗口大小,它都会保持在原来的位置。 g.Clear(Color::White) 似乎没有任何区别。当窗口隐藏在另一个窗口后面并且需要重新绘制焦点时,文本甚至不会改变位置。

如何让mName在Vista中改变位置?

编辑: 绘制代码通过 WM_PAINT 和 WM_SIZE 以下列方式调用:

// WndProc function
switch (msg){
    case WM_SIZE:
    // intentionally call paint when WM_SIZE is triggered
    case WM_PAINT:
        paint();
    break;

【问题讨论】:

  • 您是否检查过size 在 Vista 上的更改值?
  • @Thomas:我添加了调用paint的代码。大小是在paint() 开始时通过GetWindowRect() 收集的。所以是的 - 大小确实改变了.. :/

标签: c++ winapi windows-vista gdi+


【解决方案1】:

调整窗口大小时,您正在显式调用 paint() 函数。但是,您的窗口并未失效,因此可能是系统将您的绘画工作限制在标记为“脏”的区域。

与其直接调用paint(),不如使用InvalidateRgn触发重绘。这将导致发送WM_PAINT,您的应用程序将以正常方式处理该WM_PAINT。作为奖励,您还可以告诉InvalidateRgn 为您擦除背景

InvalidateRgn(hWnd, NULL, TRUE);

【讨论】:

  • 太棒了,您在几分钟内解决了我的两个令人头疼的问题。谢谢!
  • 顺便说一句,你知道为什么它适用于 XP 而不适用于 Vista 吗?
  • 显然,Vista 进行了更积极的优化以尽量减少绘制量。我真的很惊讶它确实可以在 XP 上运行。
猜你喜欢
  • 2020-05-07
  • 2011-08-29
  • 2020-09-12
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
相关资源
最近更新 更多