做了一个小工具,基于dialog的。背景是刷的纯色。dialog中有许多的控件,比如button,listctrl等等。这些控件都是系统的。都不是自绘的控件。在onpaint中加入如下代码,但是在屏幕最大化的时候,系统控件会被覆盖掉,需要鼠标滑过控件,控件才会出现。是不是控件也需要在onpaint中重绘?完全摸不着头脑啊。请教各位大神,应该如何做,在线等CRect rc;
GetClientRect(&rc); CClientDC dc(this);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
memdc.SelectObject(&bmp);
bmp.DeleteObject(); memdc.FillSolidRect(&rc, RGB(186, 226, 239)); dc.BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &memdc, 0, 0, SRCCOPY);
memdc.DeleteDC();

解决方案 »

  1.   

    覆盖了其他控件,重绘好让其他控件刷新即可。保留其他控件的指针,Invalidate即可
      

  2.   

    上次有人提过类似的问题,需要在onpaint里设置裁剪区域,把那几个控件的rect去掉。CDC::SelectClipRgn
    用这个函数试试
      

  3.   

    不仅仅是最大化的时候会被背景色覆盖啊,在拖动dialog的时候也会被覆盖。
    我在onpaint 里面加了getdlgitem(id)->invalidate(false),没用啊,还是会被覆盖
      

  4.   

    版主的这个方法不好,先invalidate全部区域就是会覆盖掉控件的显示,之后不论你是否让控件重绘,也不论重绘是否成功,最终都会导致2个不好的结果,一个就是重绘成功,但是控件会闪,一个就是没成功,控件被覆盖
      

  5.   

    额。那应该怎么弄啊?
    我在3楼不是说了吗?
    额。一共加了30个左右的控件,难道是需要用SelectClipRgn排除所有的裁剪区域?
    刚刚试了指定摸个固定区域,但是dialog移动出显示器然后快速移动回来,裁剪区域还是没有重绘
      

  6.   

    一个属性就能搞定的问题 在OnInitDialog 里面加入这行 ModifyStyle(0, WS_CLIPCHILDREN);