資源描述:
《使用MFC創(chuàng)建不規(guī)則窗體》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、使用C++繪制不規(guī)則的窗體減小字體增大字體作者:不詳??來源:轉(zhuǎn)載??發(fā)布時(shí)間:2010-02-2307:43:00 一、序言 在絕大多數(shù)的Windows應(yīng)用程序中,其窗體都是使用的正規(guī)正矩的矩形窗體,例如我們常用的,“記事本”,“掃雷”,等等。矩形窗體,具有編程實(shí)現(xiàn)簡單,風(fēng)格簡潔的優(yōu)點(diǎn),所以在普通文檔應(yīng)用程序和簡單小游戲中使用足矣。但在某些娛樂游戲程序中使用就略顯呆板些了,這時(shí)若用不規(guī)則窗體替代原先的矩形窗體,將會使這類程序更添情趣。典型的例子有windows自代的MediaPlayer,新版本的MediaPlayer有個(gè)控制面
2、板的選項(xiàng),選中這些面板,播放器就以選中的面板形狀出現(xiàn),這時(shí)的播放器比以前版本的MediaPlayer的古老矩形界面要生動有趣的多了。要實(shí)現(xiàn)不規(guī)則窗體不是太難,知道了基本原理后,你也可以創(chuàng)建各種有趣的不規(guī)則窗體。 二、實(shí)現(xiàn)原理 所有的Windows窗體都位于一個(gè)稱為“region”中,窗體的大小如果超出“region”的范圍,windows會自動裁剪超出"region"范圍那部分的窗體,使其不可見。所以,要創(chuàng)建不規(guī)則窗體有兩個(gè)步驟:第一步就是創(chuàng)建不規(guī)則"region".第二步就是將窗體放到創(chuàng)建的“region”中?! ∑渲械诙胶芎?/p>
3、單就調(diào)用一條語句即可。在SDK中調(diào)用API函數(shù)SetWindowRgn,該函數(shù)原型如下:intSetWindowRgn(HWNDhWnd,HRGNhRgn,BOOLbRedraw); 其中hWnd為待設(shè)置的窗體句柄,hRgn為已經(jīng)創(chuàng)建的"region"句柄,bRedraw代表是否要重繪窗體。在MFC中使用窗口類CWnd的成員函數(shù)intCWnd::SetWindowRgn(HRGNhRgn,BOOLbRedraw);該函數(shù)的參數(shù)意義與API中同名函數(shù)相同?! ∠鄬εc第二步,創(chuàng)建不規(guī)則窗體的第一步要復(fù)雜許多,并且不規(guī)則窗體越復(fù)雜,創(chuàng)建其
4、"region"的過程也越復(fù)雜。接下去我們將由淺入深地介紹各種創(chuàng)建”region”的方法。 在MFC中"region"對象,由CRgn類實(shí)現(xiàn)。CRgn的幾乎每個(gè)成員函數(shù)都有同名的SDKAPI函數(shù)對應(yīng)?! ∪?、簡單“region”的創(chuàng)建 類CRgn創(chuàng)建一個(gè)新的"region"的簡單方法有以下幾個(gè)成員函數(shù):BOOLCRgn::CreateRectRgn(intx1,inty1,intx2,inty2);創(chuàng)建矩形的“region”。BOOLCRgn::CreateEllipticRgn(intx1,inty1,intx2,inty2);
5、創(chuàng)建圓形或橢圓形“region”。BOOLCRgn::CreateRoundRectRgn(intx1,inty1,intx2,inty2,intx3,inty3);創(chuàng)建圓角矩形“region”。BOOLCRgn::CreatePolygonRgn(LPPOINTlpPoints,intnCount,intnMode);創(chuàng)建多邊形“region”?! ∵@里以創(chuàng)建橢圓窗體為例,介紹橢圓窗體創(chuàng)建的方法。在創(chuàng)建橢圓“region”的CreateEllipticRgn函數(shù)中,x1,y1指橢圓所在矩形的左上角坐標(biāo),x2,y2指該矩形的右下角坐標(biāo)
6、。 下面的代碼加入到MFC對話框程序的OnInitDialog函數(shù)中,可將該對話框變成橢圓窗體:BOOLCTestDlg::OnInitDialog(){CDialog::OnInitDialog();...CRgnrgn;rgn.CreateEllipticRgn(0,0,200,100);SetWindowRgn(rgn,TRUE);}圖一橢圓窗體效果圖 四、作圖路徑法創(chuàng)建”region” 使用該方法創(chuàng)建”region”的過程如下: 第一步繪制所要創(chuàng)建的窗體形狀。 該步驟中使用到CDC類中的一些成員函數(shù)如下:BOOLC
7、DC::BeginPath(); 調(diào)用該函數(shù)后當(dāng)前設(shè)備環(huán)境(DC)開始追蹤繪圖的過程。intCDC::SetBkMode(intnBkMode); 設(shè)置繪圖時(shí)的背景模式,此應(yīng)用中nBkMode必須取值為TRANSPARENT。即設(shè)置繪圖時(shí)背景不發(fā)生變化。BOOLCDC::EndPath(); 調(diào)用該函數(shù)后當(dāng)前設(shè)備環(huán)境(DC)結(jié)束追蹤繪圖的過程?! ¢_始繪圖前,先調(diào)用BeginPath,然后調(diào)用SetBkMode。接下去就可調(diào)用CDC的其他繪圖函數(shù)作圖,例如Arc,AngleArc,LineTo,MoveTo,RoundRect,
8、,Textout等等。繪圖完畢調(diào)用EndPath(). 第二步將繪制的結(jié)果轉(zhuǎn)成”region”. 此步驟中使用SDKAPI函數(shù)HRGNPathToRegion(HDChdc); Hdc為作圖DC的句柄,CDC類中的