如题我在OnPaint()中画背景(用双缓冲无闪烁),但是这样刷新的时候按钮就会消失所以我在该函数画完背景后
用GetDlgItem(IDC_B_SEND)->Invalidate();令按钮重刷一遍,
这是是可以解决按钮消失问题但是,这样就造成了我动一下窗口,界面上的所以按钮都在动(背景没闪,因为我用双缓冲)怎么解决这个问题??请高手指点》》》》》》》

解决方案 »

  1.   

    位图按钮是一个按钮类?WM_ERASEBKGND?
      

  2.   

    http://www.pconline.com.cn/pcedu/empolder/gj/vc/0507/653941.html
      

  3.   

    我不是背景闪而是背景画完后,我要使按钮能浮在背景之上
    所以用了GetDlgItem(IDC_B_SEND)->Invalidate();令界面上所有的按钮重刷一遍导致按钮闪,我是想问有什么办法可以使按钮又可以浮在背景最上面,又可以不用在OnPaint()中使用GetDlgItem(IDC_B_SEND)->Invalidate();
      

  4.   

    楼上的高手,请问我用SubtractRect()减掉了一个RECT之后用哪个API可以画这种不规格的图片?本来我是用dc.StretchBlt();拉伸图片现在要用哪个API?
      

  5.   

    我上面的方法在背景图中直接用图像处理软件做会方便一些;如果你的图片都是动态或在运行时才指定图片的话,那就用CDC::SetPixel把那个区域填充成透明色,麻烦一点,不知道楼下有没有更好的方法?
      

  6.   

    SetPixel应该是很慢的, 不太实际啊
      

  7.   

    设置clip region,在刷新时去掉按钮区域
    CRgn clipRgn;
    clipRgn.CreateRectRgnIndirect(&rcClient);
    pDC->SelectClipRgn(&clipRgn);
    pDC->ExcludeClipRect(&rcButton);
      

  8.   

    RECT rcClient;
    GetClientRect(hwnd,&rcClient);
    HRGN hrgn=CreateRectRgn(rcClient.left,rcClient.top,rcClient.right,rcClient.bottom);
    SelectClipRgn(hdc,hrgn);
    ExcludeClipRect(hdc,rcClient.left,rcClient.top,rcClient.right,rcClient.bottom);//在这里加上你自己的绘制code注:  这是一种简单的情况:即将绘制的window和button都是矩形的.
    如果你将button设为圆形的,那会怎么样呢?你自己可以试试看.
      

  9.   

    什么都不用,一定是你画错了。你是在CPaintDC中画的还是在CClientDC或CWindowDC中画的?另外你可以指定父窗口的属性为WM_CLIPCHILD.这样在画父窗口的时候就不会画它里面子窗口中的部分了。
      

  10.   

    psbeond(psbeyond) ( ) 信誉:98  2006-3-18 20:36:15  得分: 0  
        
    什么都不用,一定是你画错了。你是在CPaintDC中画的还是在CClientDC或CWindowDC中画的?另外你可以指定父窗口的属性为WM_CLIPCHILD.这样在画父窗口的时候就不会画它里面子窗口中的部分了。应该不是吧  
     
      

  11.   

    bugzhao(阿辉) ( ) 信誉:98  2006-03-19 15:15:00  得分: 0  
     
     
       psbeond(psbeyond) ( ) 信誉:98  2006-3-18 20:36:15  得分: 0  
        
    什么都不用,一定是你画错了。你是在CPaintDC中画的还是在CClientDC或CWindowDC中画的?另外你可以指定父窗口的属性为WM_CLIPCHILD.这样在画父窗口的时候就不会画它里面子窗口中的部分了。应该不是吧  
    是的。其实你只要在Button中画Button,在父窗口中画父窗口就可以了。最多就是有闪烁,不可能被盖住的。看一下我的界面库就知道了。
      

  12.   

    楼上朋友可以把重绘标题栏的代码或函数放在WM_CTLCOLOR消息响应函数中。
      

  13.   

    //设置对话框属性
    ModifyStyle( WS_CAPTION, 
    WS_SYSMENU | WS_MINIMIZEBOX | WS_CLIPCHILDREN, 
    SWP_DRAWFRAME );我已经设置过对话框的属性
    这样的属性不行吗?我是在::OnPaint()中画背景及更新一些按钮的
    在该函数中用CDC *pDC = GetWindowDC();
    然后用双缓冲画图,背景重画不闪,只是在该函数中我也要相应更新位图按钮,
    例如:m_MAbout.Invalidate();
    这样每次刷新背景,这个按钮都会先变灰,再画上图
    所以感觉界面很闪
      

  14.   

    在OnPaint里最好不要用GetWindowDC() , 这么绘制会有问题 . . 最好改成 CPaintDC dc(this); 然后用这个dc来绘制即可 , 并在此函数中去除按钮的刷新 . . . 楼主试试看!
      

  15.   

    楼上的我试过了,可以去掉按钮的刷新并且按钮也没被盖住不过出现了界面一直在重画的现象会不会是因为我在OnPaint中用了
             CRect rect;
    GetClientRect(&rect);
    CRgn rgnWin;
    DrawMainDlgBK(dc, rect, rgnWin);//根据图片处理rgnWin
    SetWindowRgn(rgnWin,TRUE);
    造成的?而这东西又不能放在OnInitDialog()里,因为OnInitDialog里没有CPaintDC,
    怎么办?
      

  16.   

    其实如果要放在OnInitDialog()也行不过我窗口如果拉大缩小的话,这个就不好处理了
      

  17.   

    绝对不要在OnPaint里SetWindowRgn(。。)
    因为SetWindowRgn会改变窗口 ,一改变窗口就会调用OnPaint重绘一次 。
    然后OnPaint又调用SetWindowRgn(..) 结果可能会导致循环 。 。 。 。窗口拉大缩小的话, 可以重载OnSize(...) ,每次窗口大小变换的时候都会调用这个函数。
      

  18.   

    应该在OnEraseBKgnd()中画背景。
      

  19.   

    嗯明白了可是我想ListCtrl或TreeCtrl默认的滚动条改成位图形式的或XP形式的要怎么做???这个应该是做界面最基本的问题吧!请高手指点
      

  20.   

    重载ListCtr或者TreeCtrl , 在DrawItem里自己绘制 。 。