MFC中的DC、CDC、HDC、句柄、設(shè)備_第1頁
MFC中的DC、CDC、HDC、句柄、設(shè)備_第2頁
MFC中的DC、CDC、HDC、句柄、設(shè)備_第3頁
MFC中的DC、CDC、HDC、句柄、設(shè)備_第4頁
MFC中的DC、CDC、HDC、句柄、設(shè)備_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

MFC中的DC、CDC、HDC、句柄、設(shè)備上下文究竟是什么意思?

在MFC程序中,我們并不經(jīng)常直接調(diào)用WindowsAPI,而是從MFC類創(chuàng)建對象并調(diào)用屬于這些對象的成員函數(shù).也就是說MFC封裝了WindowsAPI你說你喜歡C++而MFC換一種說法就是一個用C++寫的一個函數(shù)庫然后你來調(diào)用只不過這個類不是你寫的

MFC提供數(shù)百個類,最重要的、也是編寫任何VC++應(yīng)用程序都必不可少的兩個類CWinApp和CFrameWnd,這兩個類是編寫復(fù)雜龐大應(yīng)用程序的基石。1>封裝特性:構(gòu)成MFC框架的是MFC類庫而MFC類庫又是C++的一個類庫。這些類封裝WIN32應(yīng)用程序編程接口,OLE(ObjectLinkEmbed對象鏈接嵌入)特性,ODBC和DAO數(shù)據(jù)訪問的功能。2>繼承特性:MFC抽象出了眾多類的共同特性,并設(shè)計出一些基類作為實(shí)現(xiàn)其他類的基礎(chǔ),這些類中最重要的類是CObject類和CCmdTarget類,程序員可以從適當(dāng)?shù)腗FC類中派生出自己的類,實(shí)現(xiàn)特定的功能達(dá)到編程的目的。3>虛擬和消息映射:MFC是以C++為基礎(chǔ),當(dāng)然支持虛函數(shù),但作為一個編程框架必須要解決的是效率問題:如果MFC僅僅通過虛函數(shù)來支持動態(tài)約束必然會產(chǎn)生大量的虛函數(shù)表這樣編程框架過于臃腫而且消耗更多的內(nèi)存。但是MFC建立了消息映射機(jī)制這樣降低了內(nèi)存的使用卻大大提高了效率消息映射是一個將消息和成員函數(shù)相互關(guān)聯(lián)的表,當(dāng)應(yīng)用程序的框架窗口接收到一個消息時,MFC將搜索該窗口的消息映射,如果存在一個處理消息的處理程序,那么就調(diào)用該處理程序.它通過宏來實(shí)現(xiàn)消息到成員函數(shù)的映射,而且這些函數(shù)不必是虛擬的成員函數(shù),這樣不需要為消息映射函數(shù)生成一個很大的虛擬函數(shù)表(V表),節(jié)省內(nèi)存。

MFC消息映射機(jī)制:將消息與消息處理函數(shù)聯(lián)系起來,形成一一對應(yīng)的機(jī)制。消息映射宏聲明:DECLARE_MESSAGE_MAP

定義:

BEGIN_MESSAGE_MAP

ON_COMMAND

ON_CONTROL

ON_MESSAGE

END_MESSAGE_MAPMFC主要組成部分:類、宏和全局函數(shù)。類是MFC中最主要的內(nèi)容。MFC類是以層次結(jié)構(gòu)方式組織起來的。MFC中的類分成兩部分,除了一些輔助類,大多數(shù)的MFC類是直接或間接從根類CObject派生而來。MFC宏主要功能:消息映射、運(yùn)行時對象類型服務(wù)、診斷服務(wù)、異常處理。

MFC約定:全局函數(shù)以“Afx”為前綴,全局變量以“afx”為前綴MFC類的層次關(guān)系CObject項(xiàng)目類)->CCmdTarget(消息響應(yīng)類)->{CWinThread(線程類)->CWinApp(Window應(yīng)用程序類)CDocument(文檔類)CWnd(窗體類)->[

CFrameWnd(框架類)

CView(視圖類)

]}CObject類由于MFC中大部分類是從CObject類繼承而來的,CObject類描述了幾乎所有的MFC類的一些公共特性,CObject類為程序員提供了對象診斷、運(yùn)行時類型識別和序列化等功能。CCmdTarget類由CObject類直接派生而來,它負(fù)責(zé)將消息發(fā)送到能夠響應(yīng)這些消息的對象。它是所有能進(jìn)行消息映射的MFC類的基類。CWinApp類在任何MFC應(yīng)用程序中有且僅有一個CWinApp派生類的對象,它代表了程序中運(yùn)行的主線程,也代表了應(yīng)用程序本身。CWinApp類取代了WinMain()主函數(shù)在SDK應(yīng)用程序中的地位。傳統(tǒng)SDK應(yīng)用程序WinMain()函數(shù)完成的工作?,F(xiàn)在由類CWinApp的InitApplication(),InitInstance()和Run()三個成員函數(shù)承擔(dān)。CWnd類由CCmdTarget類直接派生而來,該類及其派生類的實(shí)例是一個窗口。CWnd類代表了MFC中最基本的GUI對象,它是一個功能最完善、成員函數(shù)最多的MFC類。CFrameWnd類是CWnd類的派生類,主要用來掌管一個窗口,它取代了SDK應(yīng)用程序中窗口函數(shù)WndProc()的地位。CFrameWnd類的對象是一個框架窗口,包括邊框、標(biāo)題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。CDocument類在應(yīng)用程序中作為用戶文檔類的基類,它代表了用戶存儲或打開的一個文件。CView類是MFC中一個很基本的類,它作為其它MFC視圖類和用戶視圖派生類的基類。從API編程到MFC編程的過渡:WinMain(){

初始化WNDCLASS

注冊窗體結(jié)構(gòu)

創(chuàng)建窗口

->>>>>>>>應(yīng)用程序類CWinApp

顯示窗口

消息循環(huán)}

