1. 程式人生 > >MFC中實現點陣圖的透明顯示

MFC中實現點陣圖的透明顯示

好久沒寫部落格了,嘗試著重新開張~

最近在協助同事修改原有的一個程式,因為要申請個什麼東西,介面上也一直在下功夫。

原來的程式介面是用MFC做的,想新增一些圖片,不過圖片都不是矩形,周圍有白邊,為此,想將這些白邊做透明處理。遍尋網上解決方案,有所獲,如下:

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

步驟如下:
  1、設定待顯示點陣圖的背景顏色,也就是設定我們希望透明顯示的點陣圖顏色;
  2、點陣圖裝置描述表以"SRCINVERT"的方式繪製(BitBlt)到顯示裝置描述表上;
  3、"掩碼"點陣圖裝置描述表以"SRCAND"的方式繪製(BitBlt)到顯示裝置描述表上;
  4、再次將點陣圖裝置描述表以"SRCINVERT"的方式繪製(BitBlt)到顯示裝置描述表上。
  這樣除"透明色"外的其餘點陣圖部分(影象部分)就被繪製到視窗上了。

1的實現可以通過PS直接取得RGB(224,96,64)。

Demo把圖片貼在一個樣式為SS_BITMAP的static子類下,通過函式void LoadBmpResource(UINT bmpId) ;來載入要透明的圖片ID,程式碼:

[cpp] view plaincopyprint?
  1. void TranPic::LoadBmpResource(UINT bmpId)  
  2. {  
  3.     m_bmpId = bmpId ;  
  4.     m_bitmap.LoadBitmap(bmpId);  
  5.     m_TranClr = RGB(0,0,0) ;  
  6. }  

通過函式void SetTranClr(COLORREF bgClr) ;來設定要透明掉的顏色,程式碼:

[cpp] view plaincopyprint?
  1. void TranPic::SetTranClr(COLORREF bgClr)  
  2. {  
  3.     m_TranClr = bgClr ;  
  4. }  

設定TranPic樣式為SS_BITMAP,這樣用SetBitmap,TranPic的大小會自動變成和bmp圖片一樣大,程式碼:

[cpp]
view plaincopyprint?
  1. int TranPic::OnCreate(LPCREATESTRUCT lpCreateStruct)  
  2. {  
  3.     if (CStatic::OnCreate(lpCreateStruct) == -1)  
  4.         return -1;  
  5.     HBITMAP bmp = GetBitmap() ;  
  6.     if (bmp == NULL)  
  7.         SetBitmap((HBITMAP)m_bitmap) ;  
  8.     return 0;  
  9. }  

在void TranPic::OnPaint()加入程式碼:

[cpp] view plaincopyprint?
  1. CPaintDC dc(this);   
  2.     if (m_bitmap.m_hObject == NULL)  
  3.         return ;  
  4.     CRect rcClient ;  
  5.     GetClientRect(&rcClient) ;  
  6.     CDC MaskDC;  
  7.     CBitmap* pOldMask = NULL;  
  8.     MaskDC.CreateCompatibleDC(&dc) ;  
  9.     CDC MemoryDC ;  
  10.     CBitmap* pOldMemory = NULL;  
  11.     MemoryDC.CreateCompatibleDC(&dc) ;  
  12.     pOldMemory = MemoryDC.SelectObject(&m_bitmap);  
  13.     MemoryDC.SetBkColor(m_TranClr);  
  14.     if (m_mask.m_hObject == NULL)  
  15.     {  
  16.         //建立單色點陣圖
  17.         m_mask.CreateBitmap(rcClient.Width(),rcClient.Height(),1,1,NULL);  
  18.         pOldMask = MaskDC.SelectObject(&m_mask);  
  19.         //繪製遮蔽點陣圖
  20.         MaskDC.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemoryDC,0,0,SRCCOPY) ;  
  21.     }  
  22.     else
  23.     {  
  24.         pOldMask = MaskDC.SelectObject(&m_mask);  
  25.     }  
  26.     dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemoryDC,0,0,SRCINVERT) ;  
  27.     dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MaskDC,0,0,SRCAND) ;  
  28.     dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemoryDC,0,0,SRCINVERT) ;  
  29.     MemoryDC.SelectObject(pOldMemory);  
  30.     MaskDC.SelectObject(pOldMask);  
  31. }  

 SRCCOPY src   直接將源點陣圖拷貝到目的裝置上。
 SRCAND src AND dest 將目標檔案中對應於原始檔黑色區域的部分變黑,將對應於白色區域的部分留著不動。
 SRCINVERT src XOR dest 將源插入到目標。二次使用時,將目標恢復到它原來的狀態。在某種條件下可以代替SRCPAINT 操作。
 SRCPAINT src OR dest 將原始檔中的白色區域刷到目標檔案中。源中的黑色區域不轉換到目標中。

相關推薦

MFC實現點陣透明顯示

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

MFC實現簡單的點陣顯示、處理

