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 );
    }
    


  • 相关阅读:
    Nginx 缓存解决方案
    Chrome去水印、自由复制的解决方法
    简单介绍正向代理和反向代理
    Lambda表达式
    项目集成hystrix-dashboard
    hystrix 添加turbine
    GsonUtil 工具类
    idea 去除import * 变成具体引入文件
    eureka 创建服务消费者
    eureka 创建注册服务提供方
  • 原文地址:https://www.cnblogs.com/riskyer/p/3223593.html
Copyright © 2011-2022 走看看