1. 程式人生 > >繪製透明背景點陣圖

繪製透明背景點陣圖

一、繪製透明背景的點陣圖,windows提供了一個API函式

TransparentBlt

The TransparentBlt function performs a bit-block transfer of the color data corresponding to a rectangle of pixels from the specified source device context into a destination device context.

BOOL TransparentBlt(
  HDC ,        // handle to destination DC
  int
, // x-coord of destination upper-left corner int , // y-coord of destination upper-left corner int , // width of destination rectangle int , // height of destination rectangle HDC , // handle to source DC int , // x-coord of source upper-left corner int nYOriginSrc, // y-coord of source upper-left corner int
, // width of source rectangle int , // height of source rectangle UINT // color to make transparent );

使用起來也挺方便,如下
     // 載入顯示點陣圖
        CBitmap bmpTest;
        if ( bmpTest.LoadBitmap( IDB_BITMAP1 ) )
        {
            BITMAP bmpInfo;
            bmpTest.GetBitmap(&bmpInfo);

            CDC mBufferDC;
            mBufferDC.CreateCompatibleDC( 
&dc ); CBitmap* pOldBmp1 = mBufferDC.SelectObject( &bmpTest ); COLORREF bgColor = RGB( 27, 240, 67 ); // 點陣圖背景顏色 ::TransparentBlt( dc, 100, 100, bmpInfo.bmWidth, bmpInfo.bmHeight, mBufferDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, bgColor ); mBufferDC.SelectObject( pOldBmp1 ); }

二、下面模擬TransparentBlt的實現過程,探究下底層實現, 整個實現過程的思想如下圖所示,

程式碼如下:

{
        CPaintDC dc(this);
        
        // 刷顯示背景為綠色RGB( 125, 125, 200 )
        CRect rect;
        GetClientRect(&rect);
        dc.FillSolidRect( rect.left, rect.top, rect.right, rect.bottom, RGB( 125, 125, 200 ) );


        // 載入點陣圖
        CBitmap bmpToShow;
        if ( !bmpToShow.LoadBitmap( IDB_BITMAP1 ) )
        {
            return;
        }
        
        // 獲取點陣圖寬、高
        BITMAP bmpInfo;
        bmpToShow.GetBitmap(&bmpInfo);
        int nBmpWidth = bmpInfo.bmWidth;
        int nBmpHeight = bmpInfo.bmHeight;

        // 點陣圖背景色
        COLORREF bmpBkColor = RGB(27, 240, 67);

        // 點陣圖DC
        CDC bmpToShowDC;
        bmpToShowDC.CreateCompatibleDC( &dc );
        CBitmap* pOldBmp1 = bmpToShowDC.SelectObject( &bmpToShow );

        // 建立單色掩碼點陣圖
        CBitmap maskBmp;
        maskBmp.CreateBitmap( nBmpWidth, nBmpHeight, 1, 1, NULL );

        // 掩碼DC
        CDC bmpMaskDC;
        bmpMaskDC.CreateCompatibleDC( &dc );
        CBitmap* pOldBmp2 = bmpMaskDC.SelectObject( &maskBmp );

        // 【對應上圖步驟1】生成點陣圖的單色掩碼圖
        // 原理:如果目標dc的點陣圖是單色點陣圖,源dc的點陣圖是顏色點陣圖,
        // 則在實際光柵操作之前要把顏色點陣圖轉換成單色點陣圖,轉換規
        // 則是,顏色點陣圖中所有和背景色一致的象素都變成1,其他的象
        // 素都被轉換成0。
        bmpToShowDC.SetBkColor( bmpBkColor );
        bmpMaskDC.BitBlt( 0, 0, nBmpWidth, nBmpHeight, 
            &bmpToShowDC, 0, 0, SRCCOPY );

        // 【對應上圖步驟2】將顯示區域與單色點陣圖作AND操作
        // 原理:當目標dc的點陣圖是顏色點陣圖,源dc的點陣圖是單色的時候,
        // 單色點陣圖在實際的光柵操作(ROP)之前會被轉換成顏色點陣圖,
        // 對應的位如果是0,則被轉換目標dc的前景色,如果該位是1,
        // 則被轉換成目標dc的背景色。
        dc.SetBkColor( RGB(255, 255, 255) );
        dc.SetTextColor( RGB(0, 0, 0) );
        dc.BitBlt( 100, 100, nBmpWidth, nBmpHeight, 
            &bmpMaskDC, 0, 0, SRCAND );

//         // 【對應上圖步驟3】對掩碼進行取反操作
//         bmpMaskDC.BitBlt( 0, 0, nBmpWidth, nBmpHeight, 
//             &bmpMaskDC, 0, 0, NOTSRCCOPY );
// 
//         // 【對應上圖步驟4】原圖與掩碼進行AND操作
//         // 原理:當目標dc的點陣圖是顏色點陣圖,源dc的點陣圖是單色的時候,
//         // 單色點陣圖在實際的光柵操作(ROP)之前會被轉換成顏色點陣圖,
//         // 對應的位如果是0,則被轉換目標dc的前景色,如果該位是1,
//         // 則被轉換成目標dc的背景色。
//         bmpToShowDC.SetBkColor( RGB( 255, 255, 255 ));
//         bmpToShowDC.SetTextColor( RGB( 0, 0, 0) );
//         bmpToShowDC.BitBlt( 0, 0, nBmpWidth, nBmpHeight, 
//             &bmpMaskDC, 0, 0, SRCAND );
        
        // 步驟3和步驟4可以合併為一步
        // 原理:當目標dc的點陣圖是顏色點陣圖,源dc的點陣圖是單色的時候,
        // 單色點陣圖在實際的光柵操作(ROP)之前會被轉換成顏色點陣圖,
        // 對應的位如果是0,則被轉換目標dc的前景色,如果該位是1,
        // 則被轉換成目標dc的背景色。
        bmpToShowDC.SetBkColor( RGB( 0, 0, 0 ) );
        bmpToShowDC.SetTextColor( RGB( 255, 255, 255 ) );
        bmpToShowDC.BitBlt( 0, 0, nBmpWidth, nBmpHeight, 
            &bmpMaskDC, 0, 0, SRCAND );


        // 【對應上圖步驟5】生成目標圖片
        dc.BitBlt( 100, 100, nBmpWidth, nBmpHeight, 
            &bmpToShowDC, 0, 0, SRCPAINT );


        bmpMaskDC.SelectObject( pOldBmp2 );
        bmpToShowDC.SelectObject( pOldBmp1 );
    }

參考:

相關推薦

繪製透明背景點陣

一、繪製透明背景的點陣圖,windows提供了一個API函式 TransparentBlt The TransparentBlt function performs a bit-block transfer of the color data corresponding to a rectangle of p

MFC基於對話方塊如何新增點陣並使點陣背景透明(TransparentBlt函式)

MFC中比較重要的一部分學習內容即是繪圖,而繪圖時我們會發現如果想插入一張圖片而又不想要圖片的背景,或者已經把圖片的背景用Ps去掉了,但是在MFC視窗中顯示圖片的時候又有了白色的背景,這個時候就可以使用TransparentBlt函式(通常支援點陣圖)來實現將圖

VC對話方塊如何新增WM_ERASEBKGND訊息(OnEraseBkgnd函式)及對話方塊使用點陣背景透明

1、使用OnEraseBkgnd函式實現對話方塊點陣圖背景 BOOL CDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC   *pDC)   //老婆:增加擦出背景函式{ CRect rect; GetClientRect(&rect);  CBitmap m_p

使用BitBlt實現點陣背景透明

我們先看一下 BitBlt 這個函式的原型: BOOL BitBlt(int x, int y, int nWidth,nHeight, CDC* PsrcDC, int xSrc, int ySrc, DWORD dwRop); 引數介紹: int x          

VC對話方塊使用OnEraseBkgnd函式點陣背景透明

1、使用OnEraseBkgnd函式實現對話方塊點陣圖背景 BOOL CDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC   *pDC)   //增加擦除背景函式 {  CRect rect;  GetClientRect(&re