WndProc(){switch(…)

->>>>>>>>>框架窗口類CFrameWnd}MFCObject和WindowsObject的對應(yīng)關(guān)系:描述

Windows句柄

MFCObject

窗口

HWND

CWnd

設(shè)備上下文

HDC

CDC

菜單

HMENU

CMenu

HPEN

CPen刷子

HBRUSH

CBrush字體

HFONT

CFont位圖

HBITMAP

CBitmap套接字

SOCKET

CSocket三、手工創(chuàng)建一個MFC應(yīng)用程序:注意:創(chuàng)建MFC程序,要創(chuàng)建一個Win32空項(xiàng)目,并要選擇項(xiàng)目屬性中的”在共享DLL文件中使用MFC,然后新建我們的文件例子:在”hello.h”頭文件中添寫如下代碼:classCMyApp:publicCWinApp{public:

virtualBOOLInitInstance();//虛函數(shù)};classCMainWindow:publicCFrameWnd{public:

CMainWindow();protected:

afx_msgvoidOnPaint();

DECLARE_MESSAGE_MAP();//聲明消息映射};在”hello.cpp”源文件中添寫如下代碼:#include<afxwin.h>#include“hello.h"CMyAppmyApp;BOOLCMyApp::InitInstance(){

m_pMainWnd=newCMainWindow;

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

returnTRUE;}BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)

ON_WM_PAINT()END_MESSAGE_MAP()

//消息映射CMainWindow::CMainWindow()//構(gòu)造函數(shù)初始化{

Create(NULL,“我的第一個MFC應(yīng)用程序”);//創(chuàng)建窗體}voidCMainWindow::OnPaint(){

CPaintDCdc(this);

CRectrect;

GetClientRect(&rect);

dc.DrawText("HelloMFC",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);}CWinApp是應(yīng)用程序類,在MFC應(yīng)用程序中必須從這個類派生出一個類,該派生類是MFC應(yīng)用程序的入口必須定義這個派生類的對象,并且只能有一個這個對象代表整個應(yīng)用程序。

成員函數(shù):InitInstance()

功能:初始化應(yīng)用程序?qū)嵗痛翱趯?shí)例,

虛函數(shù)CWinApp::InitInstance必須在派生類中重寫。在InitInstance函數(shù)中,編寫初始化代碼,如:創(chuàng)建一個窗口

顯示一個窗口CFrameWnd類

