• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 224  文章 - 41  trackbacks - 0
            <2010年2月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28123456
            78910111213

            享受編程

            常用鏈接

            留言簿(11)

            隨筆分類(159)

            隨筆檔案(224)

            文章分類(2)

            文章檔案(4)

            經(jīng)典c++博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            出處:http://blog.csdn.net/xiaofengsheng/archive/2009/04/19/4093010.aspx

            首先說一下什么是DC(設(shè)備描述表)
            解:Windows應(yīng)用程序通過為指定設(shè)備(屏幕,打印機(jī)等)創(chuàng)建一個(gè)設(shè)備描述表(Device Context, DC)在DC表示的邏輯意義的“畫布”上進(jìn)行圖形的繪制。DC是一種包含設(shè)備信息的數(shù)據(jù)結(jié)構(gòu),它包含了物理設(shè)備所需的各種狀態(tài)信息。Win32程序在繪制圖形之前需要獲取DC的句柄HDC,并在不繼續(xù)使用時(shí)釋放掉。

            在c++ 編程中常會見到HDC,CDC,CClientDC,CPaintDC,CWindowDC這樣的類
            HDC是DC的句柄,API中的一個(gè)類似指針的數(shù)據(jù)類型.
            CDC是MFC的DC的一個(gè)類
            CDC等設(shè)備上下分類,都含有一個(gè)類的成員變量:m_nHdc;即HDC類型的句柄.


            CDC及其派生類的繼承視圖:
            CObject
            public |------CDC
            public |------|------CClientDC
            public |------|------CPaintDC
            public |------|------CWindowDC
            public |------|------CMetaFileDC
            (注意: 除CMetaFileDC以外的三個(gè)派生類用于圖形繪制.)


            CDC類定義了一個(gè)設(shè)備描述表相關(guān)的類,其對象提供成員函數(shù)操作設(shè)備描述表進(jìn)行工作,如顯示器,打印機(jī),以及顯示器描述表相關(guān)的窗口客戶區(qū)域。

            通過CDC的成員函數(shù)可進(jìn)行一切繪圖操作。CDC提供成員函數(shù)進(jìn)行設(shè)備描述表的基本操作,使用繪圖工具, 選擇類型安全的圖形設(shè)備結(jié)構(gòu)(GDI),以及色彩,調(diào)色板。除此之外還提供成員函數(shù)獲取和設(shè)置繪圖屬性,映射,控制視口,窗體范圍,轉(zhuǎn)換坐標(biāo),區(qū)域操作,裁減,劃線以及繪制簡單圖形(橢圓,多邊形等)。成員函數(shù)也提供繪制文本,設(shè)置字體,打印機(jī)換碼,滾動, 處理元文件。

             

            其派生類:
            1.PaintDC: 封裝BeginPaint和EndPaint兩個(gè)API的調(diào)用。
            (1)用于響應(yīng)窗口重繪消息(WM_PAINT)是的繪圖輸出。
            (2)CPaintDC在構(gòu)造函數(shù)中調(diào)用BeginPaint()取得設(shè)備上下文,在析構(gòu)函數(shù)中調(diào)用EndPaint()釋放設(shè)備上下文。EndPaint()除了釋放設(shè)備上下文外,還負(fù)責(zé)從消息隊(duì)列中清除WM_PAINT消息。因此,在處理窗口重畫時(shí),必須使用CPaintDC,否則WM_PAINT消息無法從消息隊(duì)列中清除,將引起不斷的窗口重畫。
            (3)CPaintDC也只能用在WM_PAINT消息處理之中。


            2.CClientDC(客戶區(qū)設(shè)備上下文): 處理顯示器描述表的相關(guān)的窗體客戶區(qū)域。
            用于客戶區(qū)的輸出,與特定窗口關(guān)聯(lián),可以讓開發(fā)者訪問目標(biāo)窗口中客戶區(qū),其構(gòu)造函數(shù)中包含了GetDC,析構(gòu)函數(shù)中包含了ReleaseDC。


            3.CWindowDC: 處理顯示器描述表相關(guān)的整個(gè)窗體區(qū)域,包括了框架和控 件(子窗體)。
            (1)可在非客戶區(qū)繪制圖形,而CClientDC,CPaintDC只能在客戶區(qū)繪制圖形。
            (2)坐標(biāo)原點(diǎn)是在屏幕的左上角,CClientDC,CPaintDC下坐標(biāo)原點(diǎn)是在客戶區(qū)的左上角。
            (3)關(guān)聯(lián)一特定窗口,允許開發(fā)者在目標(biāo)窗口的任何一部分進(jìn)行繪圖,包含邊界與標(biāo)題,這種DC同WM_NCPAINT消息一起發(fā)送。


            4.CMetaFileDC: 與元文件相關(guān)的設(shè)備描述表關(guān)聯(lián)。

             

            CDC提供兩個(gè)函數(shù),GetLayout和SetLayout用于反轉(zhuǎn)設(shè)備描述表的布局。用于方便阿拉伯,希伯來的書寫文化習(xí)慣的設(shè)計(jì),以及非歐洲表中的字體布局。

            CDC包含兩個(gè)設(shè)備描述表,m_hDC和m_hAttribDC對應(yīng)于相同的設(shè)備,CDC為m_hDC指定所有的輸出GDI調(diào)用,大多數(shù)的GDI屬性調(diào)用由m_hAttribDC控制。(如,GetTextColor是屬性調(diào)用,而SetTextColor是一種輸出調(diào)用。)

             

            下面用一些簡單的代碼看看如果使用這些類
            HDC使用, 每次畫線等操作都不MFC封裝的類多了個(gè)HDC的參數(shù)
            執(zhí)行在哪個(gè)設(shè)備描述表操作
            HDC hdc=::GetDC(m_hWnd);//m_hWnd == this->m_hWnd 即當(dāng)前窗口句柄
            MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
            LineTo(hdc,point.x,point.y);
            ::ReleaseDC(m_hWnd,hdc);//必須和GetDC配對
            可以看到HDC的使用較麻煩, 而且如果::GetDC和::ReleaseDC不配對的話,會造成錯(cuò)誤


            CDC *pDC=GetDC();
            pDC->MoveTo(m_ptOrigin);
            pDC->LineTo(point);
            ReleaseDC(pDC);

            CClientDC dc(this);
            dc.MoveTo(m_ptOrigin);
            dc.LineTo(point);

            CWindowDC dc(this);
            CWindowDC dc2(GetDesktopWindow());//獲得整個(gè)桌面的句柄, 一些桌面特效程序使用
            dc.MoveTo(m_ptOrigin);
            dc.LineTo(point);

            CPaintDC dc(this);
            dc.MoveTo(m_ptOrigin);
            dc.LineTo(point);

            可以看到 MFC 的類使用方便很多, 因?yàn)樗鼈兌荚跇?gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用了響應(yīng)的函數(shù)進(jìn)行DC的獲取和釋放.


            下面說下一些細(xì)點(diǎn)的知識點(diǎn)
            CClientDC,CWindowDC 區(qū)別不大, 可以說 CWindowDC包含了CClientDC 就拿記事本來說
            CClientDC 就只是白白的我們可以編輯文字的那個(gè)區(qū)域是 客戶區(qū)
            CWindowDC 除了上面說的白白區(qū)域, 還包括菜單欄和工具欄等

            CClientDC和CWindowDC 與 CPaintDC 的區(qū)別大點(diǎn)
            在DC的獲取方面 CClientDC和CWindowDC 使用的是并只能是 GetDC 和 ReleaseDC
            CPaintDC 使用的是并只能是 BeginPaint 和 EndPaint

            CPaintDC 只能用在響應(yīng) WM_PAINT 事件
            CClientDC,CWindowDC 只能用在響應(yīng) 非WM_PAINT 事件


            關(guān)于 WM_PAINT 事件
            系統(tǒng)會在多個(gè)不同的時(shí)機(jī)發(fā)送WM_PAINT消息:當(dāng)?shù)谝淮蝿?chuàng)建一個(gè)窗口時(shí),當(dāng)改變窗口的大小時(shí),當(dāng)把窗口從另一個(gè)窗口背后移出時(shí),當(dāng)最大化或最小化窗口時(shí),等等,這些動作都是由系統(tǒng)管理的,應(yīng)用只是被動地接收該消息,在消息處理函數(shù)中進(jìn)行繪制操作;大多數(shù)的時(shí)候應(yīng)用也需要能夠主動引發(fā)窗口中的繪制操作,比如當(dāng)窗口顯示的數(shù)據(jù)改變的時(shí)候,這一般是通過InvalidateRect和InvalidateRgn函數(shù)來完成的。InvalidateRect和InvalidateRgn把指定的區(qū)域加到窗口的Update Region中,當(dāng)應(yīng)用的消息隊(duì)列沒有其他消息時(shí),如果窗口的Update Region不為空時(shí),系統(tǒng)就會自動產(chǎn)生WM_PAINT消息。


            系統(tǒng)為什么不在調(diào)用Invalidate時(shí)發(fā)送WM_PAINT消息呢?又為什么非要等應(yīng)用消息隊(duì)列為空時(shí)才發(fā)送WM_PAINT消息呢?這是因?yàn)橄到y(tǒng)把在窗口中的繪制操作當(dāng)作一種低優(yōu)先級的操作,于是盡可能地推后做。不過這樣也有利于提高繪制的效率:兩個(gè)WM_PAINT消息之間通過InvalidateRect和InvaliateRgn使之失效的區(qū)域就會被累加起來,然后在一個(gè)WM_PAINT消息中一次得到更新,不僅能避免多次重復(fù)地更新同一區(qū)域,也優(yōu)化了應(yīng)用的更新操作。像這種通過InvalidateRect和InvalidateRgn來使窗口區(qū)域無效,依賴于系統(tǒng)在合適的時(shí)機(jī)發(fā)送WM_PAINT消息的機(jī)制實(shí)際上是一種異步工作方式,也就是說,在無效化窗口區(qū)域和發(fā)送WM_PAINT消息之間是有延遲的;有時(shí)候這種延遲并不是我們希望的,這時(shí)我們當(dāng)然可以在無效化窗口區(qū)域后利用SendMessage 發(fā)送一條WM_PAINT消息來強(qiáng)制立即重畫,但不如使用Windows GDI為我們提供的更方便和強(qiáng)大的函數(shù):UpdateWindow和RedrawWindow。UpdateWindow會檢查窗口的Update Region,當(dāng)其不為空時(shí)才發(fā)送WM_PAINT消息;RedrawWindow則給我們更多的控制:是否重畫非客戶區(qū)和背景,是否總是發(fā)送WM_PAINT消息而不管Update Region是否為空等。

            posted on 2010-01-26 09:58 漂漂 閱讀(774) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            一级a性色生活片久久无| 国产午夜精品久久久久免费视| 91久久香蕉国产熟女线看| 91性高湖久久久久| 久久亚洲精品国产精品婷婷| 亚洲国产另类久久久精品黑人| 久久午夜福利电影| 精品久久久无码21p发布| 亚洲国产成人久久精品影视| 一本色道久久综合| 久久久久一区二区三区| 久久久久亚洲国产| 99久久成人18免费网站| 亚洲中文字幕久久精品无码APP| 香蕉久久夜色精品国产小说| 久久精品国产99久久久古代 | 国产成人无码精品久久久免费| 精品久久人人爽天天玩人人妻| 日产精品久久久一区二区| 精品久久久久久国产牛牛app| 97久久超碰国产精品旧版| 久久久久久久久久久| 久久精品无码免费不卡| 日韩精品久久久久久| 久久夜色精品国产噜噜亚洲AV| 思思久久99热只有频精品66| 国产精品青草久久久久福利99 | 久久久久精品国产亚洲AV无码| 国产精品美女久久久网AV| 精品国产91久久久久久久 | 久久久久亚洲AV成人网| 久久亚洲国产午夜精品理论片| 久久综合狠狠综合久久| 久久久久亚洲av无码专区导航| 综合人妻久久一区二区精品| 四虎国产精品成人免费久久| 久久中文字幕人妻熟av女| 无码任你躁久久久久久老妇App| 亚洲午夜精品久久久久久app| 日韩va亚洲va欧美va久久| 久久夜色精品国产www|