欢迎使用CSDN-markdown编辑器

MFC中的DC、CDC、HDC、句柄、设备上下文详解

在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

三、手工创建一个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(“Hello MFC”,-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>添加成员函数来处理消息

1、构造CWinApp派生类的对象

2、系统调用WinMain()

3、WinMain调用InitInstance,在该函数中创建CFrameWnd派生类对象调用

Create函数创建窗口、调用ShowWindow函数显示窗口。

4、之后内部机制调用Run接受用户的消息并将消息导向默认的处理函数。

当接收到WM_QUIT消息时Run内部调用ExitInstance,退出程序。

MFC采用消息映射Message Map机制取代C/C++语言中的switch-case结

构来处理消息。 消息映射在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消息处理函数)

特点由用户指定消息处理函数

3、”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++ 2008-02-29 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 设备上下文对象直接绘制到视图

中。

再来一段比较清晰容易理解的。

一、区别与联系

HDC是句柄

CDC是MFC封装的Windows设备相关的一个类

CClientDC是CDC的衍生类产生对应于Windows客户区的对象

HDC是WINDOWS的一种数据类型是设备描述句柄。

而CDC是MFC里的一个类它封装了几乎所有的关于HDC的操作。

也可以这样说HDC定义的变量指向一块内存这块 内存用来描述一个

设备的相关的内容所以也可以认为HDC定义的是一个指针而CDC类

定义一个对象这个对象拥有HDC定义的一个设备描述表同时也包含

与HDC相关的操作的函数。这与HPEN和CPenPOINT与CPoint之间的

差别是一样的。

二、获得CDC *

CDC* pDC

pDC=GetDC();//原型CDC* CWnd::GetDC()

三、获得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)

四、转换(?未确定用法的正确性) 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/6665086720081291028136

0/ CDC、HDC、pDC (zz) MFC 2009-12-02 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有一个operator HDC() 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的区别和联系是什么 图片处理代码 2010-02-21 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的区别与转换 程序设计 2009-07-28 21:46:10 阅读46 评论0 字号大中小 订阅

源自: http://www.thatsky.cn/article.asp?id=81

一、区别与联系

HDC是句柄CDC是MFC封装的Windows 设备相关的一个类CClientDC是CDC的衍生类产生对

应于Windows客户区的对象

HDC是WINDOWS的一种数据类型是设备描述句柄。

而CDC是MFC里的一个类它封装了几乎所有的关于HDC的操作。

也可以这样说HDC定义的变量指向一块内存这块 内存用来描述一个设备的相关的内容所以也可

以 认为HDC定义的是一个指针而CDC类定义一个对象 这个对象拥有HDC定义的一个设备描述

表同时也包 含与HDC相关的操作的函数。

这与HPEN和CPenPOINT与CPoint之间的差别是一样的。

二、获得CDC *

CDC* pDC

pDC=GetDC();

三、获得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)

四、转换

CDC* pDC

HDC hDC; pDC=Attach(hDC);

hDC=GetSafeHDC(pDC);

pDC->m_hDC==hDC

设备描述表 设备描述表 DCDevice Context设备描述表 设备描述表是一个定义一组图形对象及其属性、影响输出的图形方式(数据)结构。

windows提供设备描述表用于应用程序和物理设备之间进行交互从而提供了应用

程序设计的平台无关性。设备描述表又称为设备上下文或者设备环境。

设备描述表是一种数据结构它包括了一个设备如显示器和打印机的绘制属

性相关的信息。所有的绘制操作通过设备描述表进行。设备描述表与大多 WIN32结

构不同应用程序不能直接访问设备描述表只能由各种相关API函数通过设备描述

表的句柄间接访问该结构。

设备描述表总是与某种系统硬件设备相关。比如屏幕设备描述表与显示设备相

关打印机设备描述表与打印设备相关等等。

屏幕设备描述表一般我们简单地称其为设备描述表。它与显示设备具有一定的

对应关系在windows GDI界面下它总是相关与某个窗口或这窗口上的某个显示区

域。通常意义上窗口的设备描述表一般指的是窗口的客户区不包括标题栏、菜单

栏所占有的区域而对于整个窗口来说其设备描述表严格意义上来讲应该称为窗口

设备描述表它包含窗口的全部显示区域。二者的操作方法完全一致所不同的仅仅