作用:為應(yīng)用程序提供一個窗口,同時實(shí)現(xiàn)消息處理功能。成員函數(shù):Create()功能:創(chuàng)建窗體,將之賦于CFrameWnd對象上。BOOLCreate(窗口類型,窗口標(biāo)題,顯示風(fēng)格,顯示區(qū)域,符窗口句柄,菜單,擴(kuò)展顯示風(fēng)格,上下文對象)共有8個參數(shù),前兩個必須給出,后6個可以默認(rèn)。MFC應(yīng)用程序的核心就是基于CWinApp類的應(yīng)用程序?qū)ο?CWinApp提供了消息循環(huán)來檢索消息并將消息調(diào)度給應(yīng)用程序的窗口.我們在編寫MFC應(yīng)用程序時,要包含afxwin.h,一個MFC應(yīng)用程序可以有且僅有一個應(yīng)用程序?qū)ο?對象必須聲明為在全局范圍內(nèi)有效(也就是全局對象),以便它在程序開始時即在內(nèi)存中被實(shí)例化我們的HelloMFC的應(yīng)用程序類被命名為CMyApp,它在hello.cpp中用如下語句進(jìn)行了實(shí)例化:CMyAppmyApp;CMyApp的類聲明在hello.h中代碼如下:classCMyApp:publicCWinApp{public:

virtualBOOLInitInstance();};CMyApp沒有聲明任何的數(shù)據(jù)成員,只是重寫了一個從CWinApp類中繼承來的函數(shù),在應(yīng)用程序的生存期內(nèi)InitInstance的調(diào)用比較早,是在應(yīng)用程序開始運(yùn)行以后而窗口創(chuàng)建之前,除非InitIstance創(chuàng)建一個窗口,否則應(yīng)用程序是不會有窗口,這正是為什么即使最小的MFC應(yīng)用程序也必須從CWinApp派生出一個類并重寫CWinApp::InitIstance的原因InitInstance函數(shù):CWinApp::InitInstance是一個虛函數(shù),其默認(rèn)操作僅包含一條語句:returnTRUE;InitInstance是用來執(zhí)行程序每次開始時都需要進(jìn)行的初始化工作最好的地方在hello.cpp中,CMyApp的InitInstance通過實(shí)例化hello的CMainWindow類來創(chuàng)建hello窗口,語句:m_pMainWnd=newCMainWindow;構(gòu)造了一個CMainWindow對象指針,并將其地址復(fù)制到了應(yīng)用程序?qū)ο蟮膍_pMainWnd數(shù)據(jù)成員中,窗口創(chuàng)建以后,InitInstance就會通過CMainWindow指針調(diào)用ShowWindow和UpdateWindow函數(shù)顯示它:m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateWindow();ShowWindow和UpdateWindow是所有窗口對象共用的CWnd成員函數(shù)其中包括CFrameWnd類的對象,CMainWindow就是從CFrameWnd派生出來的.要從MFC程序調(diào)用一個常規(guī)的WindowsAPI函數(shù),需要在函數(shù)名稱前添加一個全局運(yùn)算符::例如:::UpdateWindow();通過生成窗口對象并調(diào)用其Create函數(shù),MFC應(yīng)用程序可以創(chuàng)建一個窗口,在CMyApp::InitInstance中,hello創(chuàng)建了一個CMainWindow對象,CMainWindow的構(gòu)造函數(shù)生成在屏幕上看到的窗口:Create(NULL,”我的第一個MFC應(yīng)用程序”);CPaintDCdc(this);MFC的CPaintDC類是從MFC的CDC類派生的,CDC類封裝了Windows設(shè)備環(huán)境,以及包含了繪制到屏幕、打印機(jī)和其他設(shè)備的幾十個成員函數(shù)在MFC中如何處理消息呢?在SDK中我們利用的是消息循環(huán)和窗口過程函數(shù)對消息進(jìn)行消息處理.在MFC中我們用的是消息映射機(jī)制.下面是將消息映射添加到一個類中需要做的全部工作.1>通過將DECLARE_MESSAGE_MAP語句添加到類聲明中,聲明消息映射.2>通過放置標(biāo)識消息的宏來執(zhí)行消息映射,相應(yīng)的類將在對BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的調(diào)用之間處理消息3>添加成員函數(shù)來處理消息1、構(gòu)造CWinApp派生類的對象2、系統(tǒng)調(diào)用WinMain()3、WinMain調(diào)用InitInstance,在該函數(shù)中創(chuàng)建CFrameWnd派生類對象,調(diào)用Create函數(shù)創(chuàng)建窗口、調(diào)用ShowWindow函數(shù)顯示窗口。4、之后內(nèi)部機(jī)制調(diào)用Run,接受用戶的消息,并將消息導(dǎo)向默認(rèn)的處理函數(shù)。當(dāng)接收到WM_QUIT消息時,Run內(nèi)部調(diào)用ExitInstance,退出程序。MFC采用消息映射(MessageMap)機(jī)制取代C/C++語言中的switch-case結(jié)構(gòu)來處理消息。消息映射:在MFC中把消息處理函數(shù)和它所要處理的特定的消息連接起來的一種機(jī)制。它通過宏來實(shí)現(xiàn)消息到成員函數(shù)的映射,而且這些函數(shù)不必是虛擬的成員函數(shù),這樣不需要為消息映射函數(shù)生成一個很大的虛擬函數(shù)表(V表),節(jié)省內(nèi)存。

MFC消息映射機(jī)制包括一組消息映射宏。一條消息映射宏把一個Windows消息和其消息處理函數(shù)聯(lián)結(jié)起來。MFC應(yīng)用程序框架提供了消息映射功能。在類的實(shí)現(xiàn)源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏來定義消息映射。在類定義的結(jié)尾用DECLARE_MESSAGE_MAP()宏來聲明使用消息映射。Hello的CmainWindow類只處理一種消息類型—WM_PAINT,因此其消息映射的實(shí)現(xiàn)如下所示:BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd);

ON_WM_PAINT()END_MESSAGE_MAP()BEGIN_MESSAGE_MAP開始了消息映射,并標(biāo)識了消息映射所屬的類和該類的基類END_MESSAGE_MAP()結(jié)束消息映射.ON_WM_PAINT()在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之間,稱做消息條目,在MFC為100多種Window消息提供了宏.afx_msgvoidOnPaint();DECLARE_MESSAGE_MAP()afx_msg醒目地暗示OnPaint是一個消息處理程序,DECLARE_MESSAGE_MAP()聲明消息映射MFC把消息主要分為三大類:(1)、標(biāo)準(zhǔn)Windows消息(WM_XXX)使用宏:ON_WM_XXX()