vscode 設置透明背景

ctu ack app www. 並不是 .... opacity nts lan 一.前言 今天看到了博客園 這篇文章 後 Visual Studio 2017 設置透明背景圖 ,琢磨了下難道vscode不行嗎。。 vscode目前有一個設置背景的插件 back

1.2為多變數資料繪製點陣

1 # 繪出6個圖形,包括了以下幾個列:花萼長度、花萼寬度、花瓣長度和花瓣寬度 2 plt.close('all') # 關掉其他的影象 3 plt.figure(1) 4 5 # 繪製一個3行2列的圖 6 subplot_start = 321 7 col_numbers = r

CSS Paint API繪製透明格子背景例項頁面

CSS程式碼: .box { width: 180px; height: 180px; background: paint(transparent-grid); } HTML程式碼: <div class="box"></div> JS程式碼: if (window.

DirectX遊戲程式設計入門——第二部分(遊戲程式設計工具箱) —— 繪製點陣

本系列文章由 net_assassin 整理編寫,轉載請註明出處。 http://blog.csdn.net/net_assassin/article/category/1100363 作者:net_assassin    郵箱: [em

自定義編輯框控制元件-點陣背景編輯框

#include "stdafx.h" //#include "BmpBKEdit.h" //IDB_BITMAP1 #include "BmpEdit.h" #include "resource.h" CBmpEdit::CBmpEdit() { m_Bitmap.LoadBitmap(IDB_BITM

MFC中實現點陣透明顯示

好久沒寫部落格了,嘗試著重新開張~ 最近在協助同事修改原有的一個程式,因為要申請個什麼東西,介面上也一直在下功夫。 原來的程式介面是用MFC做的,想新增一些圖片,不過圖片都不是矩形,周圍有白邊,為此,想將這些白邊做透明處理。遍尋網上解決方案,有所獲,如下: 我們在

vs2013 圖片背景·全透明背景

    如圖,單一色的vs總會讓人煩躁,如果換一個背景的話,肯定會讓程式猿更好的coding...    正式切入主題,以vs2013為例。    說明:經過一系列處理,會產生另一個vs2013實驗例項,即我們想要的目標,原版的vs2013也會存在,沒什麼變化。    準

php 縮放gif和png透明背景變成黑色的解決方法

工作中需要縮放一些png、gif圖然後在去Imagecopymerge,可是發現使用了imagecreatetruecolor和imagecopyresampled後發現本來透明的背景圖變成了黑色。 $img = imagecreatetruecolor(

6.VC(ui)-MFC下實現透明點陣

 我們在進行程式的介面設計時,常常希望將點陣圖的前景顯示在介面上,而將點陣圖的背景隱藏起來,將點陣圖與介面很自然的融合在一起,本文介紹了透明點陣圖的製作知識,並將透明點陣圖在一個對話方塊中顯示了出來。 直接上圖:原圖:Demo效果圖: 步驟如下:   1、設定待顯示點陣圖的

透明點陣的顯示(TransparentBlt函式)

包含透明色的點陣圖的繪製方法有多種,最簡單的方法是呼叫現成的函式:TransparentBlt,也可以通過自己的程式碼實現類似TransparentBlt的功能,實現過程也有兩種形式,一種是事先做一張掩碼點陣圖,另一種是動態生成掩碼點陣圖。本文將介紹動態生成掩碼點陣圖繪製

帶半透明背景的彈框(dialog)

在開發中。我們經常會遇到帶半透明背景圖的彈框 ,如圖: 我在開發中用到這種情況也比較多。剛開始在網上搜尋了很多資料。但是很多隻寫了一般。達不到實際效果。自己根據資料還有實踐最終實現了效果:廢話不多說。直接上程式碼 首先自定義一個半透明的背景樣式 <!-- 對話方塊

透明點陣Ron Gery Microsoft 網路開發技術小組

摘要 這篇文章討論了在 Microsoft Windows 圖形環境中用點陣圖達到透明和遮蔽效果的幾種方法,包括通過模擬和使用特殊的驅動器功能。包含其中的一個小樣本應用程式 TRANSBLT 詳細闡明瞭這篇文章討論的大多數方法。 介紹 使用透明(TRANSPARENT)背景

MFC學習之 背景及控制元件透明

在CDialog類中進行貼圖,一般放在OnPaint()函式中,因為視窗更新時,使用它來進行重繪。在OnPain()中貼圖的原始碼如下: void C***Dialog::OnPaint() { CPaintDC dc(this); // device contex

MFC透明點陣顯示函式

研究好久才弄好,註釋的比較詳細,不明白的函式可以參考MSDN   bool TransparentDIB(CBitmap * dib, /*要繪製的點陣圖*/ CDC * pDC, /*目標DC*/ CRect * rct, /*目標矩形*/ C

GDI之繪製點陣

#include <Windows.h> #include "resource.h" #include <wingdi.h> #pragma comment(lib,"msimg32.lib") // 視窗處理函式 HINSTANCE g_hIns