MFC中的DC、CDC、HDC、句柄、設備上下文的不一樣意思,適合初學者參考

  • 請問mfc中的dc、cdc、hdc、句柄、設備上下文到底是什麼意思? 但願能解答詳細一點點 謝謝了 
    推薦答案 
    都是什麼回答啊 ...
    樓主你沒有了解mfc的運行機制就去看他寫他因此你先要了解他的機制 已經各個cpp.h都是什麼
    下面我就給你說下
     
    在mfc程序中,咱們並不常常直接調用windows api,而是從mfc類建立對象並調用屬於這些對象的成員函數.也就是說mfc封裝了windows api 你說你喜歡c++而mfc換一種說法就是一個用c++寫的一個函數庫而後你來調用只不過這個類不是你寫的
               mfc提供數百個類,最重要的、也是編寫任何vc++應用程序都必不可少的兩個類cwinapp和cframewnd,這兩個類是編寫複雜龐大應用程序的基石。
    1>封裝特性:構成mfc框架的是mfc類庫而mfc類庫又是c++的一個類庫。這些類封裝win32應用程序編程接口,ole(object link embed 對象連接嵌入)特性,odbc和dao數據訪問的功能。
    2>繼承特性:mfc抽象出了衆多類的共同特性,並設計出一些基類做爲實現其餘類的基礎,這些類中最重要的類是cobject類和ccmdtarget類,程序員能夠從適當的mfc類中派生出本身的類,實現特定的功能達到編程的目的。
    3>虛擬和消息映射:mfc是以c++爲基礎,固然支持虛函數,但做爲一個編程框架必需要解決的是效率問題:若是mfc僅僅經過虛函數來支持動態約束必然會產生大量的虛函數表這樣編程框架過於臃腫並且消耗更多的內存。可是mfc創建了消息映射機制這樣下降了內存的使用卻大大提升了效率
    消息映射是一個將消息和成員函數相互關聯的表,當應用程序的框架窗口接收到一個消息時,mfc將搜索該窗口的消息映射,若是存在一個處理消息的處理程序,那麼就調用該處理程序.
    它經過宏來實現消息到成員函數的映射,並且這些函數沒必要是虛擬的成員函數,這樣不須要爲消息映射函數生成一個很大的虛擬函數表(v表),節省內存。 
    mfc消息映射機制:
    將消息與消息處理函數聯繫起來,造成一一對應的機制。
    消息映射宏
    聲明: declare_message_map 
    定義:
            begin_message_map 
       on_command
       on_control
       on_message 
           end_message_map
    mfc主要組成部分:類、宏和全局函數。
    類是mfc中最主要的內容。mfc類是以層次結構方式組織起來的。mfc中的類分紅兩部分,除了一些輔助類,大多數的mfc類是直接或間接從根類cobject派生而來。
    mfc宏主要功能:消息映射、運行時對象類型服務、診斷服務、異常處理。 
    mfc約定:全局函數以「afx」爲前綴,全局變量以「afx」爲前綴
    mfc類的層次關係
    cobject項目類)>ccmdtarget(消息響應類)>
    {
    cwinthread(線程類)>cwinapp(window應用程序類)
    cdocument(文檔類)
    cwnd(窗體類)>[
                  cframewnd(框架類)
                  cview(視圖類)
                  ]
    }
     
    cobject類因爲mfc中大部分類是從cobject類繼承而來的,cobject類描述了幾乎全部的mfc類的一些公共特性,cobject類爲程序員提供了對象診斷、運行時類型識別和序列化等功能。
    ccmdtarget類由cobject類直接派生而來,它負責將消息發送到可以響應這些消息的對象。它是全部能進行消息映射的mfc類的基類。
    cwinapp類在任何mfc應用程序中有且僅有一個cwinapp派生類的對象,它表明了程序中運行的主線程,也表明了應用程序自己。 cwinapp類取代了winmain()主函數在sdk應用程序中的地位。傳統sdk應用程序winmain()函數完成的工做。如今由類cwinapp的initapplication(),initinstance()和run()三個成員函數承擔。
    cwnd類由ccmdtarget類直接派生而來,該類及其派生類的實例是一個窗口。cwnd類表明了mfc中最基本的gui對象,它是一個功能最完善、成員函數最多的mfc類。
    cframewnd類是cwnd類的派生類,主要用來掌管一個窗口,它取代了sdk應用程序中窗口函數wndproc()的地位。cframewnd類的對象是一個框架窗口,包括邊框、標題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。
    cdocument類在應用程序中做爲用戶文檔類的基類,它表明了用戶存儲或打開的一個文件。
    cview類是mfc中一個很基本的類,它做爲其它mfc視圖類和用戶視圖派生類的基類。
    從api編程到mfc編程的過渡:
    winmain()
    {  初始化wndclass
        註冊窗體結構
        建立窗口           >>>>>>>>應用程序類cwinapp
        顯示窗口
        消息循環

     
    wndproc()
    { switch(…)            
              >>>>>>>>>框架窗口類cframewnd
    }
     
    mfc object和windows object的對應關係:
    描述                 windows句柄       mfc object 
    窗口                  hwnd                    cwnd 
    設備上下文        hdc                      cdc 
    菜單                   hmenu                cmenu 
    筆                       hpen                   cpen
    刷子                   hbrush              cbrush
    字體                   hfont                 cfont
    位圖                    hbitmap            cbitmap
    套接字                socket              csocket
     
    3、手工建立一個mfc應用程序:
    注意:建立mfc程序,要建立一個win32空項目,並要選擇項目屬性中的」在共享dll文件中使用mfc,而後新建咱們的文件
    例子:在」hello.h」頭文件中添寫以下代碼:
    class cmyapp:public cwinapp
    {
    public:
     virtual bool initinstance();//虛函數
    };
    class cmainwindow:public cframewnd
    {
    public:
     cmainwindow();
    protected:
     afx_msg void onpaint();
     declare_message_map();//聲明消息映射
    };
    在」hello.cpp」源文件中添寫以下代碼:
    #include 
    #include 「hello.h"
    cmyapp myapp;
    bool cmyapp::initinstance()
    {
     m_pmainwnd = new cmainwindow;
     
         m_pmainwnd>showwindow(m_ncmdshow);
     m_pmainwnd>updatewindow();
     return true;
    }
    begin_message_map(cmainwindow,cframewnd)
     on_wm_paint()
    end_message_map()       //消息映射
    cmainwindow::cmainwindow() //構造函數初始化
    {
        create(null,「個人第一個mfc應用程序」);//建立窗體
    }
    void cmainwindow::onpaint()
    {  cpaintdc dc(this);
     crect rect;
     getclientrect(&rect);
      dc.drawtext("hellomfc",1,&rect, dt_singleline|dt_center|dt_vcenter);
    }
    cwinapp是應用程序類,在mfc應用程序中必須從這個類派生出一個類,該派生類是mfc應用程序的入口
    必須定義這個派生類的對象,而且只能有一個這個對象表明整個應用程序。 
    成員函數:initinstance()
     功能:初始化應用程序實例和窗口實例,
     虛函數cwinapp::initinstance必須在派生類中重寫。在initinstance函數中,編寫初始化代碼,如:
    建立一個窗口
     顯示一個窗口
    cframewnd類 
    做用:爲應用程序提供一個窗口,同時實現消息處理功能。
    成員函數: create()
    功能:建立窗體,將之賦於cframewnd對象上。
    bool create(窗口類型, 窗口標題,顯示風格,顯示區域,符窗口句柄,菜單,擴展顯示風格,上下文對象)共有8個參數,前兩個必須給出,後6個能夠默認。
    mfc應用程序的核心就是基於cwinapp類的應用程序對象,cwinapp提供了消息循環來檢索消息並將消息調度給應用程序的窗口.咱們在編寫mfc應用程序時,要包含afxwin.h,
    一個mfc應用程序能夠有且僅有一個應用程序對象,對象必須聲明爲在全局範圍內有效(也就是全局對象),以便它在程序開始時即在內存中被實例化
    咱們的hello mfc的應用程序類被命名爲cmyapp,它在hello.cpp中用以下語句進行了實例化:
    cmyapp myapp;
    cmyapp的類聲明在hello.h中代碼以下:
    class cmyapp:public cwinapp
    {
    public:
     virtual bool initinstance();
    };
    cmyapp沒有聲明任何的數據成員,只是重寫了一個從cwinapp類中繼承來的函數,在應用程序的生存期內initinstance的調用比較早,是在應用程序開始運行之後而窗口建立以前,除非initistance建立一個窗口,不然應用程序是不會有窗口,這正是爲何即便最小的mfc應用程序也必須從cwinapp派生出一個類並重寫cwinapp::initistance的緣由
    initinstance函數:cwinapp::initinstance是一個虛函數,其默認操做僅包含一條語句:return true;
    initinstance是用來執行程序每次開始時都須要進行的初始化工做最好的地方
    在hello.cpp中,cmyapp的initinstance經過實例化hello的cmainwindow類來建立hello窗口,語句:
    m_pmainwnd = new cmainwindow;
     
    構造了一個cmainwindow對象指針,並將其地址複製到了應用程序對象的m_pmainwnd數據成員中,窗口建立之後,initinstance就會經過cmainwindow指針調用showwindow和updatewindow函數顯示它:
     
    m_pmainwnd>showwindow(m_ncmdshow);
     
    m_pmainwnd>updatewindow();
    showwindow和updatewindow是全部窗口對象共用的cwnd成員函數其中包括cframewnd類的對象,cmainwindow就是從cframewnd派生出來的.
    要從mfc程序調用一個常規的windows api函數,須要在函數名稱前添加一個全局運算符:: 例如:::updatewindow();
    經過生成窗口對象並調用其create函數,mfc應用程序能夠建立一個窗口,在cmyapp::initinstance中,hello建立了一個cmainwindow對象,cmainwindow的構造函數生成在屏幕上看到的窗口:
    create(null,」個人第一個mfc應用程序」);
    cpaintdc dc(this);
    mfc的cpaintdc類是從mfc的cdc類派生的,cdc類封裝了windows設備環境,以及包含了繪製到屏幕、打印機和其餘設備的幾十個成員函數
    在mfc中如何處理消息呢?
    在sdk中咱們利用的是消息循環和窗口過程函數對消息進行消息處理.
    在mfc中咱們用的是消息映射機制.
    下面是將消息映射添加到一個類中須要作的所有工做.
    1>經過將declare_message_map語句添加到類聲明中,聲明消息映射.
    2>經過放置標識消息的宏來執行消息映射,相應的類將在對begin_message_map和end_message_map的調用之間處理消息
    3>添加成員函數來處理消息
    一、構造cwinapp派生類的對象
    二、系統調用winmain()
    三、winmain調用initinstance,在該函數中建立cframewnd派生類對象,調用create函數建立窗口、調用showwindow函數顯示窗口。
    四、以後內部機制調用run,接受用戶的消息,並將消息導向默認的處理函數。當接收到wm_quit消息時,run內部調用exitinstance,退出程序。
    mfc採用消息映射(message map)機制取代c/c++語言中的switchcase結構來處理消息。
    消息映射:在mfc中把消息處理函數和它所要處理的特定的消息鏈接起來的一種機制。
    它經過宏來實現消息到成員函數的映射,並且這些函數沒必要是虛擬的成員函數,這樣不須要爲消息映射函數生成一個很大的虛擬函數表(v表),節省內存。 
    mfc消息映射機制包括一組消息映射宏。一條消息映射宏把一個windows消息和其消息處理函數聯結起來。
    mfc應用程序框架提供了消息映射功能。
    在類的實現源文件中用begin_message_map()和end_message_map()宏來定義消息映射。
    在類定義的結尾用declare_message_map()宏來聲明使用消息映射。
    hello的cmainwindow類只處理一種消息類型—wm_paint,所以其消息映射的實現以下所示:
    begin_message_map(cmainwindow,cframewnd);
     on_wm_paint()
    end_message_map()
    begin_message_map開始了消息映射,並標識了消息映射所屬的類和該類的基類
    end_message_map()結束消息映射.
    on_wm_paint()在begin_message_map和end_message_map()之間,稱作消息條目,在mfc爲100多種window消息提供了宏.
    afx_msg void onpaint();
    declare_message_map()
    afx_msg 醒目地暗示onpaint是一個消息處理程序,
    declare_message_map()聲明消息映射
    mfc把消息主要分爲三大類:
    (1)、標準windows消息(wm_xxx)
    使用宏:on_wm_xxx()          特色:有默認的消息處理函數
    (2)、命令消息:(wm_command)
    來自於菜單、工具條、按鈕等的消息
    使用宏: on_command(命令按鈕標識符id,消息處理函數)
    特色:由用戶指定消息處理函數
    三、」notification消息」(通知消息)由控件產生:
    bool    布爾值,取值爲true或者false
    bstr     32爲字符指針
    byte      8位整數無符號的
    colorref     32位數值表明一個顏色值
    dword    32位整數無符號的
    long     32位整數帶符號的
    lpctstr   32位指針,指向一個常字符串
    lpvoid    32位指針,指向一個爲指定類型的數據
    mfc特有的數據類型:
    1>position :一個數值,表明數組或者鏈表中元素的位置,在mfc中經常使用於數據處理類
    2>lprect:32位指針,指向一個不變的矩形區域結構
     
     
     
     
       這是我針對你的問題整理的一些資料不少我想刪減一些但我以爲這些都對你很重要
     
    關於cdc(設備上下文) hdc c/c++ 20080229 22:28:01 閱讀79 評論0   字號:大中小 訂閱 
     
    能夠簡單的如此理解:
    dc(device context),就是設備描述表(或者叫作設備環境),就像你做畫,須要用到畫筆,畫刷,顏料等等,這些東西就是做畫的環境,屬於設備dc的屬性全部,想做圖就先把做圖環境準備一下,這跟咱們做畫是同樣的道理。
     
    cdc和hdc簡單使用:
    cdc是設備上下文類;
    hdc是設備上下文句柄;
    //cdc-->hdc與hdc->cdc
    cdc dc;
    hdc hdc;
    hdc=dc.m_hdc;
    dc=cdc::fromhandle(hdc);
    // or  hdc=dc.getsafehdc();
     
    掛一段正規文檔(來源msdn):
    設備上下文
    設備上下文是一種包含有關某個設備(如顯示器或打印機)的繪製屬性信息的 windows 數據結構。全部繪製調用都經過設備上下文對象進行,這些對象封裝了用於繪製線條、形狀和文本的 windows api。設備上下文容許在 windows 中進行與設備無關的繪製。設備上下文可用於繪製到屏幕、打印機或者圖元文件。
    cpaintdc 對象將 windows 的常見固定用語進行封裝,調用 beginpaint 函數,而後在設備上下文中繪製,最後調用 endpaint 函數。cpaintdc 構造函數爲您調用 beginpaint,析構函數則調用 endpaint。該簡化過程將建立 cdc 對象、繪製和銷燬 cdc 對象。在框架中,甚至連這個過程的大部分也是自動的。具體說來,框架給 ondraw 函數傳遞(經過 onpreparedc)準備好的 cpaintdc,您只需繪製到 cpaintdc 中。根據調用 ondraw 函數的返回,cpaintdc 被框架銷燬而且將基礎設備上下文釋放給 windows。
    cclientdc 對象封裝對一個只表示窗口工做區的設備上下文的處理。cclientdc 構造函數調用 getdc 函數,析構函數調用 releasedc 函數。cwindowdc 對象封裝表示整個窗口(包括其框架)的設備上下文。
    cmetafiledc 對象將繪製封裝到 windows 圖元文件中。與傳遞給 ondraw 的 cpaintdc 相反,在這種狀況下您必須本身調用 onpreparedc。
    鼠標繪圖框架程序中的大多數繪圖(由此,大部分設備上下文參與)都在視圖的ondraw 成員函數中完成。可是,您仍然能夠將設備上下文對象做其餘用途使用。例如,若要在視圖中提供鼠標運動的跟蹤回饋,只需直接繪製到視圖中而無需等待調用 ondraw。
    在這種狀況中,可使用 cclientdc 設備上下文對象直接繪製到視圖中。
     
    再來一段比較清晰容易理解的。
    1、區別與聯繫
    hdc是句柄;
    cdc是mfc封裝的windows設備相關的一個類;
    cclientdc是cdc的衍生類,產生對應於windows客戶區的對象
    hdc是windows的一種數據類型,是設備描述句柄。
    而cdc是mfc裏的一個類,它封裝了幾乎全部的關於hdc的操做。   
    也能夠這樣說,hdc定義的變量指向一塊內存,這塊 內存用來描述一個設備的相關的內容,因此也能夠認爲hdc定義的是一個指針;而cdc類定義一個對象,這個對象擁有hdc定義的一個設備描述表,同時也包含與hdc相關的操做的函數。這與hpen和cpen,point與cpoint之間的差異是同樣的。

    2、得到cdc *
    cdc* pdc
    pdc=getdc();//原型cdc* cwnd::getdc() 

    3、得到hdc
    hdc hdc;
    1,hdc=getdc(pcpp>hwnd);
    2,pdc>m_hdc;
    3,(sdk中找不到相關類的支持)
        memdcxp mdcxp;
       getmemdcxp(&mdcxp);
        hdc = mdcxp.hmemdc;
    4,hdc=::getdc(hwnd handle)

    4、轉換(?,未肯定用法的正確性)
    cdc* pdc
    hdc hdc;
    pdc=attach(hdc);
    hdc=getsafehdc(pdc);
    pdc>m_hdc=hdc;
     
    下面一段翻譯自msdn sdk文檔
        cdc類定義的是設備上下文對象的類。cdc對象提供處理顯示器或打印機等設備上下文的成員函數,以及處理與窗口客戶區對應的顯示上下文的成員。    
       經過cdc對象的成員函數進行全部的繪圖。類對設備上下文操做提供了成員函數,處理繪圖工具。安全型圖形設備接口(gdi)對象收集,以及處理顏色和調色板。它還爲獲取和設置繪圖屬性、映射,處理視點、窗口擴展、轉換座標,處理區域、剪貼、繪製直線及繪製簡單橢圓和多邊形等形狀提供了成員函數。另外還爲繪製文本、處理字體,使用打印機跳轉,滾動和播放元文件提供成員函數。    
       使用cdc對象時要構造它,而後調用與它平等的、使用設備上下文的windows函數的成員函數。    
      爲了特定用途,microsoft基本類庫提供了幾個cdc派生類。cpaintdc包括beginpaint和endpaint調用。cclientdc管理窗口用戶區對應的顯示上下文。cwindowdc管理與整個窗口對應的顯示上下文,包括它的結構和控件。cmetafiledc與帶元文件的設備上下文對應。    
       cdc包含m_hdc和m_hattribdc兩個設備上下文,它們在cdc對象建立時參考同一個設備。cdc指導全部對m_hdc的輸出gdi調用以及對m_hattribdc的大部分屬性gdi調用(gettextcolor是屬性調用的例子,而settextcolor是一個輸出調用)。    
       例如框架使用這兩個設備上下文實現cmetafiledc對象,在從物理設備讀取屬性期間向元文件發送輸出。打印預覽以相同風格在框架中實現。還能夠以類似方法在特殊應用代碼中使用這兩個設備上下文。    
     
    http://zoudaokou2006.blog.163.com/blog/static/66650867200812910281360/
    cdc、hdc、pdc (zz)mfc 20091202 22:44:01 閱讀275 評論0   字號:大中小 訂閱 
    1.cdc *pdc和hdc hdc有什麼不一樣,相似的有cwnd *pwnd和hwnd?

    pdc是類指針
    hdc是windows句柄
    經過pdc得到hdc:
    hdc hdc=pdc>getsafehdc();
    經過hdc得到pdc:
    cdc *pdc=new cdc;
    pdc>attach(hdc);

    2.hdc和cdc有本質區別

    hdc是windows的一種數據類型,是設備描述句柄。而cdc是mfc裏的一個類,它封裝了幾乎全部的關於hdc的操做。也能夠這樣說,hdc定義的變量指向一塊內存,這內存用來描述一個設備的相關的內容,因此也能夠認爲hdc定義的是一個指針;而cdc類定義一個對象,這個對象擁有hdc定義的一個設備描述表,同時也包含與hdc相關的操做的函數。這與hpen和cpen,point與cpoint之間的差異是同樣的。

    cdc是對hdc的相關操做進行封裝,例如cdc的一個textout函數隱去其錯誤檢測,徹底能夠簡化到這樣程度cdc:textout( int x, int y, const cstring& str )
    {
        textout( m_hdc, x, y, (lpctstr)str, str.getlength() );
    }

    m_hdc就是cdc的成員變量hdc m_hdc;
    cdc有一個operatorhdc() const { return m_hdc; }   
    你能夠把它當成一個hdc使用

    3.this是dc輸出目標窗口的指針,經過它能夠獲得窗口句柄,對象帶參構造這有什麼奇怪的呢?   
        
        cpaintdc        無效區dc,至關於beginpaint,    endpaint  
        cclientdc       客戶區dc,至關於getdc,        releasedc   
        cwindowdc       整窗口dc, 至關於getwindowdc,   releasedc   
        cdc            任何dc,  至關於createdc,      deletedc
    hdc,cdc,cclientdc的區別和聯繫是什麼?圖片處理代碼 20100221 16:32:57 閱讀152 評論0   字號:大中小 訂閱 
    簡而言之,hdc是句柄;cdc是mfc封裝的windows 設備相關的一個類;cclientdc是cdc的衍生類,產生對應於windows客戶區的對象 
    pdc 是 類指針 
    hdc 是windows句柄 
    經過pdc得到hdc: 
    hdc hdc=pdc>getsafehdc(); 
    經過hdc得到pdc: 
    cdc *pdc=new cdc; 
    pdc>attach(hdc);

    hdc是windows的一種數據類型,是設備描述句柄。 
    而cdc是mfc裏的一個類,它封裝了幾乎全部的關於 
    hdc的操做。 
    也能夠這樣說,hdc定義的變量指向一塊內存,這塊 
    內存用來描述一個設備的相關的內容,因此也能夠 
    認爲hdc定義的是一個指針;而cdc類定義一個對象, 
    這個對象擁有hdc定義的一個設備描述表,同時也包 
    含與hdc相關的操做的函數。 
    這與hpen和cpen,point與cpoint之間的差異是同樣 

    顯然   
      cdc是類   
      hdc是句柄   
      cdc是包了hdc的類
    cdc和hdc的區別與轉換程序設計 20090728 21:46:10 閱讀46 評論0   字號:大中小 訂閱 
    源自: http://www.thatsky.cn/article.asp?id=81
    1、區別與聯繫
    hdc是句柄;cdc是mfc封裝的windows  設備相關的一個類;cclientdc是cdc的衍生類,產生對應於windows客戶區的對象
    hdc是windows的一種數據類型,是設備描述句柄。
    而cdc是mfc裏的一個類,它封裝了幾乎全部的關於hdc的操做。   
    也能夠這樣說,hdc定義的變量指向一塊內存,這塊 內存用來描述一個設備的相關的內容,因此也能夠   認爲hdc定義的是一個指針;而cdc類定義一個對象,   這個對象擁有hdc定義的一個設備描述表,同時也包   含與hdc相關的操做的函數。   
    這與hpen和cpen,point與cpoint之間的差異是同樣的。

    2、得到cdc *
    cdc* pdc
    pdc=getdc();

    3、得到hdc
    hdc hdc;
    1,hdc=getdc(pcxp>hwnd);
    2,pdc>m_hdc;
    3,
    memdcxp mdcxp;
    getmemdcxp(&mdcxp);
    hdc = mdcxp.hmemdc;
    4,hdc=::getdc(hwnd handle)

    4、轉換
    cdc* pdc
    hdc hdc;
    pdc=attach(hdc);
    hdc=getsafehdc(pdc);
    pdc>m_hdc==hdc
     
    設備描述表
    設備描述表  dc(device context)設備描述表 
      設備描述表是一個定義一組圖形對象及其屬性、影響輸出的圖形方式(數據)結構。windows提供設備描述表,用於應用程序和物理設備之間進行交互,從而提供了應用程序設計的平臺無關性。設備描述表又稱爲設備上下文,或者設備環境。 
      設備描述表是一種數據結構,它包括了一個設備(如顯示器和打印機)的繪製屬性相關的信息。全部的繪製操做經過設備描述表進行。設備描述表與大多 win32結構不一樣,應用程序不能直接訪問設備描述表,只能由各類相關api函數經過設備描述表的句柄間接訪問該結構。 
      設備描述表老是與某種系統硬件設備相關。好比屏幕設備描述表與顯示設備相關,打印機設備描述表與打印設備相關等等。 
      屏幕設備描述表,通常咱們簡單地稱其爲設備描述表。它與顯示設備具備必定的對應關係,在windows gdi界面下,它老是相關與某個窗口或這窗口上的某個顯示區域。一般意義上窗口的設備描述表,通常指的是窗口的客戶區,不包括標題欄、菜單欄所佔有的區域,而對於整個窗口來講,其設備描述表嚴格意義上來說應該稱爲窗口設備描述表,它包含窗口的所有顯示區域。兩者的操做方法徹底一致,所不一樣的僅僅是可操做的範圍不一樣而已。 
      windows 窗口一旦建立,它就自動地產生了與之相對應的設備描述表數據結構,用戶可運用該結構,實現對窗口顯示區域的gdi操做,如劃線、寫文本、繪製位圖、填充等,而且全部這些操做均要經過設備描述表句柄了進行。
     
    如何理解設備描述表???開發 20081127 11:02:35 閱讀29 評論0   字號:大中小 訂閱 
    設備描述表是一個定義一組圖形對象及其屬性、影響輸出的圖形方式(數據)結構。windows提供設備描述表,用於應用程序和物理設備之間進行交互,從而提供了應用程序設計的平臺無關性。設備描述表又稱爲設備上下文,或者設備環境。     
        設備描述表是一種數據結構,它包括了一個設備(如顯示器和打印機)的繪製屬性相關的信息。全部的繪製操做經過設備描述表進行。設備描述表與大多win32結構不一樣,應用程序不能直接訪問設備描述表,只能由各類相關api函數經過設備描述表的句柄間接訪問該結構。   
        設備描述表老是與某種系統硬件設備相關。好比屏幕設備描述表與顯示設備相關,打印機設備描述表與打印設備相關等等。   
        屏幕設備描述表,通常咱們簡單地稱其爲設備描述表。它與顯示設備具備必定的對應關係,在windows   gdi界面下,它老是相關與某個窗口或這窗口上的某個顯示區域。一般意義上窗口的設備描述表,通常指的是窗口的客戶區,不包括標題欄、菜單欄所佔有的區域,而對於整個窗口來講,其設備描述表嚴格意義上來說應該稱爲窗口設備描述表,它包含窗口的所有顯示區域。兩者的操做方法徹底一致,所不一樣的僅僅是可操做的範圍不一樣而已。   
        windows  窗口一旦建立,它就自動地產生了與之相對應的設備描述表數據結構,用戶可運用該結構,實現對窗口顯示區域的gdi操做,如劃線、寫文本、繪製位圖、填充等,而且全部這些操做均要經過設備描述表句柄了進行。   
     /***************************************************************************************/  
      書中是這麼說的,可是如何理解啊?   
      若是將設備描述表理解成爲設備的一種抽象地描述(或者說是硬件在數據結構上一種映射),那麼顯示設備描述表對應顯示器,在編寫程序的時候如今假設以getdc得到設備描述標的句柄。   
      hdc   =   getdc(hwnd);//得到窗口設備描述表句柄   
      [使用gdi函數]  
      releasedc(hwnd,   hdc);   
      我想知道這個過程和顯存的關係。也就是如何經過顯存繪製到顯示器對應的窗口上的。   
      再確切地說就是gdi繪製既然針對的是設備描述表,那麼設備描述表是否在內存中?   
      他和顯存之間的關係是什麼?
    經過設備描述表調用顯示卡驅動,由顯示卡驅動程序訪問顯存實現繪圖輸出,所以在gdi下面是沒法直接訪問到顯存的。這種方式主要是提供了統一的編程界面,使得編程人員不用考慮具體的設備的特性,一切和設備打交道的工做交由系統完成,編程者只要調用統一的gdi函數便可。設備描述表在內存中是存在的。
                                                                                                                                                    轉自csdn
    gdi是graphics device interface的縮寫,含義是圖形設備接口,它的主要任務是負責系統與繪圖程序之間的信息交換,處理全部windows程序的圖形輸出。
      在windows操做系統下,絕大多數具有圖形界面的應用程序都離不開gdi,咱們利用gdi所提供的衆多函數就能夠方便的在屏幕、打印機及其它輸出設備上輸出圖形,文本等操做。gdi的出現使程序員無須要關心硬件設備及設備驅動,就能夠將應用程序的輸出轉化爲硬件設備上的輸出,實現了程序開發者與硬件設備的隔離,大大方便了開發工做。 
      gdi是如何實現輸出的? 
      要想在屏幕或者其它輸出設備上輸出圖形或者文字,那麼咱們就必須先得到一個稱爲設備描述表( dc:device context)的對象的句柄,以它爲參數,調用各類gdi函數實現各類文字或圖形的輸出。設備描述表是gdi內部保存數據的一種數據結構,此結構中的屬性內容與特定的輸出設備(顯示器,打印機等)相關,屬性定義了gdi函數的工做細節,在這裏屬性肯定了文字的顏色,x座標和y座標映射到窗口顯示區域的方式等。
      設備描述表句柄一旦得到,那麼系統將使用默認的屬性值填充設備描述表結構。
      若是有必要,咱們可使用一些gdi函數獲取和改變設備描述表中的屬性值。
    如何使用設備描述表20070222 19:46:18 www.hackbase.com  來源:互聯網
    本文示例源代碼下載
     
      windows 程序在屏幕、打印機或其它設備上畫圖時,它並非將像素直接輸出到設備上,而是將圖繪製到由設備描述表表示的
     
    本文示例源代碼下載
     
      windows 程序在屏幕、打印機或其它設備上畫圖時,它並非將像素直接輸出到設備上,而是將圖繪製到由設備描述表表示的邏輯意義上的"顯示平面"上去。設備描述表(dc)是windows中的一種數據結構,它包含gdi須要的全部關於顯示界面狀況的描述字段,包括相連的物理設備和各類各樣的狀態信息。在windows畫圖以前,windows程序從gdi獲取設備描述表句柄(hdc),並在每次調用完gdi輸出函數後將句柄返回給gdi。本文將對如何得到和釋放hdc以及cdc及其派生類的使用方法進行演示說明。
     
      下載示例工程 dcdemo 具體說明:
     
      一、按鈕idc_getdc_apinull的函數
     
    voidcdcdemodlg::ongetdcapinull()
    {
      hdchdc=::getdc(null);
      ::movetoex(hdc,0,0,null);
      lineto(hdc,200,20);
      ::releasedc(null,hdc);
    }  該段代碼具體演示瞭如何使用api函數getdc(null),取得屏幕的hdc.並進行畫圖。 hdcgetdc(hwnd hwnd); //功能:取得hwnd窗口的設備描述表句柄。當hwnd參數爲null時,取得整個屏幕的設備描述表句柄。movetoex和lineto演示在dc上畫一條直線記住,最後調用releasedc釋放hdc資源。int releasedc(
    hwndhwnd,//你要控制的那個窗口的句柄,若是你在getdc函數傳遞的是null,如今還要傳遞null。
    hdc hdc//dc的句柄
    );編譯運行程序,按下按鈕,發現屏幕的左上角處畫了一條直線。
      二、按鈕idc_getdc_api的函數
     
    voidcdcdemodlg::ongetdcapi()
    {
      hdchdc=::getdc(m_hwnd);
      ::movetoex(hdc,0,0,null);
      lineto(hdc,200,50);
      ::releasedc(m_hwnd,hdc);
    }  這段代碼與前一段代碼惟一的區別是getdc的參數再也不是null,而改成cwnd的成員變量m_hwnd,即對話框窗口的句柄。對比兩段代碼運行結果,深刻體會api函數 getdc。
      三、按鈕idc_getdc_cwnd的函數
     
    voidcdcdemodlg::ongetdccwnd()
    {
      cdc*pdc=getdc();
      pdc>moveto(0,0);
      pdc>lineto(200,100);
      releasedc(pdc);
    }  該段代碼演示使用mfccwnd類的getdc函數和releasedc的方法,使用該方法在程序窗口中畫圖很是方便。爲了不獲取和釋放設備描述表所帶來的麻煩,mfc提供了一些cdc派生類,如cpaintdc,cclientdc,cwindowdc,這些類被設計爲可直接進行實例化。各個類的構造函數和析構函數調用相應的函數捕獲和釋放設備描述表,從而使得更加方便簡捷。
      四、按鈕idc_cclientdc的函數
    http://www.hackbase.com/lib/20070222/13807.html
    windows 程序設計中的設備描述表
    20090826 08:55
      從cdc 派生出四個功能更具體的設備描述表類。層次如圖所示。
       
      下面,分別討論派生出的四種設備描述表。
      ccientdc 
      表明窗口客戶區的設備描述表。其構造函數cclientdc(cwnd *pwin)經過::getdc獲取指定窗口的客戶區的設備描述表hdc,而且使用成員函數attach把它和cclientdc對象捆綁在一塊兒;其析構函數使用成員函數detach把設備描述表句柄hdc分離出來,並調用::releasedc釋放設備描述表hdc。  
      cpaintdc 
      僅僅用於響應wm_paint消息時繪製窗口,由於它的構造函數調用了::beginpaint獲取設備描述表hdc,而且使用成員函數attach把它和cpaintdc對象捆綁在一塊兒;析構函數使用成員函數detach把設備描述表句柄hdc分離出來,並調用::endpaint釋放設備描述表hdc,而::beginpaint和::endpaint僅僅在響應wm_paint時使用。  
      cmetafiledc 
      用於生成元文件。
      cwindowdc 
      表明整個窗口區(包括非客戶區)的設備描述表。其構造函數cwindowdc(cwnd *pwin)經過::getwindowdc獲取指定窗口的客戶區的設備描述表hdc,並使用attach把它和cwindowdc對象捆綁在一塊兒;其析構函數使用detach把設備描述表hdc分離出來,調用::releasedc釋放設備描述表hdc。
      
      本文來自bcwhy論壇,轉載請標明出處
      要使用設備描述表,通常有以下步驟:
      獲取或者建立設備描述表;
      必要的話,改變設備描述表的屬性;
      使用設備描述表完成繪製操做;
      釋放或刪除設備描述表。 
      common設備描述表經過::getdc,::getdcex,::beginpaint來得到一個設備描述表,用畢,用::releasedc或::endpaint釋放設備描述表;
      printer設備描述表經過::createdc建立設備描述表,用::deletedc刪除設備描述表。
      memory設備描述表經過::createcompatibledc建立設備描述表,用::deletedc刪除。
      information設備描述表經過::createic建立設備描述表,用::deletedc刪除
      html

相關文章
相關標籤/搜索