特點(diǎn):有默認(rèn)的消息處理函數(shù)(2)、命令消息:(WM_COMMAND)來自于菜單、工具條、按鈕等的消息使用宏:ON_COMMAND(命令按鈕標(biāo)識符ID,消息處理函數(shù))特點(diǎn):由用戶指定消息處理函數(shù)3、”Notification消息”(通知消息)由控件產(chǎn)生:BOOL

布爾值,取值為TRUE或者FALSEBSTR

32為字符指針BYTE

8位整數(shù)無符號的COLORREF

32位數(shù)值代表一個顏色值DWORD

32位整數(shù)無符號的LONG

32位整數(shù)帶符號的LPCTSTR

32位指針,指向一個常字符串LPVOID

32位指針,指向一個為指定類型的數(shù)據(jù)MFC特有的數(shù)據(jù)類型:1>POSITION:一個數(shù)值,代表數(shù)組或者鏈表中元素的位置,在MFC中常用于數(shù)據(jù)處理類2>LPRECT:32位指針,指向一個不變的矩形區(qū)域結(jié)構(gòu)

這是我針對你的問題整理的一些資料很多我想刪減一些但我覺得這些都對你很重要關(guān)于CDC(設(shè)備上下文)HDC

C/C++2008-02-2922:28:01閱讀79評論0

字號:大中小訂閱

可以簡單的如此理解:DC(DEVICECONTEXT),就是設(shè)備描述表(或者叫做設(shè)備環(huán)境),就像你作畫,需要用到畫筆,畫刷,顏料等等,這些東西就是作畫的環(huán)境,屬于設(shè)備DC的屬性所有,想作圖就先把作圖環(huán)境準(zhǔn)備一下,這跟我們作畫是一樣的道理。

CDC和HDC簡單使用:CDC是設(shè)備上下文類;HDC是設(shè)備上下文句柄;//CDC-->HDC與HDC->CDCCDCdc;HDChdc;hdc=dc.m_hDC;dc=CDC::FromHandle(hdc);//or

hdc=dc.GetSafeHdc();

掛一段正規(guī)文檔(來源MSDN):設(shè)備上下文設(shè)備上下文是一種包含有關(guān)某個設(shè)備(如顯示器或打印機(jī))的繪制屬性信息的Windows數(shù)據(jù)結(jié)構(gòu)。所有繪制調(diào)用都通過設(shè)備上下文對象進(jìn)行,這些對象封裝了用于繪制線條、形狀和文本的WindowsAPI。設(shè)備上下文允許在Windows中進(jìn)行與設(shè)備無關(guān)的繪制。設(shè)備上下文可用于繪制到屏幕、打印機(jī)或者圖元文件。CPaintDC對象將Windows的常見固定用語進(jìn)行封裝,調(diào)用BeginPaint函數(shù),然后在設(shè)備上下文中繪制,最后調(diào)用EndPaint函數(shù)。CPaintDC構(gòu)造函數(shù)為您調(diào)用BeginPaint,析構(gòu)函數(shù)則調(diào)用EndPaint。該簡化過程將創(chuàng)建CDC對象、繪制和銷毀CDC對象。在框架中,甚至連這個過程的大部分也是自動的。具體說來,框架給OnDraw函數(shù)傳遞(通過OnPrepareDC)準(zhǔn)備好的CPaintDC,您只需繪制到CPaintDC中。根據(jù)調(diào)用OnDraw函數(shù)的返回,CPaintDC被框架銷毀并且將基礎(chǔ)設(shè)備上下文釋放給Windows。CClientDC對象封裝對一個只表示窗口工作區(qū)的設(shè)備上下文的處理。CClientDC構(gòu)造函數(shù)調(diào)用GetDC函數(shù),析構(gòu)函數(shù)調(diào)用ReleaseDC函數(shù)。CWindowDC對象封裝表示整個窗口(包括其框架)的設(shè)備上下文。CMetaFileDC對象將繪制封裝到Windows圖元文件中。與傳遞給OnDraw的CPaintDC相反,在這種情況下您必須自己調(diào)用OnPrepareDC。鼠標(biāo)繪圖框架程序中的大多數(shù)繪圖(由此,大部分設(shè)備上下文參與)都在視圖的OnDraw成員函數(shù)中完成。但是,您仍然可以將設(shè)備上下文對象作其他用途使用。例如,若要在視圖中提供鼠標(biāo)運(yùn)動的跟蹤回饋,只需直接繪制到視圖中而無需等待調(diào)用OnDraw。在這種情況中,可以使用CClientDC設(shè)備上下文對象直接繪制到視圖中。

