• <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年4月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            享受編程

            常用鏈接

            留言簿(11)

            隨筆分類(159)

            隨筆檔案(224)

            文章分類(2)

            文章檔案(4)

            經典c++博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

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

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

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


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


            CDC類定義了一個設備描述表相關的類,其對象提供成員函數操作設備描述表進行工作,如顯示器,打印機,以及顯示器描述表相關的窗口客戶區域。

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

             

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


            2.CClientDC(客戶區設備上下文): 處理顯示器描述表的相關的窗體客戶區域。
            用于客戶區的輸出,與特定窗口關聯,可以讓開發者訪問目標窗口中客戶區,其構造函數中包含了GetDC,析構函數中包含了ReleaseDC。


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


            4.CMetaFileDC: 與元文件相關的設備描述表關聯。

             

            CDC提供兩個函數,GetLayout和SetLayout用于反轉設備描述表的布局。用于方便阿拉伯,希伯來的書寫文化習慣的設計,以及非歐洲表中的字體布局。

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

             

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


            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());//獲得整個桌面的句柄, 一些桌面特效程序使用
            dc.MoveTo(m_ptOrigin);
            dc.LineTo(point);

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

            可以看到 MFC 的類使用方便很多, 因為它們都在構造函數和析構函數調用了響應的函數進行DC的獲取和釋放.


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

            CClientDC和CWindowDC 與 CPaintDC 的區別大點
            在DC的獲取方面 CClientDC和CWindowDC 使用的是并只能是 GetDC 和 ReleaseDC
            CPaintDC 使用的是并只能是 BeginPaint 和 EndPaint

            CPaintDC 只能用在響應 WM_PAINT 事件
            CClientDC,CWindowDC 只能用在響應 非WM_PAINT 事件


            關于 WM_PAINT 事件
            系統會在多個不同的時機發送WM_PAINT消息:當第一次創建一個窗口時,當改變窗口的大小時,當把窗口從另一個窗口背后移出時,當最大化或最小化窗口時,等等,這些動作都是由系統管理的,應用只是被動地接收該消息,在消息處理函數中進行繪制操作;大多數的時候應用也需要能夠主動引發窗口中的繪制操作,比如當窗口顯示的數據改變的時候,這一般是通過InvalidateRect和InvalidateRgn函數來完成的。InvalidateRect和InvalidateRgn把指定的區域加到窗口的Update Region中,當應用的消息隊列沒有其他消息時,如果窗口的Update Region不為空時,系統就會自動產生WM_PAINT消息。


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

            posted on 2010-01-26 09:58 漂漂 閱讀(773) 評論(0)  編輯 收藏 引用
            国产精品久久久久9999| 久久伊人中文无码| 99久久国产热无码精品免费| 亚洲成色999久久网站| 久久久精品视频免费观看| 99久久99久久精品国产片果冻| 精品久久久久久久久午夜福利| 国产亚洲美女精品久久久| 久久综合香蕉国产蜜臀AV| 久久WWW免费人成—看片| 色88久久久久高潮综合影院| 久久91精品综合国产首页| 精品久久人妻av中文字幕| 欧美激情精品久久久久久久| 久久99精品国产| 午夜人妻久久久久久久久| 午夜视频久久久久一区 | 久久亚洲精精品中文字幕| 国产成人精品久久一区二区三区| 欧美午夜A∨大片久久 | 无码任你躁久久久久久老妇App| 潮喷大喷水系列无码久久精品| 久久频这里精品99香蕉久| 99久久www免费人成精品| 国产韩国精品一区二区三区久久| 精品多毛少妇人妻AV免费久久| 国产精品免费久久| 999久久久国产精品| 99久久免费只有精品国产| 精品亚洲综合久久中文字幕| 久久精品国产亚洲av麻豆色欲| 久久99热这里只频精品6| 亚洲国产婷婷香蕉久久久久久| 色综合色天天久久婷婷基地| 国产精品久久亚洲不卡动漫| 久久精品国产久精国产思思| 久久婷婷五月综合国产尤物app| 久久久噜噜噜久久熟女AA片| 久久精品无码专区免费东京热| 久久久一本精品99久久精品88| 人妻丰满AV无码久久不卡|