最近在做影象採集的工作,需要處理影象資料,所以學習了一下點陣圖顯示,而且只看了裝置相關點陣圖DDB。基本上實現了點陣圖的顯示、點陣圖資料的處理等功能。這裡就記錄一下我自己的理解,不一定全都對,僅供參考而已。 要顯示點陣圖,需要做如下工作: CStatic* pStati

透明點陣顯示(TransparentBlt函式)

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

MFC的對話方塊建立點陣按鈕

1.可新建一個類ImageButton(繼承自CButton),並設定其風格為自繪: ModifyStyle(0,BS_OWNERDRAW);ImageButton.h:class ImageButton : public CButton{private: public: I

使用BitBlt實現點陣背景透明

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

html實現數據的顯示和隱藏

func 隱藏 obj else content cli solid head utf Author: YangQingQing <!DOCTYPE html><html><meta http-equiv="Content-Type" co

(轉)如何在ie6/ie7/ie8實現iframe背景透明

最近做了一個專案,涉及到ie8iframe背景透明的問題,做了老半天,才把它搞定的,現在把我的經歷貼出來和大家分享: 眾所周知的根據W3C CSS 2.1 規範規定,''''background-color'''' 特性的預設值為 ''''transparent''''

MFC實現ListControl翻頁功能

一。寫程式碼前的準備: 功能如下:       1.創造工程 testDlg,在對話方塊標頭檔案中定義,四個公有變數        int pageNo; //頁數編號 int pageSize; //

MFC實現父對話方塊與子對話方塊之間的引數傳遞,例項可測

一、構件工程: 1.新建一個工程CPassParametersDlg,在介面上新增一個Edit(新增變數:m_result),    新增兩個Button其他設定預設,修改Caption分別為:啟動子對話方塊||傳送資料給子視窗 2.在CPassParametersDlg.

MFC 實現在客戶區拖動來拖動視窗的方法總結

VC++實現無標題欄對話方塊的拖動 其實說白了就是欺騙,欺騙誰了?呵呵,當然是欺騙windows,本來是移動標題欄可以拖動窗體,那麼我們現在是拖動客戶區來移動,當我們拖動標題欄的時候windows產生一個WM_NCHITTEST訊息,這個訊息確定滑鼠點選的哪個位置,這個訊息

MFC實現單個控制元件接收拖拽檔案的功能

現在有很多軟體都支援拖拽功能,就是用滑鼠拖著檔案放到軟體視窗中某個位置,軟體就可以做出相應的反應。比如,Windows自帶的播放軟體Windows Media Player,你可以拖著一個媒體檔案放到它的主視窗中,它就會開始播放這個檔案。 怎麼讓自己的軟體也有這個功能呢?

SSM框架實現將json串顯示到前臺頁面

首先在Controller中的方法中定義如下如所示: JSONObject json = new JSONObject(); json.put("vcode", Vcode); json.put("username", "username"); json.put("

MFC實現單擊按鈕彈出對話方塊的方法

1、資源檢視-->Dialog-->右鍵-->新增資源-->新建-->對話方塊-->對話方塊按右鍵--新增類。例:新增CNewDlg類,在所要調的程式碼中(按鈕點選方法中),先加標頭檔案#include  "CNewDlg.h ",之後

Android平臺實現點陣(Bitmap)的序列化和反序列化

android整個上層java開發框架可以分為四個方面:介面(activity和appwidget)、訊息(Intent和Message)、服務(Service)和資料(Sqllite、Content Provider)。1.新的序列化方式:android提供了一種新的型別

html實現

//餅圖顯示 <p>      <canvas id="canvas_circle" width="290" height="200"> </canvas>   </p> //繪製 <script>

在我的世界實現聊天框持續顯示人物座標

import mcpi.minecraft as minecraft#使程式可以呼叫minecraft的遊戲資源 import time#匯入了時間模組,以便控制以一定的時間間隔顯示座標 mc= minecraft.Minecraft.create()#使程式可

安卓百度地圖開發(四)在定點陣顯示他人位置

在這篇部落格中主要做了兩個工作① 新增顯示他人位置的marker② 將他人頭像作為圖片合併到marker中進行顯示主要程式碼:① 新增他人位置這段程式碼可以新增到建構函式中,或者從伺服器獲取到他人位置後的程式碼中去//新增他人位置 Resources r =

ArcGIS API for JavaScript實現顯示

大家都知道,當用ArcGIS釋出地圖服務時,是把整個地圖文件所有圖層都發布出去的,如果展示的時候只想顯示某個圖層怎麼辦呢?或許你會用FeatureLayer,這樣做當然也能實現,但是在地圖文件中

vc載入bmp點陣顯示

方法一、顯示點陣圖檔案 HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,_T(“xxx.bmp”),Image_Bitmap,0,0,Lr_CreateDibSection|Lr_DefaultSize|Lr_LoadFromFile)

VS2010 MFC實現printf除錯功能,即MFC程式利用控制檯輸出除錯資訊

原文地址: 包含的標頭檔案,原文看不到,這裡我添上了 1、在專案自動生成的stdafx.h檔案中新增下面標頭檔案 #include <io.h> #include <fcntl.h> 2、把下面的函式加到你初始化的地方,然後你就可以使用