再來一段比較清晰容易理解的。一、區(qū)別與聯(lián)系HDC是句柄;CDC是MFC封裝的Windows設(shè)備相關(guān)的一個類;CClientDC是CDC的衍生類,產(chǎn)生對應(yīng)于Windows客戶區(qū)的對象HDC是WINDOWS的一種數(shù)據(jù)類型,是設(shè)備描述句柄。而CDC是MFC里的一個類,它封裝了幾乎所有的關(guān)于HDC的操作。

也可以這樣說,HDC定義的變量指向一塊內(nèi)存,這塊內(nèi)存用來描述一個設(shè)備的相關(guān)的內(nèi)容,所以也可以認(rèn)為HDC定義的是一個指針;而CDC類定義一個對象,這個對象擁有HDC定義的一個設(shè)備描述表,同時也包含與HDC相關(guān)的操作的函數(shù)。這與HPEN和CPen,POINT與CPoint之間的差別是一樣的。二、獲得CDC*CDC*pDCpDC=GetDC();//原型CDC*CWnd::GetDC()

三、獲得hdcHDChDC;1,hDC=GetDC(pCpp->hWnd);2,pDC->m_hDC;3,(SDK中找不到相關(guān)類的支持)

MEMDCXPMdcxp;

GetMemDCXP(&Mdcxp);

hDC=Mdcxp.hMemDC;4,hDC=::GetDC(HWNDhandle)四、轉(zhuǎn)換(?,未確定用法的正確性)CDC*pDCHDChDC;pDC=Attach(hDC);hDC=GetSafeHDC(pDC);pDC->m_hDC=hDC;

下面一段翻譯自MSDNSDK文檔

CDC類定義的是設(shè)備上下文對象的類。CDC對象提供處理顯示器或打印機(jī)等設(shè)備上下文的成員函數(shù),以及處理與窗口客戶區(qū)對應(yīng)的顯示上下文的成員。

通過CDC對象的成員函數(shù)進(jìn)行所有的繪圖。類對設(shè)備上下文操作提供了成員函數(shù),處理繪圖工具。安全型圖形設(shè)備接口(GDI)對象收集,以及處理顏色和調(diào)色板。它還為獲取和設(shè)置繪圖屬性、映射,處理視點(diǎn)、窗口擴(kuò)展、轉(zhuǎn)換坐標(biāo),處理區(qū)域、剪貼、繪制直線及繪制簡單橢圓和多邊形等形狀提供了成員函數(shù)。另外還為繪制文本、處理字體,使用打印機(jī)跳轉(zhuǎn),滾動和播放元文件提供成員函數(shù)。

使用CDC對象時要構(gòu)造它,然后調(diào)用與它平等的、使用設(shè)備上下文的Windows函數(shù)的成員函數(shù)。

為了特定用途,Microsoft基本類庫提供了幾個CDC派生類。CPaintDC包括BeginPaint和EndPaint調(diào)用。CClientDC管理窗口用戶區(qū)對應(yīng)的顯示上下文。CWindowDC管理與整個窗口對應(yīng)的顯示上下文,包括它的結(jié)構(gòu)和控件。CMetaFileDC與帶元文件的設(shè)備上下文對應(yīng)。

CDC包含m_hDC和m_hAttribDC兩個設(shè)備上下文,它們在CDC對象創(chuàng)建時參考同一個設(shè)備。CDC指導(dǎo)所有對m_hDC的輸出GDI調(diào)用以及對m_hAttribDC的大部分屬性GDI調(diào)用(GetTextColor是屬性調(diào)用的例子,而SetTextColor是一個輸出調(diào)用)。

例如框架使用這兩個設(shè)備上下文實(shí)現(xiàn)CMetaFileDC對象,在從物理設(shè)備讀取屬性期間向元文件發(fā)送輸出。打印預(yù)覽以相同風(fēng)格在框架中實(shí)現(xiàn)。還可以以相似方法在特殊應(yīng)用代碼中使用這兩個設(shè)備上下文。

/blog/static/66650867200812910281360/CDC、HDC、pDC(zz)MFC2009-12-0222:44:01閱讀275評論0

字號:大中小訂閱

1.CDC*pDC和HDChdc有什么不同,類似的有CWnd*pWnd和HWnd?pDC是類指針HDC是windows句柄通過pDC獲得hdc:HDChdc=pDC->GetSafeHdc();通過hdc獲得pDC:CDC*pDC=newCDC;pDC->Attach(hdc);2.hDC和CDC有本質(zhì)區(qū)別HDC是WINDOWS的一種數(shù)據(jù)類型,是設(shè)備描述句柄。而CDC是MFC里的一個類,它封裝了幾乎所有的關(guān)于HDC的操作。也可以這樣說,HDC定義的變量指向一塊內(nèi)存,這內(nèi)存用來描述一個設(shè)備的相關(guān)的內(nèi)容,所以也可以認(rèn)為HDC定義的是一個指針;而CDC類定義一個對象,這個對象擁有HDC定義的一個設(shè)備描述表,同時也包含與HDC相關(guān)的操作的函數(shù)。這與HPEN和CPen,POINT與CPoint之間的差別是一樣的。CDC是對hDC的相關(guān)操作進(jìn)行封裝,例如CDC的一個TextOut函數(shù)隱去其錯誤檢測,完全可以簡化到這樣程度CDC:TextOut(intx,inty,constCString&str){

TextOut(m_hDC,x,y,(LPCTSTR)str,str.GetLength());}m_hDC就是CDC的成員變量HDCm_hDC;CDC有一個operatorHDC()const{returnm_hDC;}

