![用VC實(shí)現(xiàn)異形窗口_第1頁](http://file4.renrendoc.com/view/fc3f91d954a0f0bab10ea8cdb55da89b/fc3f91d954a0f0bab10ea8cdb55da89b1.gif)
![用VC實(shí)現(xiàn)異形窗口_第2頁](http://file4.renrendoc.com/view/fc3f91d954a0f0bab10ea8cdb55da89b/fc3f91d954a0f0bab10ea8cdb55da89b2.gif)
![用VC實(shí)現(xiàn)異形窗口_第3頁](http://file4.renrendoc.com/view/fc3f91d954a0f0bab10ea8cdb55da89b/fc3f91d954a0f0bab10ea8cdb55da89b3.gif)
![用VC實(shí)現(xiàn)異形窗口_第4頁](http://file4.renrendoc.com/view/fc3f91d954a0f0bab10ea8cdb55da89b/fc3f91d954a0f0bab10ea8cdb55da89b4.gif)
![用VC實(shí)現(xiàn)異形窗口_第5頁](http://file4.renrendoc.com/view/fc3f91d954a0f0bab10ea8cdb55da89b/fc3f91d954a0f0bab10ea8cdb55da89b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——用VC實(shí)現(xiàn)異形窗口151505183.doc7-1
用VC++實(shí)現(xiàn)異形窗口.
隨著Microsoft依據(jù)Windows在操作系統(tǒng)上取得的巨大成績,Windows用戶界面也日益成為業(yè)界標(biāo)準(zhǔn)。統(tǒng)一的界面給廣大用戶對(duì)應(yīng)用軟件的學(xué)習(xí)與使用帶來了很大便利。但每天都面對(duì)同一副面孔,日久天長難免會(huì)產(chǎn)生一些厭倦,開發(fā)一些“離經(jīng)叛道〞,一改Windows應(yīng)用程序千篇一律的“標(biāo)準(zhǔn)〞界面,一定會(huì)給你帶來一種清爽的感覺。
標(biāo)準(zhǔn)Windows應(yīng)用程序窗口一般為帶有標(biāo)題欄的淺灰色矩形外觀,因而“異形〞對(duì)話框/窗口也主要是顏色與外形上動(dòng)手腳。
1.改變背景顏色
改變對(duì)話框(窗口)的背景顏色是最簡單的改變Windows應(yīng)用程序外觀的方法,根據(jù)Windows創(chuàng)立與管理機(jī)理,一般有兩種方法。一種是處理WM_CTLCOLOR消息,首先創(chuàng)立所選背景顏色的刷子,然后調(diào)用SetBkColor()或SetDialogBkColor()以所創(chuàng)立的刷子來繪制窗口或?qū)υ捒虻谋尘啊P枰禺嫶翱诨驅(qū)υ挘ɑ驅(qū)υ挼淖涌丶r(shí),Windows向?qū)υ挵l(fā)送消息WM_CTLCOLOR,應(yīng)用程序處理WM_CTLCOLOR消息并返回一個(gè)用來繪畫對(duì)話背景的刷子句柄。另外一種是響應(yīng)Windows的WM_ERASEBKGND消息,Windows向窗口發(fā)送一個(gè)WM_ERASEBKGND消息通知該窗口擦除背景,可以使用VC++的ClassWizard重載該消息的缺省處理程序來擦除背景(實(shí)際是用刷子畫),并返回TRUE以防止Windows擦除窗口。
2.改變窗口外形
通過使用新的SDK函數(shù)SetWindowRgn(),可以將繪畫和鼠標(biāo)消息限定在窗口的一個(gè)指定的區(qū)域,因此實(shí)際上是使窗口成為指定的不規(guī)則形狀(區(qū)域形狀)?!皡^(qū)域〞是WindowsGDI中一種強(qiáng)有力的機(jī)制,區(qū)域是設(shè)備上的一塊空間,可以是任意形狀,繁雜的區(qū)域可以由各個(gè)小區(qū)域組合而成。Windows內(nèi)含的區(qū)域創(chuàng)立函數(shù)有CreateRectRgn()、CreatePolyRgn()、CreatePolygonRgn()、CreateRoundRectRgn()和CreateEllipticRgn(),再通過CombineRgn()來組合區(qū)域,即可得到繁雜形狀的區(qū)域,獲得繁雜形狀的窗口外形。
通過上面的方法雖然可以得到“異形〞窗口,但感覺顏色單調(diào),外形也不夠“COOL〞,能否獲得更酷的“異形〞對(duì)話框/窗口呢?回復(fù)是確定的。下面就介紹利用位圖和蒙板創(chuàng)立“異形〞對(duì)話框/窗口的方法。
3.利用位圖創(chuàng)立異形對(duì)話框窗口
利用位圖創(chuàng)立異形對(duì)話框原理是根據(jù)象素的顏色來進(jìn)行“扣像〞處理,對(duì)所有非指定顏色象素區(qū)域進(jìn)行區(qū)域組合。利用這一技術(shù),實(shí)際上就是實(shí)現(xiàn)對(duì)話框/窗口的位圖背景,并且對(duì)指定的顏色區(qū)域進(jìn)行透明處理。下面就以透明位圖為背景的對(duì)話框?yàn)槔齺碚f明:
首先用繪圖軟件如PhotoShop繪制編輯一幅擬做對(duì)話框背景用的圖片,用BMP格式保存,假設(shè)存為Back.Bmp。需要說明的是,雖然VisualC++集成開發(fā)環(huán)境的資源編輯器只能編輯不超過16色的位圖,但完全我們可以以真彩色方式存儲(chǔ),不必搭理VisualC++的警告。下一步是用VisualC++的AppWizard創(chuàng)立一個(gè)基于對(duì)話框的應(yīng)用程序假定命名為Trans。用資源編輯器引入背景圖片Back.Bmp,假使是高彩色,不必搭理出現(xiàn)的警告信息,點(diǎn)擊OK確認(rèn)即可。為了明確,修改默認(rèn)的資源ID標(biāo)識(shí)IDB_BITMAP1為IDB_BACKBMP。然后修改對(duì)話框的Style為Popup,Border為None,如圖1。
151505183.doc7-2
圖1
向CTransDlg類添加區(qū)域處理功能模塊voidCTransDlg::SetupRegion(CDC*pDC/*對(duì)話框窗口DC*/,UINTBackBitmapID/*背景位圖資源ID*/,UINTMaskBitmapID/*區(qū)域處理位圖資源ID*/,COLORREFTransColor=0x00000000/*透明顏色值,默認(rèn)為黑色*/)。到目前為止,我們暫時(shí)認(rèn)為MaskBitmapID等同于BackBitmapID。其核心工作是根據(jù)MaskBitmapID指示位圖的象素顏色進(jìn)行區(qū)域組合。完整的代碼如下:
voidCTransDlg::SetupRegion(CDC*pDC/*對(duì)話框窗口DC*/,
UINTBackBitmapID/*背景位圖資源ID*/,
UINTMaskBitmapID/*區(qū)域處理位圖資源ID*/,COLORREFTransColor/*透明顏色值*/){
CDCCBitmap
memDC;cBitmap;
pOldMemBmp=NULL;cl;
cRect;x,y;
wndRgn,rgnTemp;
CBitmap*COLORREFCRectUINTCRgn
//取得窗口大小
GetWindowRect(//背景位圖資源ID
m_BackBitmapID=BackBitmapID//裝載位圖
cBitmap.LoadBitmap(MaskBitmapID);memDC.CreateCompatibleDC(pDC);
pOldMemBmp=memDC.SelectObject(//首先創(chuàng)立默認(rèn)的完整區(qū)域?yàn)橥暾拇翱趨^(qū)域
wndRgn.CreateRectRgn(0,0,cRect.Width(),cRect.Height());
151505183.doc7-3
//下面的兩層循環(huán)為檢查背景位圖象素顏色,進(jìn)行透明區(qū)域處理;//當(dāng)象素顏色為指定的透明值時(shí),即將該點(diǎn)從區(qū)域中剪裁掉。//其中用到的幾個(gè)成員變量m_MaskLeftOff、m_MaskTopOff、//m_MaskRightOff、m_MaskBottomOff、m_FrameWidth
//和m_CaptionHeight,其作用后面再作說明,此時(shí)可全部當(dāng)作0來處理。for(x=m_FrameWidth+m_MaskLeftOff;
xBitBlt(0,0,rect.Width(),rect.Height(),
if(pOldMemBmp)memDC.SelectObject(pOldMemBmp);//刪除系統(tǒng)卻省的OnEraseBkgnd功能//returnCDialog::OnEraseBkgnd(pDC);returnTRUE;
接下來是在WM_PAINT的消息處理函數(shù)OnPaint()中添加代碼。由于當(dāng)背景位圖比較大時(shí),進(jìn)行區(qū)域處理比較耗時(shí),所以只在啟動(dòng)時(shí)進(jìn)行一次處理。一種方法是OnInitDialog()處理,但這樣會(huì)在從啟動(dòng)程序到窗口出現(xiàn)有相當(dāng)?shù)难舆t,易引起程序尚未啟動(dòng)的誤會(huì)。再一種方法就是在OnPaint()處理,但為了避免重復(fù)處理,可以加上一個(gè)判斷標(biāo)志。以下是OnPaint()的代碼,正體為AppWizard生成,粗體為自己添加內(nèi)容。
voidCTransDlg::OnPaint(){
if(IsIconic()){??}else{
if(m_nFirstRun){//首次運(yùn)行標(biāo)志//修改鼠標(biāo)光標(biāo)為等待方式BeginWaitCursor();
//設(shè)置背景區(qū)域
SetupRegion(GetWindowDC(),
IDB_BACKBMP,IDB_BACKBMP,0x00FFFFFF/*白色*/);
//恢復(fù)鼠標(biāo)光標(biāo)為正常模式
}
}
EndWaitCursor();m_nFirstRun=0;
CDialog::OnPaint();
}
剩下的工作就是根據(jù)背景位圖的大小來設(shè)置對(duì)話框窗口的大小和位置,這可以在
151505183.doc7-5
OnInitDialog()中通過調(diào)用MoveWindow()來實(shí)現(xiàn)。再添加一些變量的聲名和初始化,即可編譯運(yùn)行。圖2為運(yùn)行結(jié)果例如:
圖2
4.進(jìn)一步的探討
前面實(shí)現(xiàn)了單一模式的異形對(duì)話框,但有些狀況下又需要不同的樣式,如有標(biāo)題欄、邊框等,或者只作局部的處理,這就是前面兩個(gè)成員變量m_FrameWidth和m_CaptionHeight作用,通過在OnInitDialog()判斷窗口樣式,使m_FrameWidth和m_CaptionHeight取不同的值。這部分的代碼為:
BOOLCTransBmpDlg::OnInitDialog(){??
//TODO:Addextrainitializationherem_nFirstRun=1;
//數(shù)據(jù)設(shè)置,窗口左上角坐標(biāo):m_Left=0,m_Top=0//背景位圖寬高:m_Width=535,m_Height=105
SetSize(0,0,535,105);
//蒙板處理區(qū)域與窗口邊框的距離
m_MaskLeftOff=m_MaskTopOff=m_MaskRightOff=m_MaskBottomOff=0;
//窗口邊框與標(biāo)題欄象素值
m_FrameWidth=m_CaptionHeight=0;
//取得窗口樣式
LONGstyle
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年葉酸孕期營養(yǎng)片企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030年可編程電源電路設(shè)計(jì)企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 企業(yè)保潔服務(wù)合同范例
- 2025-2030年堅(jiān)果質(zhì)量檢測服務(wù)行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年手繪服裝定制企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030年按摩設(shè)備跨境電商行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 代理經(jīng)銷產(chǎn)品合同范例
- 農(nóng)村抽水協(xié)議合同范本
- 買賣兜底合同范本
- 關(guān)于app使用合同范本
- PPK計(jì)算模板完整版
- 居民自建房經(jīng)營業(yè)態(tài)不超過三種承諾書
- 河南省陜州區(qū)王家后鄉(xiāng)滹沱鋁土礦礦產(chǎn)資源開采與生態(tài)修復(fù)方案
- 2015-2022年大慶醫(yī)學(xué)高等專科學(xué)校高職單招語文/數(shù)學(xué)/英語筆試參考題庫含答案解析
- 兩篇古典英文版成語故事塞翁失馬
- 中國古代文學(xué)史 馬工程課件(中)13第五編 宋代文學(xué) 第一章 北宋初期文學(xué)
- 中國高血壓臨床實(shí)踐指南(2022版)解讀
- 最常用漢字5000個(gè)
- 《了凡四訓(xùn)》課件
- 醫(yī)院住院病人健康教育表
- 不良資產(chǎn)與處置課件
評(píng)論
0/150
提交評(píng)論