大家好,我自己继承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,才能让他既保持透明背景色的能力,也能保证每次显示新图片时,旧图片已经被刷新掉?
谢谢。
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,才能让他既保持透明背景色的能力,也能保证每次显示新图片时,旧图片已经被刷新掉?
谢谢。
试试看,不行的话再加上:InValidate();
GetHBitmap()
{return m_hBitmap;} 就好了.
之后把旧图释放
凤矶
等 级:
发表于: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();
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)) )
}
如果在dialog里面调用invalidateRect就可以,但在类里面InValidate就是不行。不知道为什么。