你可以把它當(dāng)成一個HDC使用3.this是dc輸出目標(biāo)窗口的指針,通過它可以得到窗口句柄,對象帶參構(gòu)造這有什么奇怪的呢?

CPaintDC

無效區(qū)dc,相當(dāng)于BeginPaint,

EndPaint

CClientDC

客戶區(qū)dc,相當(dāng)于GetDC,

ReleaseDC

CWindowDC

整窗口dc,相當(dāng)于GetWindowDC,

ReleaseDC

CDC

任何dc,

相當(dāng)于CreateDC,

DeleteDCHDC,CDC,CClientDC的區(qū)別和聯(lián)系是什么?圖片處理代碼2010-02-2116:32:57閱讀152評論0

字號:大中小訂閱

簡而言之,HDC是句柄;CDC是MFC封裝的Windows設(shè)備相關(guān)的一個類;CClientDC是CDC的衍生類,產(chǎn)生對應(yīng)于Windows客戶區(qū)的對象

pDC是類指針

HDC是windows句柄

通過pDC獲得hdc:

HDChdc=pDC->GetSafeHdc();

通過hdc獲得pDC:

CDC*pDC=newCDC;

pDC->Attach(hdc);HDC是WINDOWS的一種數(shù)據(jù)類型,是設(shè)備描述句柄。

而CDC是MFC里的一個類,它封裝了幾乎所有的關(guān)于

HDC的操作。

也可以這樣說,HDC定義的變量指向一塊內(nèi)存,這塊

內(nèi)存用來描述一個設(shè)備的相關(guān)的內(nèi)容,所以也可以

認(rèn)為HDC定義的是一個指針;而CDC類定義一個對象,

這個對象擁有HDC定義的一個設(shè)備描述表,同時也包

含與HDC相關(guān)的操作的函數(shù)。

這與HPEN和CPen,POINT與CPoint之間的差別是一樣

的顯然

CDC是類

HDC是句柄

CDC是包了HDC的類CDC和HDC的區(qū)別與轉(zhuǎn)換程序設(shè)計2009-07-2821:46:10閱讀46評論0

字號:大中小訂閱

源自:/article.asp?id=81一、區(qū)別與聯(lián)系HDC是句柄;CDC是MFC封裝的Windows

設(shè)備相關(guān)的一個類;CClientDC是CDC的衍生類,產(chǎn)生對應(yīng)于Windows客戶區(qū)的對象HDC是WINDOWS的一種數(shù)據(jù)類型,是設(shè)備描述句柄。而CDC是MFC里的一個類,它封裝了幾乎所有的關(guān)于HDC的操作。

也可以這樣說,HDC定義的變量指向一塊內(nèi)存,這塊內(nèi)存用來描述一個設(shè)備的相關(guān)的內(nèi)容,所以也可以

認(rèn)為HDC定義的是一個指針;而CDC類定義一個對象,

這個對象擁有HDC定義的一個設(shè)備描述表,同時也包

含與HDC相關(guān)的操作的函數(shù)。

這與HPEN和CPen,POINT與CPoint之間的差別是一樣的。二、獲得CDC*CDC*pDCpDC=GetDC();三、獲得hdcHDChDC;1,hDC=GetDC(pCxp->hWnd);2,pDC->m_hDC;3,MEMDCXPMdcxp;GetMemDCXP(&Mdcxp);hDC=Mdcxp.hMemDC;4,hDC=::GetDC(HWNDhandle)四、轉(zhuǎn)換CDC*pDCHDChDC;pDC=Attach(hDC);hDC=GetSafeHDC(pDC);pDC->m_hDC==hDC設(shè)備描述表設(shè)備描述表DC(DeviceContext)設(shè)備描述表

設(shè)備描述表是一個定義一組圖形對象及其屬性、影響輸出的圖形方式(數(shù)據(jù))結(jié)構(gòu)。windows提供設(shè)備描述表,用于應(yīng)用程序和物理設(shè)備之間進(jìn)行交互,從而提供了應(yīng)用程序設(shè)計的平臺無關(guān)性。設(shè)備描述表又稱為設(shè)備上下文,或者設(shè)備環(huán)境。

設(shè)備描述表是一種數(shù)據(jù)結(jié)構(gòu),它包括了一個設(shè)備(如顯示器和打印機(jī))的繪制屬性相關(guān)的信息。所有的繪制操作通過設(shè)備描述表進(jìn)行。設(shè)備描述表與大多WIN32結(jié)構(gòu)不同,應(yīng)用程序不能直接訪問設(shè)備描述表,只能由各種相關(guān)API函數(shù)通過設(shè)備描述表的句柄間接訪問該結(jié)構(gòu)。

