国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

淺析MFC特殊界面及雙緩沖技術(shù)的實(shí)現(xiàn)

2012-04-29 00:44張丹丹
科技創(chuàng)新導(dǎo)報(bào) 2012年21期
關(guān)鍵詞:句柄矩形內(nèi)存

張丹丹

摘 要:Vc++是微軟推出的面向?qū)ο蟮目梢暬删幊滔到y(tǒng),隨Visual C++的發(fā)布還包括MFC-微軟基礎(chǔ)類,MFC提供的類很多用于界面開(kāi)發(fā),并設(shè)計(jì)了合理的消息映射機(jī)制和相應(yīng)的消息處理函數(shù),實(shí)現(xiàn)設(shè)備環(huán)境繪圖等。

中圖分類號(hào):TP3 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-098X(2012)07(c)-0004-02

1 引言

,是經(jīng)典的windows視窗和windows應(yīng)用程序的開(kāi)發(fā)平臺(tái)。為了減少程序設(shè)計(jì)人員工作開(kāi)發(fā)量它提供有效的應(yīng)用程序框架,對(duì)類進(jìn)行了封裝,大部分是從Cobject里派生而來(lái)的,包含窗口類、圖形設(shè)備接口類、對(duì)象鏈接和嵌入類、文件和數(shù)據(jù)庫(kù)類、輸入/輸出類、異常類等等。

利用MFC提供的類我們可以方便做出一些不規(guī)則形狀的界面,同時(shí)利用雙緩沖原理有效解決界面抖動(dòng)或界面顯示慢的問(wèn)題。當(dāng)窗口被改變大小,被最小最大化,或被關(guān)閉再打開(kāi),或者被另一個(gè)窗口覆蓋的時(shí)候,窗體都面臨著重繪,于是Window觸發(fā)WM_PAINT消息處理復(fù)雜圖形的繪制,由于過(guò)多的刷頻導(dǎo)致圖形顯示出抖動(dòng)、緩慢等癥狀,利用內(nèi)存設(shè)備環(huán)境,具體歸納為雙緩沖技術(shù),可以有效解決這一問(wèn)題。

2 MFC提供的設(shè)備環(huán)境類

MFC提供的類很多用于界面開(kāi)發(fā),其中一個(gè)重要的類—CDC,提供了處理設(shè)備環(huán)境,如顯示器、打印機(jī)等設(shè)備的成員函數(shù)。MFC將GDI(圖形設(shè)備接口)封裝在CDC類中,因此可以調(diào)用該類成員函數(shù)完成諸如各種顏色、尺寸,不同圖形的繪圖操作,同時(shí)GDI具有設(shè)備無(wú)關(guān)性,程序員也無(wú)需考慮設(shè)備的類型。CDC的這種設(shè)備無(wú)關(guān)性,使Windows下的繪圖等程序不直接面向物理設(shè)備,而通過(guò)虛擬的設(shè)備描述表進(jìn)行。

設(shè)備描述表又稱設(shè)備上下文或設(shè)備環(huán)境,它是一種Windows下的數(shù)據(jù)結(jié)構(gòu),它存儲(chǔ)了設(shè)備繪圖屬性信息。應(yīng)用程序不能直接訪問(wèn)設(shè)備描述表,只能由各種相關(guān)API函數(shù)通過(guò)設(shè)備描述表的句柄間接訪問(wèn)該結(jié)構(gòu)。MFC提供的DC類包括CDC類和其派生類:CwindowDC、CclientDC 、CpaintDC等等,這些類都封裝了HDC句柄。CpaintDC是OnPaint()函數(shù)使用的設(shè)備環(huán)境類,該類對(duì)象只在響應(yīng)WM_PAINT消息時(shí)調(diào)用,WM_PAINT是窗口每次重繪都會(huì)產(chǎn)生的一個(gè)消息, 而OnPaint()是對(duì)這個(gè)消息的響應(yīng)函數(shù),通常在使用OnPaint()函數(shù)處理WM_PAINT消息時(shí),就可以創(chuàng)建一個(gè)CpaintDC類對(duì)象。CclientDC在處理非WM_PAINT消息時(shí)使用,用于繪制客戶區(qū)。另外還有很多DC類它們對(duì)于輸出的效果、圖形的顏色、剪裁、繪制等同樣發(fā)揮各自的作用。

