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


  • 相关阅读:
    C#中的控件命名规范
    c# 执行javascript 脚本 并获得变量值 (winform与javascript交互 )
    C# Socket 实现的淘宝秒杀器(抢拍器)
    ASP函数 获取域名解析后的IP 获取远程网页的HTML代码
    C# 使用17方法编写Hello World程序(语法深度)
    框架内数据的打印。。。。
    有点厌恶写程序.....
    漂流的自白
    Asp.net中的页面乱码的问题
    在js 中根据 url 获取其参数
  • 原文地址:https://www.cnblogs.com/riskyer/p/3223593.html
Copyright © 2011-2022 走看看