c++ - GDI+ 在为 vista 重绘时没有清除我的窗口

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

如何让 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;

最佳答案

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

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

InvalidateRgn(hWnd, NULL, TRUE);

关于c++ - GDI+ 在为 vista 重绘时没有清除我的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2797451/

相关文章:

C++ "this"与调用的对象方法不匹配

c++ - 将 LPCWSTR 字符串打印到文件

python - 定义保存电子邮件的邮箱 - win32client python

c++ - "Hello World"运行失败。 Windows Vista 上 MinGW 和 Cygwin 的 Eclipse (Galileo) CDT 插件问题

java - 如何诊断 Windows Vista 中的 Java JNI EXCEPTION_ACCESS_VIOLATION 错误

C++ 无限符号

c++ - 尝试在 C++ 中转换结构时出现奇怪的错误消息

c - 检测 WAN radio 电源关闭

c++ - WinAPI - 菜单加速器不工作

c# - Vista - GetForegroundWindow 返回的不是正确的进程 ID,而是父进程 ID