加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么在减小窗口大小时发送WM_ERASEBKGND消息?

发布时间:2020-12-16 07:14:25 所属栏目:百科 来源:网络整理
导读:我注意到当我减小窗口大小时,正在发送WM_ERASEBKGND消息,任何人都可以解释为什么在这种情况下发送此消息,我的意思是我明白当我增加窗口大小时我应该删除新的背景显示区域,但为什么在减小窗口大小时需要擦除背景?! 这是一个说明此行为的屏幕截图(我将Spy设
我注意到当我减小窗口大小时,正在发送WM_ERASEBKGND消息,任何人都可以解释为什么在这种情况下发送此消息,我的意思是我明白当我增加窗口大小时我应该删除新的背景显示区域,但为什么在减小窗口大小时需要擦除背景?!

这是一个说明此行为的屏幕截图(我将Spy设置为仅显示WM_ERASEBKGND消息):

enter image description here

这是我用来创建窗口的代码:

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
    {
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd,message,wParam,lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "WinClass";
    wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
    RegisterClassEx(&wc);

    HWND hWnd = CreateWindowEx(0,"WinClass","My Window",WS_OVERLAPPEDWINDOW,400,NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;
    while(GetMessage(&msg,0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

编辑:

我忘了提一个重要的细节:当我减小窗口大小时,只发送WM_ERASEBKGND消息而没有WM_PAINT消息.

解决方法

如果您不希望在调整大小时发送自动擦除,请从窗口类注册中删除CS_HREDRAW和/或CS_VREDRAW样式.这些标志告诉系统分别在水平或垂直调整大小上重绘窗口.

至于为什么这种行为可能是理想的,一些控件在调整大小时保持文本居中,如果它们没有擦除旧尺寸的背景伪像可能会被遗留.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读