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?- void TranPic::LoadBmpResource(UINT bmpId)
- {
- m_bmpId = bmpId ;
- m_bitmap.LoadBitmap(bmpId);
- m_TranClr = RGB(0,0,0) ;
- }
通過函式void SetTranClr(COLORREF bgClr) ;來設定要透明掉的顏色,程式碼:
[cpp] view plaincopyprint?- void TranPic::SetTranClr(COLORREF bgClr)
- {
- m_TranClr = bgClr ;
- }
設定TranPic樣式為SS_BITMAP,這樣用SetBitmap,TranPic的大小會自動變成和bmp圖片一樣大,程式碼:
[cpp]- int TranPic::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CStatic::OnCreate(lpCreateStruct) == -1)
- return -1;
- HBITMAP bmp = GetBitmap() ;
- if (bmp == NULL)
- SetBitmap((HBITMAP)m_bitmap) ;
- return 0;
- }
在void TranPic::OnPaint()加入程式碼:
[cpp] view plaincopyprint?- CPaintDC dc(this);
- if (m_bitmap.m_hObject == NULL)
- return ;
- CRect rcClient ;
- GetClientRect(&rcClient) ;
- CDC MaskDC;
- CBitmap* pOldMask = NULL;
- MaskDC.CreateCompatibleDC(&dc) ;
- CDC MemoryDC ;
- CBitmap* pOldMemory = NULL;
- MemoryDC.CreateCompatibleDC(&dc) ;
- pOldMemory = MemoryDC.SelectObject(&m_bitmap);
- MemoryDC.SetBkColor(m_TranClr);
- if (m_mask.m_hObject == NULL)
- {
- //建立單色點陣圖
- m_mask.CreateBitmap(rcClient.Width(),rcClient.Height(),1,1,NULL);
- pOldMask = MaskDC.SelectObject(&m_mask);
- //繪製遮蔽點陣圖
- MaskDC.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemoryDC,0,0,SRCCOPY) ;
- }
- else
- {
- pOldMask = MaskDC.SelectObject(&m_mask);
- }
- dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemoryDC,0,0,SRCINVERT) ;
- dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MaskDC,0,0,SRCAND) ;
- dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&MemoryDC,0,0,SRCINVERT) ;
- MemoryDC.SelectObject(pOldMemory);
- MaskDC.SelectObject(pOldMask);
- }
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、把下面的函式加到你初始化的地方,然後你就可以使用