bool CRGBBitmapShow::PaintDIB(HDC hDC,LPRECT lpDCRect,LPRECT lpDIBRect,COLORREF TransparentColor) { CDC*pDC=CDC::FromHandle(hDC); CDC memDC,tempDC; HBITMAP m_bitmap =CreateCompatibleBitmap(hDC,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect)); //创建位图内存 memDC.CreateCompatibleDC(pDC); HBITMAP pOldBitmap=(HBITMAP)SelectObject(memDC, m_bitmap); CRect memrt(0,0,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect)); if(!PaintDIB(memDC.m_hDC,memrt,lpDIBRect)) { memDC.SelectObject(pOldBitmap); DeleteObject(m_bitmap); memDC.DeleteDC(); return false; } tempDC.CreateCompatibleDC(pDC); HBITMAP maskBMP =CreateBitmap(RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),1,1,NULL); //创建单色掩码位图 HBITMAP oldmaskBMP=(HBITMAP)SelectObject(tempDC, maskBMP); SetBkColor(memDC.m_hDC, TransparentColor);// 设置透明色 BitBlt(tempDC.m_hDC,0,0,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),memDC.m_hDC,0,0,SRCCOPY); SetBkColor(memDC.m_hDC, RGB(0,0,0)); SetTextColor(memDC.m_hDC, RGB(255,255,255)); // 白色 BitBlt(memDC.m_hDC,0,0,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),tempDC.m_hDC,0,0,SRCAND); SetBkColor(hDC,RGB(255,255,255)); // 透明部分保持屏幕不变,其它部分变成黑色 SetTextColor(hDC,RGB(0,0,0)); // 黑色 BitBlt(hDC,lpDCRect->left, lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),tempDC.m_hDC,0,0,SRCAND); //"与"运算,在hdc0生成掩模 BitBlt(hDC,lpDCRect->left, lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),memDC.m_hDC,0,0,SRCPAINT); memDC.SelectObject(pOldBitmap); tempDC.SelectObject(oldmaskBMP); DeleteObject(m_bitmap); DeleteObject(maskBMP); memDC.DeleteDC(); tempDC.DeleteDC(); return true; }
void SPicBox::OnPaint() { if(!m_pDibBits) { CStatic::OnPaint(); return; } CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here // Do not call CStatic::OnPaint() for painting messages PaintDIB(&dc); }
bool CRGBBitmapShow::PaintDIB(HDC hDC,LPRECT lpDCRect,LPRECT lpDIBRect) { CDC*pDC=CDC::FromHandle(hDC); CDC memDC; memDC.CreateCompatibleDC(pDC); HBITMAP m_bitmap =CreateCompatibleBitmap(hDC,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect)); //创建位图内存 HBITMAP pOldBitmap=(HBITMAP)SelectObject(memDC, m_bitmap); CRect memrt(0,0,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect)); if(!PaintDIB(memDC.m_hDC,memrt,lpDIBRect,0)) { memDC.SelectObject(pOldBitmap); DeleteObject(m_bitmap); memDC.DeleteDC(); return false; } BitBlt(hDC,lpDCRect->left, lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),memDC.m_hDC,0,0,SRCCOPY); if(!PaintDIB(memDC.m_hDC,memrt,lpDIBRect,1)) { memDC.SelectObject(pOldBitmap); DeleteObject(m_bitmap); memDC.DeleteDC(); return false; } BitBlt(hDC,lpDCRect->left, lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),memDC.m_hDC,0,0,SRCPAINT); if(!PaintDIB(memDC.m_hDC,memrt,lpDIBRect,2)) { memDC.SelectObject(pOldBitmap); DeleteObject(m_bitmap); memDC.DeleteDC(); return false; } BitBlt(hDC,lpDCRect->left, lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),memDC.m_hDC,0,0,SRCPAINT); memDC.SelectObject(pOldBitmap); DeleteObject(m_bitmap); memDC.DeleteDC(); return true; }
void SPicBox::PaintDIB(void) { CDC *pDC = GetDC(); PaintDIB(pDC); ReleaseDC(pDC); }