zoukankan      html  css  js  c++  java
  • 绘制透明背景位图

    // when blitting from a monochrome DC to a color DC, 
    // the color black in the source turns into the destination's text color, 
    // and the color white in the source turns into the destination's background color. 
    // If you blit from a color DC to a monochrome DC, 
    // then all pixels in the source that are equal to the background color will turn white, and all other pixels will turn black. 
    // In other words, GDI considers a monochrome bitmap to be black pixels on a white background. 
    static void DrawTransBmp( HDC hDst, HBITMAP hImg, COLORREF clrTran )
    {
        COLORREF colorOldFront;
        COLORREF colorOldBg;
    
        BITMAP bmp;
        GetObject( hImg, sizeof( bmp ), &bmp );
    
        HDC hForeDC = ::CreateCompatibleDC( hDst );
    	::SelectObject ( hForeDC, hImg );
    
        //prepare mask dc
        HDC hDCMask = CreateCompatibleDC ( hDst );
        // MSDN:    When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it.
        //          If this memory device context is used in CreateCompatibleBitmap, the bitmap that is created is a monochrome bitmap. 
        HBITMAP hBmpMask = CreateCompatibleBitmap( hDCMask, bmp.bmWidth, bmp.bmHeight );
    	::SelectObject ( hDCMask, hBmpMask );
        ::SetBkColor( hForeDC, clrTran );                                                //Set clrTran as blackground color
        ::BitBlt( hDCMask, 0, 0, bmp.bmWidth, bmp.bmHeight, hForeDC, 0, 0, SRCCOPY );    //monochrome, background color is white
    
        //mask the foreground 
        ::SetBkColor( hForeDC, RGB(0,0,0) );
        ::SetTextColor( hForeDC, RGB(255,255,255) );
    	::BitBlt( hForeDC, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCMask, 0, 0, SRCAND );
    
        //mask the background
        colorOldBg = ::SetBkColor( hDst, RGB(255,255,255) );
        colorOldFront = ::SetTextColor( hDst, RGB(0,0,0) );
    	::BitBlt( hDst, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCMask, 0, 0, SRCAND ); 
    
        //or foreground and background
    	::BitBlt( hDst, 0, 0, bmp.bmWidth, bmp.bmHeight, hForeDC, 0, 0, SRCPAINT );
    
        //recover hDst color of background and foreground
        ::SetBkColor( hDst, colorOldBg );
        ::SetTextColor( hDst, colorOldFront );
    
        //release object
        ::DeleteDC( hDCMask );
        ::DeleteDC( hForeDC );
        ::DeleteObject( hBmpMask );
    }
    


  • 相关阅读:
    远程连接Oracle 服务器 解决Oracle查询中文乱码
    sql 复杂查询 以teacher student course多对多关系为例
    ZooKeeper 分布式锁实现
    zookeeper原理解析-客户端与服务器端交互
    zookeeper原理解析-服务器端处理流程
    zookeeper原理解析-选举
    zookeeper原理解析-序列化
    深入浅出 Redis client/server交互流程
    zookeeper原理解析-数据存储
    RocketMQ原理解析-Remoting
  • 原文地址:https://www.cnblogs.com/riskyer/p/3223593.html
Copyright © 2011-2022 走看看