leDC( &l_PaintDC ) ; CBitmap* l_pOldMemoryBitmap = l_MemoryDC.SelectObject( CBitmap::FromHandle( l_hbmpBitmap ) ) ; l_BufferDC.BitBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(), &l_MemoryDC,0, 0, SRCCOPY ) ; l_MemoryDC.SelectObject( l_pOldMemoryBitmap ) ; // Create the mask. COLORREF l_crOldBack = l_BufferDC.SetBkColor( RGB( 255, 0, 255 ) ) ; l_MaskDC.BitBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(), &l_BufferDC,0, 0, SRCCOPY ) ; l_BufferDC.SetBkColor( l_crOldBack ) ; // Draw the bitmap transparently now; if( ! l_PaintDC.MaskBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(),&l_BufferDC, 0, 0, l_MaskBitmap, 0, 0,ROP4_TRANSPARENTBLIT ) ) { CDC l_CopyDC ; l_CopyDC.CreateCompatibleDC( &l_PaintDC ) ; CBitmap l_CopyBitmap ; l_CopyBitmap.CreateCompatibleBitmap( &l_PaintDC, l_rcClient.Width(),l_rcClient.Height() ) ; CBitmap* l_pOldCopyBitmap = l_CopyDC.SelectObject( &l_CopyBitmap ) ; l_CopyDC.BitBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(), &l_PaintDC,0, 0, SRCCOPY ) ; l_CopyDC.BitBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(), &l_MaskDC,0, 0, SRCAND ) ; l_BufferDC.BitBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(), &l_MaskDC,0, 0, SRCINVERT ) ; l_CopyDC.BitBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(), &l_BufferDC,0, 0, SRCPAINT ) ; l_PaintDC.BitBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(), &l_CopyDC,0, 0, SRCCOPY ) ; l_CopyDC.SelectObject( l_pOldCopyBitmap ) ; } // Clean up. l_MaskDC.SelectObject( l_pOldMaskBitmap ) ; l_BufferDC.SelectObject( l_pOldBufferBitmap ) ; }
四、 小结
本实例介绍了如何在对话框中实现透明位图的显示,读者朋友可能感觉到文中介绍的方法和代码的实现过程仿佛不太一致,其实这些只是表面现象,读者朋友在吃透实例代码的实现过程后,就会发现两者之间并没有什么冲突。
|