設(shè)備描述表總是與某種系統(tǒng)硬件設(shè)備相關(guān)。比如屏幕設(shè)備描述表與顯示設(shè)備相關(guān),打印機(jī)設(shè)備描述表與打印設(shè)備相關(guān)等等。

屏幕設(shè)備描述表,一般我們簡單地稱其為設(shè)備描述表。它與顯示設(shè)備具有一定的對應(yīng)關(guān)系,在windowsGDI界面下,它總是相關(guān)與某個窗口或這窗口上的某個顯示區(qū)域。通常意義上窗口的設(shè)備描述表,一般指的是窗口的客戶區(qū),不包括標(biāo)題欄、菜單欄所占有的區(qū)域,而對于整個窗口來說,其設(shè)備描述表嚴(yán)格意義上來講應(yīng)該稱為窗口設(shè)備描述表,它包含窗口的全部顯示區(qū)域。二者的操作方法完全一致,所不同的僅僅是可操作的范圍不同而已。

windows窗口一旦創(chuàng)建,它就自動地產(chǎn)生了與之相對應(yīng)的設(shè)備描述表數(shù)據(jù)結(jié)構(gòu),用戶可運(yùn)用該結(jié)構(gòu),實(shí)現(xiàn)對窗口顯示區(qū)域的GDI操作,如劃線、寫文本、繪制位圖、填充等,并且所有這些操作均要通過設(shè)備描述表句柄了進(jìn)行。如何理解設(shè)備描述表???開發(fā)2008-11-2711:02:35閱讀29評論0

字號:大中小訂閱

設(shè)備描述表是一個定義一組圖形對象及其屬性、影響輸出的圖形方式(數(shù)據(jù))結(jié)構(gòu)。windows提供設(shè)備描述表,用于應(yīng)用程序和物理設(shè)備之間進(jìn)行交互,從而提供了應(yīng)用程序設(shè)計的平臺無關(guān)性。設(shè)備描述表又稱為設(shè)備上下文,或者設(shè)備環(huán)境。

設(shè)備描述表是一種數(shù)據(jù)結(jié)構(gòu),它包括了一個設(shè)備(如顯示器和打印機(jī))的繪制屬性相關(guān)的信息。所有的繪制操作通過設(shè)備描述表進(jìn)行。設(shè)備描述表與大多WIN32結(jié)構(gòu)不同,應(yīng)用程序不能直接訪問設(shè)備描述表,只能由各種相關(guān)API函數(shù)通過設(shè)備描述表的句柄間接訪問該結(jié)構(gòu)。

設(shè)備描述表總是與某種系統(tǒng)硬件設(shè)備相關(guān)。比如屏幕設(shè)備描述表與顯示設(shè)備相關(guān),打印機(jī)設(shè)備描述表與打印設(shè)備相關(guān)等等。

屏幕設(shè)備描述表,一般我們簡單地稱其為設(shè)備描述表。它與顯示設(shè)備具有一定的對應(yīng)關(guān)系,在windows

GDI界面下,它總是相關(guān)與某個窗口或這窗口上的某個顯示區(qū)域。通常意義上窗口的設(shè)備描述表,一般指的是窗口的客戶區(qū),不包括標(biāo)題欄、菜單欄所占有的區(qū)域,而對于整個窗口來說,其設(shè)備描述表嚴(yán)格意義上來講應(yīng)該稱為窗口設(shè)備描述表,它包含窗口的全部顯示區(qū)域。二者的操作方法完全一致,所不同的僅僅是可操作的范圍不同而已。

windows

窗口一旦創(chuàng)建,它就自動地產(chǎn)生了與之相對應(yīng)的設(shè)備描述表數(shù)據(jù)結(jié)構(gòu),用戶可運(yùn)用該結(jié)構(gòu),實(shí)現(xiàn)對窗口顯示區(qū)域的GDI操作,如劃線、寫文本、繪制位圖、填充等,并且所有這些操作均要通過設(shè)備描述表句柄了進(jìn)行。

/***************************************************************************************/

書中是這么說的,但是如何理解???

如果將設(shè)備描述表理解成為設(shè)備的一種抽象地描述(或者說是硬件在數(shù)據(jù)結(jié)構(gòu)上一種映射),那么顯示設(shè)備描述表對應(yīng)顯示器,在編寫程序的時候現(xiàn)在假設(shè)以GetDC獲得設(shè)備描述標(biāo)的句柄。

hdc

=

GetDC(hwnd);//獲得窗口設(shè)備描述表句柄

[使用GDI函數(shù)]

ReleaseDC(hwnd,

hdc);

我想知道這個過程和顯存的關(guān)系。也就是如何通過顯存繪制到顯示器對應(yīng)的窗口上的。

