none
关于WM_ERASEBKGND的疑问 RRS feed

  • 问题

  • 你好:

           注册窗口类时使用wnd.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));

           我在窗口函数里进行如下操作:

            case WM_ERASEBKGND:
      {  
          return  1; 
      }

      case WM_PAINT:
      {  
      PAINTSTRUCT  ps;
      HDC  hdc = BeginPaint(hWnd, &ps);
      EndPaint(hWnd, &ps);
      return 0;
      }

    当程序启动时,因为WM_ERASEBKGND里面返回了,背景色是白色的这个是正常的,但是当我把窗口最小化后再恢复,此时的背景色就是灰色的,请问这是为什么?WM_ERASEBKGND为什么不起作用了。

    2019年12月7日 12:09

答案

全部回复

  • 你好,

    感谢你在这里发帖。

    通过比对窗口启动和最小化过程中的消息差异,我认为显示不正确的原因是由于WM_SYSCOMMAND所致,窗口启动和最小化中间所有的不同消息我都测试过,除了WM_SYSCOMMAND其他都不会引起背景的重绘。WM_SYSCOMMAND处理的是窗口最小化最大化之类的一些命令。因此我选择重写了SC_RESTORE和SC_MINIMIZE 命令,只是单纯地执行了ShowWindow(hWnd, SW_SHOWNORMAL),结果也很明显,并没有发生背景的变化。所以在你的代码中,背景的重绘我认为是DefWindowProc(hWnd, message, wParam, lParam)这个默认的消息处理函数,处理WM_SYSCOMMAND时,有不经过WM_ERASEBKGND消息,重绘了背景,所以导致你禁用背景重绘消息,但是不起效果。

    Best Regards,

    Suarez Zhou


    如果您对Visual Studio 或Microsoft Azure相关产品感兴趣,请点击此链接,或扫描以下二维码注册获取相关信息。




    2019年12月9日 3:25
  • 你好:

         感谢你的回复。

          请问一下如果我这样设置:

              wnd.hbrBackground = null;

        我在窗口函数里进行如下操作:

            case WM_ERASEBKGND:
           {  
              return  1; 
          }

          case WM_PAINT:
          {  
           PAINTSTRUCT  ps;
           HDC  hdc = BeginPaint(hWnd, &ps);
           EndPaint(hWnd, &ps);
           return 0;
          }

         此时产生的窗口是白色的,是不是说明windows会先生成一个白色背景的窗口,然后在WM_ERASEBKGND消息中会用wnd.hbrBackground的值进行背景的重绘。这样理解对吗?

     

    2019年12月9日 7:40
  • 你好,

    差不多可以这么认为,虽然窗口创建的过程中也伴随着很多消息,但你禁用了WM_ERASEBKGND消息,所以窗口的背景颜色并不受窗口的属性影响。

    Best  Regards,

    Suarez Zhou


    如果您对Visual Studio 或Microsoft Azure相关产品感兴趣,请点击此链接,或扫描以下二维码注册获取相关信息。



    2019年12月9日 8:40
  • 你好:

           采用这种设置窗口是白色的,如果我最小化窗口然后再恢复,窗口还是白色的。此时如果我改变窗口大小,窗口会全部变黑色,请问一下是什么原因导致全变黑色?没有哪个代码里面有黑色画刷啊。

    2019年12月9日 11:38
  • 你好,

    黑色画刷就是NULL的值,即为0,你可以尝试wnd.hbrBackground后面的赋值换为(HBRUSH)后跟123之类的数字,都是不同的颜色。

    方便的话,你能解释下你这么操作的原因,或者你想实现的效果,以便于我们更好地帮助到你。

    Best Regards,

    Suarez Zhou


    如果您对Visual Studio 或Microsoft Azure相关产品感兴趣,请点击此链接,或扫描以下二维码注册获取相关信息。


    2019年12月10日 7:43
  • 你好:

         我是想知道WM_ERASEBKGND的作用,如果在WM_ERASEBKGND消息里不作处理,windows默认会做哪些事。还有WM_PAINT消息里面会不会擦除背景。

    2019年12月11日 2:07
  • 你好,

    >>我是想知道WM_ERASEBKGND的作用

    控制背景重绘。

    >>如果在WM_ERASEBKGND消息里不作处理,windows默认会做哪些事。

    这个很复杂,没办法确定说明做了哪些事,windows操作都是封装的。

    >>还有WM_PAINT消息里面会不会擦除背景

    不会,WM_PAINT做的可以想象是在画布上画画,画布的颜色是由WM_ERASEBKGND控制的,也就是绘制背景,至于在画布上怎么画是WM_PAINT来做的。

    当然WM_PAINT本身不会做,是有其他函数来做。可以看下下面的gif图片的演示。

    在WM_PAINT消息中,BeginPaint函数和EndPaint函数中间执行了一次WM_ERASEBKGND的消息响应函数,可以认为BeginPaint函数发送了一次重绘背景的消息,这也很好理解,当你要开始画画时,确实需要通知系统换张新画布,即重绘一次背景。

    当然刚才只是个人理解,我认为消息都各司其职,分工明确,WM_PAINT不会去做WM_ERASEBKGN该做的事。另一种理解就是WM_PAINT消息里面会调用WM_ERASEBKGND消息响应函数,因为这都是默认的处理过程,你可以做个demo去验证自己的想法。

    Best Regards,

    Suarez Zhou


    如果您对Visual Studio 或Microsoft Azure相关产品感兴趣,请点击此链接,或扫描以下二维码注册获取相关信息。



    2019年12月11日 3:11
  • 你好:

         非常感谢,请问一下在线查看MSDN用哪个网址。

    2019年12月11日 11:17
  • 你好,

    MSDN文档可以通过以下链接访问:https://docs.microsoft.com/zh-cn/cpp/?view=vs-2019,此网页为Visual C++技术文档,如果想要其他内容的技术文档,请返回首页。

    如果你的问题已经解决,请标记有价值的回复为答案,这将会帮助论坛上的其他用户更快地找到解决方案。

    Best Regards,

    Suarez Zhou


    如果您对Visual Studio 或Microsoft Azure相关产品感兴趣,请点击此链接,或扫描以下二维码注册获取相关信息。



    2019年12月12日 1:10