另外一類重要的DC為內(nèi)存DC, 它是虛擬的設(shè)備環(huán)境,可以有效的解決繪圖在顯示中所出現(xiàn)閃爍或緩慢的現(xiàn)象,也為雙緩沖技術(shù)的基本要點(diǎn),實(shí)現(xiàn)步驟為:1)為當(dāng)前的設(shè)備環(huán)境創(chuàng)建相匹配的內(nèi)存DC,可以調(diào)用CreateCompatibleDC()函數(shù)實(shí)現(xiàn);2)創(chuàng)建或?qū)胛粓D,可以調(diào)用Create Compatible Bitmap() 、LoadBitmap、LoadImage()等函數(shù);3)將位圖載入內(nèi)存設(shè)備環(huán)境,利用函數(shù)SelectObject()實(shí)現(xiàn);4)將內(nèi)存設(shè)備環(huán)境中繪制好的圖像拷貝至物理設(shè)備環(huán)境,利用BitBlt()完成。同時(shí)注意:當(dāng)建立多個(gè)內(nèi)存DC時(shí),應(yīng)將每個(gè)內(nèi)存DC的繪圖一同復(fù)制到另一個(gè)內(nèi)存DC中,再把這個(gè)復(fù)制好的內(nèi)存DC拷貝至物理設(shè)備環(huán)境中。

3 MFC制作特殊界面和雙緩沖技術(shù)的實(shí)例

(1)窗口形狀的顯示在對(duì)話框初始函數(shù)中設(shè)置(代碼如下):

BOOL CEllipsefaceDlg :: OnInitDialog()

{

CDialog :: OnInitDialog() ;

......\此出代碼省略

CRgn a ;// 創(chuàng)建CRgn類對(duì)象a

a.CreateRoundRectRgn (0, 0, 400, 400, 700, 700 )[A1] ;

SetWindowRgn ( ( HRGN ) a,true )[A2] ; }(如圖1)

代碼詳解:

1.CRgn類封裝了一個(gè)Windows圖形設(shè)備接口(GDI)區(qū)域,調(diào)用CRgn類的成員函數(shù)可實(shí)現(xiàn)橢圓或者特殊矩形界面。

CRgn成員舉例說(shuō)明:

CreateEllipticRgn():初始化一個(gè)橢圓區(qū)域的CRgn類對(duì)象

CreateRoundRectRgn(x1,y1,x2,y2,x3,y3):初始化一個(gè)圓角矩形區(qū)域的CRgn類對(duì)象

參數(shù)說(shuō)明:

x1,y1:左上角x軸和y軸坐標(biāo)

x2,y2:右下角x軸和y軸坐標(biāo)

x3,y3:用于創(chuàng)建圓角的橢圓,它的寬度和高度

2.SetWindowRgn(HRGN hRgn,BOOL bRedraw):該函數(shù)用于設(shè)置窗口區(qū)域,該窗口區(qū)域決定了系統(tǒng)允許繪制窗口的范圍,超出該窗口區(qū)域的范圍系統(tǒng)一律不顯示。

參數(shù)說(shuō)明:

HRGN hRgn:指向一個(gè)區(qū)域的句柄,把窗口設(shè)置在該區(qū)域。如果此參數(shù)設(shè)為NULL,函數(shù)不設(shè)置窗口區(qū)域。

BOOL bRedraw:參數(shù)為true,操作系統(tǒng)在設(shè)定區(qū)域后重新繪制窗口,反之不。

* 圖片顯示在OnPaint()函數(shù)中設(shè)置(代碼如下):

void CEllipsefaceDlg :: OnPaint()

{ …… // 此處代碼省略

else

{ ① CPaintDC dc ( this ) ;

② CRect area ;

GetWindowRect ( &area ) ;

③ CBitmap cBitmap ;

CBitmap * pOldMemBmp = NULL ;

cBitmap.LoadBitmap ( IDB_BITMAP ) ;

④ CDC mdc ;

mdc.CreateCompatibleDC(&dc);

⑤ pOldMemBmp = mdc.SelectObject ( &cBitmap ) ;

⑥ dc.BitBlt(0, 0, area.Width(), area.Height(), &mdc, 0, 0,SRCCOPY ) ;

⑦ if ( pOldMemBmp )mdc.SelectObject ( pOldMemBmp ) ;

CDialog :: OnPaint() ;

}

}

代碼詳解(如圖2):

①CPaintDC:派生于CDC的設(shè)備環(huán)境類。該類是OnPaint()函數(shù)使用的DC類,因此首先創(chuàng)建一個(gè)類對(duì)象dc。