再確切地說就是GDI繪制既然針對的是設(shè)備描述表,那么設(shè)備描述表是否在內(nèi)存中?

他和顯存之間的關(guān)系是什么?通過設(shè)備描述表調(diào)用顯示卡驅(qū)動,由顯示卡驅(qū)動程序訪問顯存實(shí)現(xiàn)繪圖輸出,因此在GDI下面是無法直接訪問到顯存的。這種方式主要是提供了統(tǒng)一的編程界面,使得編程人員不用考慮具體的設(shè)備的特性,一切和設(shè)備打交道的工作交由系統(tǒng)完成,編程者只要調(diào)用統(tǒng)一的GDI函數(shù)即可。設(shè)備描述表在內(nèi)存中是存在的。

轉(zhuǎn)自CSDNGDI是GraphicsDeviceInterface的縮寫,含義是圖形設(shè)備接口,它的主要任務(wù)是負(fù)責(zé)系統(tǒng)與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。在Windows操作系統(tǒng)下,絕大多數(shù)具備圖形界面的應(yīng)用程序都離不開GDI,我們利用GDI所提供的眾多函數(shù)就可以方便的在屏幕、打印機(jī)及其它輸出設(shè)備上輸出圖形,文本等操作。GDI的出現(xiàn)使程序員無需要關(guān)心硬件設(shè)備及設(shè)備驅(qū)動,就可以將應(yīng)用程序的輸出轉(zhuǎn)化為硬件設(shè)備上的輸出,實(shí)現(xiàn)了程序開發(fā)者與硬件設(shè)備的隔離,大大方便了開發(fā)工作。

GDI是如何實(shí)現(xiàn)輸出的?要想在屏幕或者其它輸出設(shè)備上輸出圖形或者文字,那么我們就必須先獲得一個稱為設(shè)備描述表(DC:DeviceContext)的對象的句柄,以它為參數(shù),調(diào)用各種GDI函數(shù)實(shí)現(xiàn)各種文字或圖形的輸出。設(shè)備描述表是GDI內(nèi)部保存數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),此結(jié)構(gòu)中的屬性內(nèi)容與特定的輸出設(shè)備(顯示器,打印機(jī)等)相關(guān),屬性定義了GDI函數(shù)的工作細(xì)節(jié),在這里屬性確定了文字的顏色,x坐標(biāo)和y坐標(biāo)映射到窗口顯示區(qū)域的方式等。設(shè)備描述表句柄一旦獲得,那么系統(tǒng)將使用默認(rèn)的屬性值填充設(shè)備描述表結(jié)構(gòu)。如果有必要,我們可以使用一些GDI函數(shù)獲取和改變設(shè)備描述表中的屬性值。如何使用設(shè)備描述表2007-02-2219:46:18

來源:互聯(lián)網(wǎng)本文示例源代碼下載Windows程序在屏幕、打印機(jī)或其它設(shè)備上畫圖時,它并不是將像素直接輸出到設(shè)備上,而是將圖繪制到由設(shè)備描述表表示的本文示例源代碼下載Windows程序在屏幕、打印機(jī)或其它設(shè)備上畫圖時,它并不是將像素直接輸出到設(shè)備上,而是將圖繪制到由設(shè)備描述表表示的邏輯意義上的"顯示平面"上去。設(shè)備描述表(DC)是Windows中的一種數(shù)據(jù)結(jié)構(gòu),它包含GDI需要的所有關(guān)于顯示界面情況的描述字段,包括相連的物理設(shè)備和各種各樣的狀態(tài)信息。在Windows畫圖之前,Windows程序從GDI獲取設(shè)備描述表句柄(HDC),并在每次調(diào)用完GDI輸出函數(shù)后將句柄返回給GDI。本文將對如何獲得和釋放HDC以及CDC及其派生類的使用方法進(jìn)行演示說明。下載示例工程DCDemo具體說明:1、按鈕IDC_GETDC_APINULL的函數(shù)voidCDCDemoDlg::OnGetdcApinull(){HDChDC=::GetDC(NULL);::MoveToEx(hDC,0,0,NULL);LineTo(hDC,200,20);::ReleaseDC(NULL,hDC);}該段代碼具體演示了如何使用API函數(shù)GetDC(NULL),取得屏幕的HDC.并進(jìn)行畫圖。HDCGetDC(HWNDhWnd);//功能:取得hWnd窗口的設(shè)備描述表句柄。當(dāng)hWnd參數(shù)為NULL時,取得整個屏幕的設(shè)備描述表句柄。MoveToEx和LineTo演示在DC上畫一條直線記住,最后調(diào)用ReleaseDC釋放HDC資源。intReleaseDC(HWNDhWnd,//你要控制的那個窗口的句柄,如果你在GetDC函數(shù)傳遞的是NULL,現(xiàn)在還要傳遞NULL。HDChDC//DC的句柄);編譯運(yùn)行程序,按下按鈕,發(fā)現(xiàn)屏幕的左上角處畫了一條直線。2、按鈕IDC_GETD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論