GDI +没有清除窗口重新绘制vista

时间:2010-05-09 11:14:49

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

在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)似乎没有任何区别。当窗口隐藏在另一个窗口后面时,文本甚至不会改变位置,并且焦点需要再次重新绘制。

如何在Vista中更改mName?

修改 paint代码通过WM_PAINT和WM_SIZE以下列方式调用:

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

1 个答案:

答案 0 :(得分:3)

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

最好不要直接调用paint(),而是使用InvalidateRgn来触发重绘。这将导致WM_PAINT被发送,这将由您的应用程序以正常方式处理。作为奖励,您还可以告诉InvalidateRgn为您删除背景

InvalidateRgn(hWnd, NULL, TRUE);