我正在研究为什么在运行我的 Windows 应用程序时,在渲染实际应用程序之前(即在接收到 WM_ERASEBKGND 和 WM_PAINT 之前)它会出现短暂的白色背景闪烁。
现在,我刚刚注意到这个问题也存在于 Visual Studio 创建的默认示例应用程序中。至少我在 Windows 10,21H1(在 VS2008 和 VS2013 中)下运行时是这样。
创建“新的 Win32 项目”后,您唯一要做的就是更改窗口类的背景颜色,例如,更改为红色:
//wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.hbrBackground = (HBRUSH) CreateSolidBrush(RGB(255, 0, 0));
Run Code Online (Sandbox Code Playgroud)
然后将带有 Sleep 的 WM_ERASEBKGND 添加到 WndProc:
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_ERASEBKGND:
Sleep(1000);
return DefWindowProc(hWnd, message, wParam, lParam);
Run Code Online (Sandbox Code Playgroud)
睡眠夸大了问题,导致白色背景显示至少一秒钟。之后,红色背景将按预期绘制。
我在运行包含这些更改的应用程序时添加了一个简短的视频。
对于任何应用程序来说,窗口在渲染前闪烁白色看起来都很不专业,尤其是在界面是黑色的情况下。所以我的问题是:是什么导致了这种行为?在调用 ShowWindow(..) 之前,通过 RegisterClassEx 设置背景颜色并传递给 CreateWindow,因此 Windows 应该知道背景颜色是红色。那么为什么它会呈现白色呢?我错过了什么吗?
理想情况下,我想将初始背景颜色更改为白色以外的颜色,例如黑色。但如何呢?我在调用 ShowWindow 之前尝试绘制到窗口,但没有运气。
winapi ×1