为GDI函数增加透明度处理
用户对客户端的UI的要求越来越高,采用alpha通道对前景背景做混合是提高UI质量的重要手段。 UI开发离不开GDI,然后要用传统的GDI函数来处理alpha通道通常是一个恶梦:虽然有AlphaBlend这个API可以做alpha混合,但是前提必须是操作的DC中的位图有alpha通道的数据,问题的关键在于GDI函数在操作的地方会把原来的alpha通道清空。 使用GDI做alpha混合还要增加透明度关键要解决2个问题: 1、需要把内容画到一个临时位图上,同时保护好alpha通道。 2、在于把临时位图的数据和原位图做混合,而且不能改变镂空部分原位图的alpha通道的值。 在SOUI的render-gdi中我采用下面的类来实现GDI的半透明。 class DCBuffer { public : DCBuffer(HDC hdc,LPCRECT pRect,BYTE byAlpha,BOOL bCopyBits = TRUE) :m_hdc(hdc) ,m_byAlpha(byAlpha) ,m_pRc(pRect) ,m_bCopyBits(bCopyBits) { m_nWid = pRect->right-pRect-> left; m_nHei = pRect->bottom-pRect-> top; m_hBmp = SBitmap_GDI::CreateGDIBitmap(m