大家好,我自己继承CStatic实现了一个子类CTransStatic,重写了OnPaint函数,使其可以将背景色透明掉。代码如下:
    HBITMAP l_hbmpBitmap = GetBitmap();
    
    if( l_hbmpBitmap == NULL )
    {
        Default();
        return;
    }
    
    CPaintDC l_PaintDC( this );
    CRect l_rcClient;
    
    GetClientRect( &l_rcClient );
    
    CDC l_MemoryDC;
    
    l_MemoryDC.CreateCompatibleDC( &l_PaintDC );
    
    CBitmap* l_pOldMemoryBitmap = l_MemoryDC.SelectObject( CBitmap::FromHandle( l_hbmpBitmap ));
    
    CDC l_MaskDC;
    l_MaskDC.CreateCompatibleDC( &l_PaintDC );
    
    CBitmap l_MaskBitmap;
    
    COLORREF transparentBackColor = RGB( 160, 160, 64 ); // 需要透明掉的颜色
    
    l_MaskBitmap.CreateBitmap( l_rcClient.Width(), l_rcClient.Height(), 1, 1, (void*)transparentBackColor );
    
    CBitmap* l_pOldMaskBitmap = l_MaskDC.SelectObject( &l_MaskBitmap ) ;
    
    TransparentBlt( l_PaintDC.GetSafeHdc(), 0, 0, l_rcClient.Width(), l_rcClient.Height(), 
        l_MemoryDC.GetSafeHdc(), 0, 0, l_rcClient.Width(),l_rcClient.Height(), transparentBackColor ) ;
        l_MemoryDC.SelectObject( l_pOldMemoryBitmap ) ;
    l_MaskDC.SelectObject( l_pOldMaskBitmap ) ;
    
    l_MemoryDC.DeleteDC();
    l_MaskDC.DeleteDC();但是,问题是,当我重复SetBitmap不同的图时,上一次的图片并没有被刷新。
我知道一种方法,就是在Dialog里面控制InvalidateRect该窗口,但我希望能够在CTransStatic类里面自己处理。我试着将InvalidateRect放在CTransStatic里面,但是没有效果。请问,需要如何修改CTransStatic,才能让他既保持透明背景色的能力,也能保证每次显示新图片时,旧图片已经被刷新掉?
谢谢。

解决方案 »

  1.   

    你要重复SetBitmap之前,先判断m_hBitmap是否为null.如果还有的话,应该先DeleteObject(m_hBitmap);
    试试看,不行的话再加上:InValidate();
      

  2.   

    谢谢你,可是m_hBitmap是CStatic的私有成员吧,子类能访问到么?
      

  3.   

    你在父类中定义一个存取方法(必须为公有的),
    GetHBitmap() 
    {return m_hBitmap;} 就好了.
      

  4.   

    SetBitmap之前,先SetBitmap一幅全黑图
    之后把旧图释放
      

  5.   

    呵呵,我不是很明白。CStatic的代码我改不了,那么我就访问不到他的m_hBitmap阿。 
      

  6.   

    CTransStatic不是你继承的吗?你把m_hBitmap作为一个成员变量,而不是在函数中定义的变量。试一下shunruo的方法吧
      

  7.   

    SetBitmap要返回旧图的句柄,释放这个就行了
      

  8.   

    shunruo 
    凤矶 
    等 级:
     发表于:2007-11-05 17:42:515楼 得分:0 
    SetBitmap之前,先SetBitmap一幅全黑图 
    之后把旧图释放 
     我不想这样做,这样会一闪一闪的。shunruo 
    凤矶 
    等 级:
     发表于:2007-11-05 17:55:259楼 得分:0 
    SetBitmap要返回旧图的句柄,释放这个就行了 
     
    这个我试过了,是不是这样写?    可是,没有效果阿。
    HBITMAP temp = SetBitmap(bitMap);
    DeleteObject(temp);
    Invalidate();
      

  9.   


    HBITMAP m_hBitmap;
    m_hBitmap = myStatic.GetBitmap();
    if ( m_hBitmap != NULL )          //if (myStatic.GetBitmap() != NULL)
    {
        DeleteObject( m_hBitmap );
        myStatic.SetBitmap( ::LoadBitmap(NULL, MAKEINTRESOURCE(OBM_CLOSE)) )
    }
      

  10.   

    老兄,不行啊,闪死啦。为什么只DeleteObject( m_hBitmap );不能清除原来的图像呢?
      

  11.   

    我确实加了InValidate,不行。
    如果在dialog里面调用invalidateRect就可以,但在类里面InValidate就是不行。不知道为什么。
      

  12.   

    在Setbitmap新图之前,Setbitmap(NULL)可以暂时解决问题,揭帖。