急求回复:这个问题烦我近一周了! 
我在对话框上画图形, 其先我画了个方形,然后由于计算变化,需要擦除掉原来的方形画
比方形小的图形,比如三角形,请问如何把原来的方形去掉?
我尝试用invalidaterect函数,然后再画图,但是新画的图怎么都看不到了?请问是怎么回
事?
我在别的论坛提问了,有些人建议背景重画,但是我的背景并不是单调的背景,而是一张图,
如果要实现背景重画,需要怎么实现?  我可以定位图形变化的背景位置,但是具体的实现
过程请那位兄台赐教!   
谢谢。

解决方案 »

  1.   

    invalidaterect需要指定erasebackground
      

  2.   

    有个方法:
    创建一个DC,大小为擦除的尺寸,SetViewportOrg为具体的位置,发送WM_ERASEBKGND给对话框,让它在新DC上画背景,然后在背景上画三角,再贴回原DC
      

  3.   

    InvalidateRect()只有两个参数,一个参数是需要设为无效的区域,令一个参数是bool型,   需要怎么指定擦除的背景?         后面一种方法的具体做法是什么?    
    i am trying! 
      

  4.   

    我刚才尝试用invalidaterect函数,然后发送一个消息WM_ERASEBKGND, 然后再画图,但是新画的图还是一闪而过.!
      

  5.   

    估计很大可能是你的画图逻辑有问题,不是刷新的问题把背景图放在OnEraseBkgnd里做,
    画三角或方块就直接在dc上画,在OnPaint消息里
    先照这种方法你改下,看还有问题吗
      

  6.   

    主要是InvalidateRect的参数得是现在的Rect与原来的方形的Union.其它我倒认为没什么必要,可以考虑双缓冲。
      

  7.   

    InvalidateRect();
    应该指定刷新的Rect吧
      

  8.   

    我描述一下我的做法吧,我画背景的方式: 先把背景图片作为资源插入. 然后在对话框构造函数中编写:  //载入图片
    mDlgBkBmp=new CBitmap;
    mDlgBkBmp->LoadBitmap(IDB_BITMAP1);
    mBrush.CreatePatternBrush(mDlgBkBmp);
    然后我重载CFanGameDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    添加代码 return mBrush;画变化的图型的时候,我是要根据外在的计算,判断某个区域发生图型变换,这样,我就把该小区域InvalidateRect() , 然后在该区域上画变化后的图形形状. 这样就造成了图形显示一闪而过.而这一闪并没有对背景造成影响!  我尝试用内存法(??? 是不是就是所谓的双缓冲法),我现在内存设备环境中画图形,然后再bitblt到屏幕上,最后一个参数设置成SRCINVERT, 然后所画的图形也是一闪一闪,而且闪得非常怪异,有时候一些区域内图形有些显示出来,有些没有显示出来。   这里有一个问题就是我设置的内存位图m*n,但是我所画的区域并没有整个区域都画,所以用SCRCOPY参数的时候,就会把一些我再内存中没有画的区域显示到屏幕上,变成黑的,不知道有没有办法把内存位图初始化成为一种透明颜色的方式?
      

  9.   

    你把return mBrush放到OnEraseBkgnd里试试,不要放在OnCtlColor里面
      

  10.   

    对于roger_ding(海天一色) 兄提到的在OnEraseBkgnd中实现代码又是怎么回事?这个OnEraseBkgnd是怎么重载的?我怎么用classwizzard的对话框Message中找不到这个方法阿!
      

  11.   

    WM_ERASEBKGND如果没有用以下步骤:
    打开ClassWizard
    -> "Class info" tab
    ->"Advance Options"
    ->"Message filter"
    ->改为"Window"
      

  12.   

    呵呵,终于搞定问题了,谢谢各位阿。 我最终解决的方式是发送WM_ERASEBKGND,在该方法里面实现每次重画图,应该说是上面 roger_ding(海天一色)兄提到的方法,不过我以前没有做过,所以一直不明白你的意思,傍晚翻着 《实用vc++教程》,却看到了近似的例子,真是丢脸,这本书从我做这个小程序其就放在我的桌子上都没有好好利用,每次看到那页就马马虎虎跳过去了,每次都msdn却没有具体事例参考。  我想我把我的问题点数都给海天兄吧,谢谢你了!