1)一个CStatic 在一个CDialog中;
2)将CStatic设置了SS_BITMAP属性;
3)在CStatic 的DC中设置一个图片。
问题:当第一次设置的图片比第二次大时候,第一次的图片会有残留。我用了invalidate,但是没有作用。
谁有好的方法吗?请多指教。

解决方案 »

  1.   

    我说的不够明白吗?用如下伪代码说明:CStatic   stc;
    ....CDC*  pDC = stc.GetDC();pDC->DrawText("xxxxxxxxxx",...);//做别的事。(这里要如何处理??)pDC->DrawText("yyy",...);想要的结果:在stc的DC上只会有yyy,而不会显示出xxxxxxxxxx的痕迹。(其实我真正想要的是使用这个static的DC)
    请回答者不要猜,希望可以自己做个小Demo来真正想出办法。
      

  2.   

    调用父窗口的的RedrawWindow来重绘静态文本框的区域.
    因为静态文本框是没有画刷的.必须调用父窗口来绘制背景否则,背景不会被擦除.
    RECT rc;
    CWnd *pParent;
    LRESULT Result = Default();
    GetWindowRect( &rc );//获取静态文本框的矩形
    pParent = GetParent();//静态文本框的父窗口
    if( pParent ){
    pParent->ScreenToClient( &rc );//转换到父窗口的客区坐标.
    pParent->RedrawWindow( &rc );//让父窗口来重绘
    }
    以上代码是在已经子类化的静态文本框的WM_SETTEXT消息处理中.根据你自己的需要添加适当的地方.
    注意注释过的地方.要根据实际情况决定调用哪个类的成员.
      

  3.   

    谢谢,aaronwang81。你的方法可行,你解释的也很到位,Thanks again.。
    不过,还有一点我想问一下:
    你说:“因为静态文本框是没有画刷的.必须调用父窗口来绘制背景否则,背景不会被擦除. ”。
    这句话中,你说“静态文本框是没有画刷”,那它本身的背景是如何来的?它的背景会与它的父窗口的背景一样吗?我记得有时候在对话框中设置一个背景图,然后在对话框上建立一个static,但这个static是一块与对话框背景不一样的。是不是也要刷一下才会一样?
      

  4.   

    "静态文本框没有画刷"是指默认情况下,静态文本框类没有设置类画刷.这是我没说清楚,不好意思.
    根据MSDN中关于WNDCLASSEX的说明.
    如果一个类没有设置类画刷,则应该程序必须自行绘制窗口的背景.
    如果你没有在静态文本的WM_CTLCOLOR消息中返回一个画刷.那就由这个文本框的父窗口来处理.默认父窗口是调用系统的默认处理来处理的.这就造成你说的.父窗口的背景与静态文本的背景不一样的情况.
    要修改表态文本框架的背景:
    1.子类化.然后响应WM_CTLCOLOR消息.返回一个画刷.
    2.在父窗口中响应WM_CTLCOLORSTATIC消息,返回一个画刷.
      

  5.   

    Thanks a lot!
    Now end this note.