小编Ral*_*alf的帖子

如何将Win32应用程序的背景颜色初始化为白色以外的颜色以避免ShowWindow上的闪烁?

我正在研究为什么在运行我的 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

6
推荐指数
1
解决办法
3336
查看次数

标签 统计

winapi ×1