②CRect類:RECT結(jié)構(gòu)的數(shù)據(jù)成員(left,top,right,and bottom)也是CRect的可訪問(wèn)的數(shù)據(jù)成員。在任何傳遞RECT結(jié)構(gòu),LPCRECT或LPRECT的函數(shù)中,都可以將一個(gè)CRect對(duì)象作為函數(shù)參數(shù)來(lái)代替。

void GetWindowRect(LPRECT lpRect) :屬于CWnd類的成員函數(shù),返回窗口的邊框尺寸。

參數(shù)解釋:

const,lpRect,指向一個(gè)RECT結(jié)構(gòu)的指針,該結(jié)構(gòu)接收窗口的左上角和右下角的屏幕坐標(biāo)。

總結(jié):這兩行代碼利用GetWindowRect()獲取窗口區(qū)域,該函數(shù)參數(shù)為指向RECT結(jié)構(gòu)的指針,因此首先創(chuàng)建一個(gè)Crect類對(duì)象area。

③CBitmap類封裝了窗口圖形設(shè)備接口位圖,提供操作位圖的成員函數(shù)。使用CBitmap對(duì)象之前要先構(gòu)造CBitmap對(duì)象,調(diào)用其中的一個(gè)初始化成員函數(shù)設(shè)置位圖對(duì)象的句柄,本段程序調(diào)用了LoadBitmap(),此后就可以調(diào)用其它成員函數(shù)了。

LoadBitmap:從模塊的可執(zhí)行文件中加載已命名的位圖資源,用來(lái)初始化對(duì)象,并且把位圖貼到對(duì)象中。本例中該函數(shù)參數(shù)為插入背景位圖的ID。

④創(chuàng)建CDC類的對(duì)象mdc(內(nèi)存設(shè)備環(huán)境)。

CDC:定義了一類設(shè)備環(huán)境對(duì)象,所有的繪畫(huà)可以通過(guò)CDC的成員函數(shù)完成,該類提供了為設(shè)備環(huán)境操作的成員函數(shù),比如繪畫(huà)工具的使用,使用顏色和調(diào)色板,窗體范圍的使用,轉(zhuǎn)換坐標(biāo),剪裁繪制線條,繪制簡(jiǎn)單圖形等,該類還提供文本設(shè)置等的函數(shù)。在寫(xiě)有關(guān)圖形界面的程序時(shí),需使用CDC類及其子類。

CreateCompatibleDC:創(chuàng)建一個(gè)與物理設(shè)備兼容的內(nèi)存設(shè)備環(huán)境,可以使用該內(nèi)存設(shè)備環(huán)境在內(nèi)存中存放圖片。此例調(diào)用該函數(shù)創(chuàng)建相應(yīng)的內(nèi)存設(shè)備環(huán)境mdc。

總結(jié):利用雙緩沖技術(shù)的基本點(diǎn)是創(chuàng)建與設(shè)備壞境相對(duì)應(yīng)的內(nèi)存DC。

⑤CGdiObject* SelectObject( CGdiObject* pObject ):選擇一個(gè)圖形設(shè)備界面對(duì)象到指定的設(shè)備環(huán)境中,新的對(duì)象會(huì)替換掉之前的同類對(duì)象;

參數(shù)解釋:

hdc:設(shè)備上下文環(huán)境的句柄。

hgdiobj:被選擇的對(duì)象的句柄,該指定對(duì)象必須由如下的函數(shù)創(chuàng)建。

總結(jié):為指向舊的內(nèi)存位圖設(shè)置一個(gè)CBitmap類的指針,并預(yù)先設(shè)置該指針為空。然后將該指針指向載入位圖的內(nèi)存設(shè)備壞境。

⑥BitBlt:把設(shè)備環(huán)境源的位圖復(fù)制到當(dāng)前設(shè)備環(huán)境中。這里指把內(nèi)存設(shè)備環(huán)境的位圖復(fù)制到當(dāng)前的物理設(shè)備環(huán)境中,本例中即顯示器。

參數(shù)設(shè)置:

HDC hDestDC:指向目標(biāo)設(shè)備環(huán)境的HDC句柄

xDest:目標(biāo)矩形左上角的邏輯x軸坐標(biāo)

yDest:目標(biāo)矩形左上角的邏輯y軸坐標(biāo)

pointDest:顯示目標(biāo)矩形做上角的點(diǎn)結(jié)構(gòu)

nDestWidth:目標(biāo)矩形的邏輯寬度

nDestHeight:目標(biāo)矩形的邏輯高度

HDC hSrcDC:指向源設(shè)備環(huán)境的HDC句柄

