用dc1->BitBlt显示了一个红色边框的矩型图像,边框里面是透明的,怎么把这个红色的边框取消掉,并且背景图像不变?我想做一个打枪是的瞄准器,

解决方案 »

  1.   

    void DrawTransparentImage(CDC* pDC,  HBITMAP hBitmap, COLORREF rgb, 
      int x, int y,CRect& rt)
    {
    BITMAP  bmpMap;
    GetObject(hBitmap, sizeof(BITMAP), &bmpMap); CRect l_rcClient(0, 0, bmpMap.bmWidth, bmpMap.bmHeight);

    //与目标DC兼容的DC
    CDC  l_BufferDC;
     l_BufferDC.CreateCompatibleDC(pDC);
     //与目标DC兼容的位图
     CBitmap  l_BufferBitmap;
     l_BufferBitmap.CreateCompatibleBitmap(pDC, l_rcClient.Width(), l_rcClient.Height());
     
     CBitmap* l_pOldBufferBitmap = l_BufferDC.SelectObject(&l_BufferBitmap);
     //与目标DC兼容的DC
     CDC  l_MaskDC;
     l_MaskDC.CreateCompatibleDC(pDC);
     //与目标窗口大小相等的位图
     CBitmap  l_MaskBitmap;
     l_MaskBitmap.CreateBitmap(l_rcClient.Width(), l_rcClient.Height(), 1, 1, NULL);
     CBitmap* l_pOldMaskBitmap = l_MaskDC.SelectObject( &l_MaskBitmap ) ;
     
    #define ROP4_TRANSPARENTBLIT 0xCCAA0020
    #define SRCMASK 0x00220326
     
     ////////////////////////////////////////////////////////////////////////////
     // Fill with transparent color
     ////////////////////////////////////////////////////////////////////////////
     l_BufferDC.FillSolidRect( &l_rcClient, rgb ) ;
     
     ////////////////////////////////////////////////////////////////////////////
     // Blit the bitmap to the buffer
     ////////////////////////////////////////////////////////////////////////////
     
     CDC  l_MemoryDC ;
     l_MemoryDC.CreateCompatibleDC( pDC ) ;
     CBitmap* l_pOldMemoryBitmap = l_MemoryDC.SelectObject( CBitmap::FromHandle( hBitmap ) ) ;
     
     l_BufferDC.BitBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(), &l_MemoryDC, 0, 0, SRCCOPY ) ;
     // l_BufferDC.BitBlt( x, y, rt.Width(), rt.Height(), &l_MemoryDC, rt.left,rt.top , SRCCOPY ) ;
     
     
     l_MemoryDC.SelectObject( l_pOldMemoryBitmap ) ;
     
     ////////////////////////////////////////////////////////////////////////////
     // Create the mask.
     ////////////////////////////////////////////////////////////////////////////
     
     COLORREF l_crOldBack = l_BufferDC.SetBkColor( rgb ) ;
     
     l_MaskDC.BitBlt( 0, 0, l_rcClient.Width(), l_rcClient.Height(), &l_BufferDC, 0, 0, SRCCOPY ) ;
     // l_MaskDC.BitBlt( x, y, rt.Width(), rt.Height(), &l_BufferDC, rt.left,rt.top, SRCCOPY ) ;
     
     l_BufferDC.SetBkColor( l_crOldBack ) ;
     
     ////////////////////////////////////////////////////////////////////////////
     // Draw the bitmap transparently now, since not all devices support this
     // and Windows 98 does not (duh?), if this fails, we do it the long way.
     ////////////////////////////////////////////////////////////////////////////
     BOOL  flag = pDC->MaskBlt( x, 
     y, 
     l_rcClient.Width(),
     l_rcClient.Height(),
     &l_BufferDC,
     rt.left,//0,
     rt.top,//0,
     l_MaskBitmap,
     rt.left,//0,
     rt.top,//0,
     ROP4_TRANSPARENTBLIT );
     if( !flag)
     {
     CDC  l_CopyDC ;
     l_CopyDC.CreateCompatibleDC( pDC ) ;
     CBitmap  l_CopyBitmap ;
     l_CopyBitmap.CreateCompatibleBitmap( pDC, l_rcClient.Width(), l_rcClient.Height() ) ;
     CBitmap* l_pOldCopyBitmap = l_CopyDC.SelectObject( &l_CopyBitmap ) ;
     l_CopyDC.BitBlt(   x, y, rt.Width(), rt.Height(), pDC,  rt.left,rt.top, SRCCOPY  ) ;
     l_CopyDC.BitBlt(   x, y, rt.Width(), rt.Height(), &l_MaskDC, rt.left,rt.top, SRCAND   ) ;
     l_BufferDC.BitBlt( x, y, rt.Width(), rt.Height(), &l_MaskDC, rt.left,rt.top, SRCMASK  ) ;
     l_CopyDC.BitBlt(   x, y, rt.Width(), rt.Height(), &l_BufferDC, rt.left,rt.top, SRCPAINT ) ;
     pDC->BitBlt(  x, y, l_rcClient.Width(), l_rcClient.Height(), &l_CopyDC,  rt.left,rt.top, SRCCOPY  ) ;
     
     l_CopyDC.SelectObject( l_pOldCopyBitmap ) ;
     }
     
     ////////////////////////////////////////////////////////////////////////////
     // Clean up.
     ////////////////////////////////////////////////////////////////////////////
     
     l_MaskDC.SelectObject( l_pOldMaskBitmap ) ;
     l_BufferDC.SelectObject( l_pOldBufferBitmap ) ;

    }RGB可传入rb(255,0,0)