版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——用VC實現(xiàn)異形窗口151505183.doc7-1
用VC++實現(xiàn)異形窗口.
隨著Microsoft依據(jù)Windows在操作系統(tǒng)上取得的巨大成績,Windows用戶界面也日益成為業(yè)界標(biāo)準(zhǔn)。統(tǒng)一的界面給廣大用戶對應(yīng)用軟件的學(xué)習(xí)與使用帶來了很大便利。但每天都面對同一副面孔,日久天長難免會產(chǎn)生一些厭倦,開發(fā)一些“離經(jīng)叛道〞,一改Windows應(yīng)用程序千篇一律的“標(biāo)準(zhǔn)〞界面,一定會給你帶來一種清爽的感覺。
標(biāo)準(zhǔn)Windows應(yīng)用程序窗口一般為帶有標(biāo)題欄的淺灰色矩形外觀,因而“異形〞對話框/窗口也主要是顏色與外形上動手腳。
1.改變背景顏色
改變對話框(窗口)的背景顏色是最簡單的改變Windows應(yīng)用程序外觀的方法,根據(jù)Windows創(chuàng)立與管理機(jī)理,一般有兩種方法。一種是處理WM_CTLCOLOR消息,首先創(chuàng)立所選背景顏色的刷子,然后調(diào)用SetBkColor()或SetDialogBkColor()以所創(chuàng)立的刷子來繪制窗口或?qū)υ捒虻谋尘?。需要重畫窗口或?qū)υ挘ɑ驅(qū)υ挼淖涌丶r,Windows向?qū)υ挵l(fā)送消息WM_CTLCOLOR,應(yīng)用程序處理WM_CTLCOLOR消息并返回一個用來繪畫對話背景的刷子句柄。另外一種是響應(yīng)Windows的WM_ERASEBKGND消息,Windows向窗口發(fā)送一個WM_ERASEBKGND消息通知該窗口擦除背景,可以使用VC++的ClassWizard重載該消息的缺省處理程序來擦除背景(實際是用刷子畫),并返回TRUE以防止Windows擦除窗口。
2.改變窗口外形
通過使用新的SDK函數(shù)SetWindowRgn(),可以將繪畫和鼠標(biāo)消息限定在窗口的一個指定的區(qū)域,因此實際上是使窗口成為指定的不規(guī)則形狀(區(qū)域形狀)?!皡^(qū)域〞是WindowsGDI中一種強(qiáng)有力的機(jī)制,區(qū)域是設(shè)備上的一塊空間,可以是任意形狀,繁雜的區(qū)域可以由各個小區(qū)域組合而成。Windows內(nèi)含的區(qū)域創(chuàng)立函數(shù)有CreateRectRgn()、CreatePolyRgn()、CreatePolygonRgn()、CreateRoundRectRgn()和CreateEllipticRgn(),再通過CombineRgn()來組合區(qū)域,即可得到繁雜形狀的區(qū)域,獲得繁雜形狀的窗口外形。
通過上面的方法雖然可以得到“異形〞窗口,但感覺顏色單調(diào),外形也不夠“COOL〞,能否獲得更酷的“異形〞對話框/窗口呢?回復(fù)是確定的。下面就介紹利用位圖和蒙板創(chuàng)立“異形〞對話框/窗口的方法。
3.利用位圖創(chuàng)立異形對話框窗口
利用位圖創(chuàng)立異形對話框原理是根據(jù)象素的顏色來進(jìn)行“扣像〞處理,對所有非指定顏色象素區(qū)域進(jìn)行區(qū)域組合。利用這一技術(shù),實際上就是實現(xiàn)對話框/窗口的位圖背景,并且對指定的顏色區(qū)域進(jìn)行透明處理。下面就以透明位圖為背景的對話框為例來說明:
首先用繪圖軟件如PhotoShop繪制編輯一幅擬做對話框背景用的圖片,用BMP格式保存,假設(shè)存為Back.Bmp。需要說明的是,雖然VisualC++集成開發(fā)環(huán)境的資源編輯器只能編輯不超過16色的位圖,但完全我們可以以真彩色方式存儲,不必搭理VisualC++的警告。下一步是用VisualC++的AppWizard創(chuàng)立一個基于對話框的應(yīng)用程序假定命名為Trans。用資源編輯器引入背景圖片Back.Bmp,假使是高彩色,不必搭理出現(xiàn)的警告信息,點擊OK確認(rèn)即可。為了明確,修改默認(rèn)的資源ID標(biāo)識IDB_BITMAP1為IDB_BACKBMP。然后修改對話框的Style為Popup,Border為None,如圖1。
151505183.doc7-2
圖1
向CTransDlg類添加區(qū)域處理功能模塊voidCTransDlg::SetupRegion(CDC*pDC/*對話框窗口DC*/,UINTBackBitmapID/*背景位圖資源ID*/,UINTMaskBitmapID/*區(qū)域處理位圖資源ID*/,COLORREFTransColor=0x00000000/*透明顏色值,默認(rèn)為黑色*/)。到目前為止,我們暫時認(rèn)為MaskBitmapID等同于BackBitmapID。其核心工作是根據(jù)MaskBitmapID指示位圖的象素顏色進(jìn)行區(qū)域組合。完整的代碼如下:
voidCTransDlg::SetupRegion(CDC*pDC/*對話框窗口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ū)域為完整的窗口區(qū)域
wndRgn.CreateRectRgn(0,0,cRect.Width(),cRect.Height());
151505183.doc7-3
//下面的兩層循環(huán)為檢查背景位圖象素顏色,進(jìn)行透明區(qū)域處理;//當(dāng)象素顏色為指定的透明值時,即將該點從區(qū)域中剪裁掉。//其中用到的幾個成員變量m_MaskLeftOff、m_MaskTopOff、//m_MaskRightOff、m_MaskBottomOff、m_FrameWidth
//和m_CaptionHeight,其作用后面再作說明,此時可全部當(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)背景位圖比較大時,進(jìn)行區(qū)域處理比較耗時,所以只在啟動時進(jìn)行一次處理。一種方法是OnInitDialog()處理,但這樣會在從啟動程序到窗口出現(xiàn)有相當(dāng)?shù)难舆t,易引起程序尚未啟動的誤會。再一種方法就是在OnPaint()處理,但為了避免重復(fù)處理,可以加上一個判斷標(biāo)志。以下是OnPaint()的代碼,正體為AppWizard生成,粗體為自己添加內(nèi)容。
voidCTransDlg::OnPaint(){
if(IsIconic()){??}else{
if(m_nFirstRun){//首次運行標(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è)置對話框窗口的大小和位置,這可以在
151505183.doc7-5
OnInitDialog()中通過調(diào)用MoveWindow()來實現(xiàn)。再添加一些變量的聲名和初始化,即可編譯運行。圖2為運行結(jié)果例如:
圖2
4.進(jìn)一步的探討
前面實現(xiàn)了單一模式的異形對話框,但有些狀況下又需要不同的樣式,如有標(biāo)題欄、邊框等,或者只作局部的處理,這就是前面兩個成員變量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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 木通食品添加劑研究-深度研究
- 攝影師經(jīng)紀(jì)行業(yè)發(fā)展趨勢-深度研究
- 產(chǎn)地溯源系統(tǒng)-深度研究
- 微生物組學(xué)與健康-深度研究
- 2025年廣西建設(shè)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年廣西交通職業(yè)技術(shù)學(xué)院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 多能源互補(bǔ)優(yōu)化-深度研究
- 2025年廣東舞蹈戲劇職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 基于坡縷石分散性及電負(fù)性調(diào)控納米復(fù)合膜結(jié)構(gòu)和性能的研究
- 二年級數(shù)學(xué)計算題專項練習(xí)1000題匯編集錦
- 2025年山東浪潮集團(tuán)限公司招聘25人高頻重點提升(共500題)附帶答案詳解
- 2024年財政部會計法律法規(guī)答題活動題目及答案一
- 2025年江西省港口集團(tuán)招聘筆試參考題庫含答案解析
- (2024年)中國傳統(tǒng)文化介紹課件
- 液化氣安全檢查及整改方案
- 《冠心病》課件(完整版)
- 2024年云網(wǎng)安全應(yīng)知應(yīng)會考試題庫
- 公園保潔服務(wù)投標(biāo)方案
- 光伏電站項目合作開發(fā)合同協(xié)議書三方版
- 2024年秋季新滬教版九年級上冊化學(xué)課件 第2章 空氣與水資源第1節(jié) 空氣的組成
- 香港中文大學(xué)博士英文復(fù)試模板
評論
0/150
提交評論