在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;
答案 0 :(得分:3)
调整窗口大小时,您正在显式调用paint()
函数。但是,您的窗口没有失效,因此可能是系统将您的绘画工作限制在标记为“脏”的区域。
最好不要直接调用paint()
,而是使用InvalidateRgn
来触发重绘。这将导致WM_PAINT
被发送,这将由您的应用程序以正常方式处理。作为奖励,您还可以告诉InvalidateRgn
为您删除背景
InvalidateRgn(hWnd, NULL, TRUE);