繪製透明背景點陣圖
一、繪製透明背景的點陣圖,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