是可操作的范围不同而已。

windows 窗口一旦创建它就自动地产生了与之相对应的设备描述表数据结构

用户可运用该结构实现对窗口显示区域的GDI操作如划线、写文本、绘制位图、

填充等并且所有这些操作均要通过设备描述表句柄了进行。 如何理解设备描述表 开发 2008-11-27 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函数获取和改变设备描述表中的属性值。

如何使用设备描述表 2007-02-22 19:46:18 www.hackbase.com 来源互联网

本文示例源代码下载

Windows 程序在屏幕、打印机或其它设备上画图时它并不是将像素直接输出到设备上而是将图绘

制到由设备描述表表示的

本文示例源代码下载

Windows 程序在屏幕、打印机或其它设备上画图时它并不是将像素直接输出到设备上而是将图绘

制到由设备描述表表示的逻辑意义上的”显示平面”上去。设备描述表DC是Windows中的一种数据结

构它包含GDI需要的所有关于显示界面情况的描述字段包括相连的物理设备和各种各样的状态信息。

在Windows画图之前Windows程序从GDI获取设备描述表句柄HDC,并在每次调用完GDI输出函

数后将句柄返回给GDI。本文将对如何获得和释放 HDC以及 CDC及其派生类的使用方法进行演示说明。

下载示例工程 DCDemo 具体说明

1、按钮 IDC_GETDC_APINULL的函数

void CDCDemoDlg::OnGetdcApinull()

{

HDC hDC=::GetDC(NULL);

::MoveToEx(hDC,0,0,NULL);

LineTo(hDC,200,20);

::ReleaseDC(NULL,hDC);

} 该段代码具体演示了如何使用API 函数GetDC(NULL),取得屏幕的HDC.并进行画图。 HDC

GetDC(HWND hWnd); //功能取得hWnd窗口的设备描述表句柄。当hWnd参数为NULL时取得整个

屏幕的设备描述表句柄。 MoveToEx和LineTo演示在DC上画一条直线记住最后调用ReleaseDC释放

HDC资源。int ReleaseDC (

HWND hWnd,//你要控制的那个窗口的句柄如果你在GetDC函数传递的是NULL现在还要传递NULL。

HDC hDC //DC的句柄

);编译运行程序按下按钮发现屏幕的左上角处画了一条直线。

2、按钮 IDC_GETDC_API的函数

void CDCDemoDlg::OnGetdcApi()

{ HDC hDC=::GetDC(m_hWnd);

::MoveToEx(hDC,0,0,NULL);

LineTo(hDC,200,50);

::ReleaseDC(m_hWnd,hDC);

} 这段代码与前一段代码唯一的区别是GetDC的参数不再是NULL而改为CWnd的成员变量

m_hWnd即对话框窗口的句柄。对比两段代码运行结果深入体会API函数 GetDC。

3、按钮IDC_GETDC_CWND的函数

void CDCDemoDlg::OnGetdcCwnd()

{

CDC *pDC=GetDC();

pDC->MoveTo(0,0);

pDC->LineTo(200,100);

ReleaseDC(pDC);

} 该段代码演示使用MFC CWnd类的 GetDC函数和ReleaseDC的方法,使用该方法在程序窗口中画

图非常方便。为了避免获取和释放设备描述表所带来的麻烦MFC提供了一些CDC派生类如

CPaintDC,CClientDC,CWindowDC,这些类被设计为可直接进行实例化。各个类的构造函数和析构函数调

用相应的函数捕获和释放设备描述表从而使得更加方便简捷。

4、按钮IDC_CCLIENTDC的函数

http://www.hackbase.com/lib/2007-02-22/13807.html windows 程序设计中的 设备描述表

2009-08-26 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。

要使用设备描述表一般有如下步骤

获取或者创建设备描述表

必要的话改变设备描述表的属性

使用设备描述表完成绘制操作

释放或删除设备描述表。

Common设备描述表通过::GetDC::GetDCEx::BeginPaint来获得一个设备描

述表用毕用::ReleaseDC或::EndPaint释放设备描述表

Printer设备描述表通过::CreateDC创建设备描述表用::DeleteDC删除设备

描述表。

Memory设备描述表通过::CreateCompatibleDC创建设备描述表用::DeleteDC删除。

Information设备描述表通过::CreateIC创建设备描述表用::DeleteDC删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值