xSrc:源矩形左上角的邏輯x軸坐標(biāo)

ySrc:源矩形左上角的邏輯y軸坐標(biāo)

dwrop:執(zhí)行柵格操作

rectDest:顯示目標(biāo)區(qū)域的rect結(jié)構(gòu)

pointSrc:顯示源矩形左上角的點(diǎn)結(jié)構(gòu)

⑦ 如果指向內(nèi)存位圖的指針不為空,則將其指向的位圖選入內(nèi)存設(shè)備環(huán)境中。

(2)拖動(dòng)窗體在WM_LBUTTONDOWN消息中實(shí)現(xiàn)(代碼如下):

void CEllipsefaceDlg::OnLButtonDown ( UINT nFlags,CPoint point )

{

::SendMessage ( this->GetSafeHwnd(), WM_SYSCOMMAND, SC_MOVE+2, 0 ) ;

CDialog :: OnLButtonDown ( nFlags,point ) ;

}

代碼詳解:

LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam

):

為指定的窗口喚醒窗口程序,然后發(fā)送指定的消息給該窗口,當(dāng)喚醒的窗口程序處理完消息后返回。

參數(shù)解釋:

HWND hWnd:指向喚醒窗口程序且將接受消息的窗口的句柄。

UINT Msg:被發(fā)送的指定消息。

WPARAM wParam、 LPARAM lParam :指定系統(tǒng)命令的類型。他們的類型可以是:SC_CLOSE(關(guān)閉窗口)、SC_HOTKEY(以應(yīng)用程序指定的熱鍵激活窗口)、SC_MAXIMIZE(最大化窗口)、SC_MOVE(移動(dòng)窗口)等。

CWnd::GetSafeHwnd:返回一個(gè)窗口的窗口句柄。

WM_SYSCOMMAND:當(dāng)用戶從窗口菜單中選擇一個(gè)命令時(shí),比如選擇最大化、最小化、還原、關(guān)閉等按鈕的時(shí)候,這些消息被發(fā)送至該窗口。

4 結(jié)語(yǔ)

本文通過(guò)窗口類、圖形設(shè)備接口類、設(shè)備上下文的成員函數(shù)及其類的創(chuàng)建和使用,闡述了如何使用MFC簡(jiǎn)便的繪制不規(guī)則矩形界面,以及如何使用雙緩沖技術(shù)的原理和模式用于提高界面顯示效果等內(nèi)容。對(duì)于MFC的消息及設(shè)備上下文的學(xué)習(xí),可以探索出更多知識(shí)及應(yīng)用。

參考文獻(xiàn)

[1] 劉銳寧,梁水,宋坤.Visual C++程序開(kāi)發(fā)范例寶典[M].北京:人民郵電出版社,2009.

[2] 姚領(lǐng)田,高守傳.MFC窗口程序設(shè)計(jì)[M].北京:中國(guó)水利水電出版社,2007.

[3] G.(Shepherd,George),S.(Wingo.Scot).深入解析MFC.北京:中國(guó)電力出版社,2003.

[4] Microsoft.MSDN庫(kù)(中文) [DB/OL]. http://msdn.microsoft.com/library,2012/2012-05-03.

[5] 尹立民,王興東.Visual C++軟件項(xiàng)目開(kāi)發(fā)實(shí)例[M].北京:電子工業(yè)出版社,2004.

[A1]對(duì)象a調(diào)用CRgn類成員函數(shù)CreateRoundRectRgn(),被初始化為一個(gè)圓角區(qū)域。

[A2]將初始化后的對(duì)象a作為對(duì)象句柄放入SetWindowRgn()中做參數(shù),剛剛創(chuàng)建的圓角區(qū)域被設(shè)置為窗體區(qū)域,SetWindowRgn()為CWnd的成員函數(shù)。

猜你喜歡
句柄矩形內(nèi)存
外部高速緩存與非易失內(nèi)存結(jié)合的混合內(nèi)存體系結(jié)構(gòu)特性評(píng)測(cè)
兩矩形上的全偏差
“春夏秋冬”的內(nèi)存
化歸矩形證直角
高校圖書(shū)館持久標(biāo)識(shí)符應(yīng)用研究
從矩形內(nèi)一點(diǎn)說(shuō)起
編譯程序語(yǔ)法分析句柄問(wèn)題分析與探討
MFC應(yīng)用程序多線程混合顯示界面方法研究
基于內(nèi)存的地理信息訪問(wèn)技術(shù)
上網(wǎng)本為什么只有1GB?