亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2012-04-29 00:44:03張丹丹
        科技創(chuàng)新導報 2012年21期
        關鍵詞:句柄矩形內存

        張丹丹

        摘 要:Vc++是微軟推出的面向對象的可視化集成編程系統(tǒng),隨Visual C++的發(fā)布還包括MFC-微軟基礎類,MFC提供的類很多用于界面開發(fā),并設計了合理的消息映射機制和相應的消息處理函數(shù),實現(xiàn)設備環(huán)境繪圖等。

        中圖分類號:TP3 文獻標識碼:A 文章編號:1674-098X(2012)07(c)-0004-02

        1 引言

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

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

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

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

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

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

        3 MFC制作特殊界面和雙緩沖技術的實例

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

        BOOL CEllipsefaceDlg :: OnInitDialog()

        {

        CDialog :: OnInitDialog() ;

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

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

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

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

        代碼詳解:

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

        CRgn成員舉例說明:

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

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

        參數(shù)說明:

        x1,y1:左上角x軸和y軸坐標

        x2,y2:右下角x軸和y軸坐標

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

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

        參數(shù)說明:

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

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

        * 圖片顯示在OnPaint()函數(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的設備環(huán)境類。該類是OnPaint()函數(shù)使用的DC類,因此首先創(chuàng)建一個類對象dc。

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

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

        參數(shù)解釋:

        const,lpRect,指向一個RECT結構的指針,該結構接收窗口的左上角和右下角的屏幕坐標。

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

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

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

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

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

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

        總結:利用雙緩沖技術的基本點是創(chuàng)建與設備壞境相對應的內存DC。

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

        參數(shù)解釋:

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

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

        總結:為指向舊的內存位圖設置一個CBitmap類的指針,并預先設置該指針為空。然后將該指針指向載入位圖的內存設備壞境。

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

        參數(shù)設置:

        HDC hDestDC:指向目標設備環(huán)境的HDC句柄

        xDest:目標矩形左上角的邏輯x軸坐標

        yDest:目標矩形左上角的邏輯y軸坐標

        pointDest:顯示目標矩形做上角的點結構

        nDestWidth:目標矩形的邏輯寬度

        nDestHeight:目標矩形的邏輯高度

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

        xSrc:源矩形左上角的邏輯x軸坐標

        ySrc:源矩形左上角的邏輯y軸坐標

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

        rectDest:顯示目標區(qū)域的rect結構

        pointSrc:顯示源矩形左上角的點結構

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

        (2)拖動窗體在WM_LBUTTONDOWN消息中實現(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ā)送指定的消息給該窗口,當喚醒的窗口程序處理完消息后返回。

        參數(shù)解釋:

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

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

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

        CWnd::GetSafeHwnd:返回一個窗口的窗口句柄。

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

        4 結語

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

        參考文獻

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

        [2] 姚領田,高守傳.MFC窗口程序設計[M].北京:中國水利水電出版社,2007.

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

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

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

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

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

        猜你喜歡
        句柄矩形內存
        兩矩形上的全偏差
        “春夏秋冬”的內存
        當代陜西(2019年13期)2019-08-20 03:54:22
        化歸矩形證直角
        高校圖書館持久標識符應用研究
        從矩形內一點說起
        編譯程序語法分析句柄問題分析與探討
        MFC應用程序多線程混合顯示界面方法研究
        基于內存的地理信息訪問技術
        基于SPY++的軟件功能擴展的研究
        上網本為什么只有1GB?
        亚洲精品亚洲人成在线播放| 91精品国产高清久久福利| 久久精品国产亚洲av蜜点| 久久精品国产精油按摩| 性夜影院爽黄a爽在线看香蕉| 国产精品成人无码久久久久久| 国产小视频一区二区三区| 亚洲综合新区一区二区| 亚洲天堂亚洲天堂亚洲色图 | 精品久久久无码人妻中文字幕豆芽| 日本三级欧美三级人妇视频黑白配 | 日韩成人无码一区二区三区| 国产精品一久久香蕉国产线看观看| 少妇特殊按摩高潮不断| 国产美女高潮流白浆视频| 懂色av一区二区三区尤物| 亚洲人成无码网站在线观看| 国产精品爆乳在线播放| 国产av精品久久一区二区| 完整版免费av片| 在线va免费看成| 久久久久久久久高潮无码| 久久国产精品老人性| av在线不卡免费中文网| 欧美最猛黑人xxxx黑人猛交| 无码视频一区二区三区在线观看| 亚洲嫩模一区二区三区视频| 国产黄色一区二区三区,| 国产精品久免费的黄网站| 久久久久久亚洲精品中文字幕| 亚洲欧美一区二区三区国产精| av天堂吧手机版在线观看| 成人av在线久色播放| 99久久人妻精品免费二区| 精品一区二区三区四区少妇 | 日韩内射美女片在线观看网站| 波多野结衣一区二区三区高清| 区无码字幕中文色| 噜噜中文字幕一区二区| 亚洲精品乱码久久久久久日本蜜臀| 全免费a级毛片免费看|