您好,欢迎来到福步贸易网!
关注我们
service@fubuwang.com
全部产品分类
在MFC编程中有个概念叫“设备上下文”,究竟什么才算是设备上下文呢?
   https://www.fubuwang.com 2023-06-29 02:13:28 来源:网络
核心提示:直接读成DC就行了。只不过是一个名字罢了。设备上下文,是指,第一个设备的上下文含义是不一样的,虽然都是叫DC,但不同设备的DC,他的作用是不同的。Vc中关于DC(设备环境函数(Device Context))的理解问:设备描述表DC是一个什

直接读成DC就行了。

只不过是一个名字罢了。

设备上下文,是指,第一个设备的上下文含义是不一样的,

虽然都是叫DC,但不同设备的DC,他的作用是不同的。

Vc中关于DC(设备环境函数(Device Context))的理解

问:设备描述表DC是一个什么概念,谁通俗的说说,先谢了

学习Vc,首先遇到的就是这个dc,即设置描述表,输出文字,绘图都要用这个,好象它太重要了。但是我就是不明白,这是什么东西。

一些教程看了,但还是不太了解,谁能通俗的说说,能快速理解它,谢谢。

答:1、作画之前需要准备好画布、画笔、调色板等。

当使用GDI函数如MoveToEx/LineTo, TextOut时,只是告诉系统要划线或写字了,但用什么样的笔(HPEN),字是什么颜色(SetTextColor),画在哪张“纸”(HBITMAP)上需要从一个由系统定义的数据结构中去读取。

这个数据结构被称为Device Context(DC)。

换句话说,GDI函数只是绘画的动作,而DC则保存了绘画所需的材料和工具。

2、设备环境函数(Device Context)

设备环境是一个结构,它定义了一系列图形对象及其相关的属性,以及会影响输出结果的绘图方式。这些图形对象包括:画笔(用于画直线),笔刷(用于绘图和填充),位图(用于屏幕的拷贝或滚动),调色板(用于定义可用的颜色集),剪裁区(用于剪裁和其他操作),路径(用于绘图和画图操作)。设备环境函数用于对设备环境进行创建、删除或获取信息。

问:DC,CDC,HDC,CClientDC....有什么本质的区别?

答:都是DC嘛,HDC就是最原始的 DC 句柄,很多API的第一个参数就是一个HDC类型,比如

HDC hDC = ::GetDC( m_hWnd)

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

::LineTo( hDC, 0, 100, )

::ReleaseDC( m_hWnd, hDC )

在MFC中,为了将API封装成一个类来操作,因此多出来了一个CDC。所以在MFC中,都是

CDC dc = GetDC()

dc.MoveTo( 0, 0 )

dc.LineTo( 0, 100 )

this->ReleaseDC( &dc )

但这样还不够,因为 CDC还要你自己去释放,所有MFC中又多出来一个CClientDC, 这样你就可以这样了:

CClientDC dc(this)

dc.MoveTo( 0, 0 )

dc.LineTo( 0, 100 )

CClientDC的析构函数自己会释放自己。

DC不是什么对象,就是设备上下文的简称。

与CClientDC一样,还有CWindowDC,CPaintDC,只是它们的绘制范围不一样。

但弄到底,都只是HDC的一些封装而已,你可以在CDC类中直接引用 m_hDC,这就是那个原始的HDC句柄了。

CDC是MFC的DC的一个类

HDC是DC的句柄,API中的一个类似指针的数据类型.

MFC类的前缀都是C开头的

H开头的大多数是句柄

这是为了助记,是编程读写代码的好的习惯.

CDC中所有MFC的DC的基类.常用的CClientDC dc(this)就是CDC的子类(或称派生类).

CDC等设备上下分类,都含有一个类的成员变量:m_nHdc即HDC类型的句柄.

记住下面的一句话,会有助于你的理解.

MFC的类,是在用window API语句开发出来的有一定功能的小程序.(也可称为类).使用它的默认方法,就是,记住它的名字与参数(可以用笔记,代替脑记).

如果将window api比做汇编语言

那么MFC就相当于Basic语言.

下面介绍Vc中最重要的部分--MFC

CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CframeWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc一个例外是菜单(CMenu)不是从窗口派生的。该类很大,一开始也不必学,知道就行了。

Cdocument文档,负责内存数据与磁盘的交互。最重要的是onOpendocument(读入),OnSavedocument(写盘),Serialize(读写)

CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是onDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。

CDC设备文本。无论是显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。

CDialog对话框

CWinApp应用程序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。

CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选进DC。

CPen笔,画线

CBrush刷子,填充

CFont字体,控制文字输出的字体

CBitmap位图

CPalette调色板

CRgn区域,指定一块区域可以用于做特殊处理。

CFile文件。最重要的不外是Open(打开),Read(读入),Write(写)

CString字符串。封装了C中的字符数组,非常实用。

CPoint点,就是(x, y)对

CRect矩形,就是(left, top, right, bottom)

CSize大小,就是(cx, cy)对(宽、高)

Windows使用与设备无关的图形设备环境(DC: Device Context) 进行显示。MFC基础类库定义了设备环境对象类----CDC类。

CDC与CGdiObject的关系

说到CDC类就不能不提一下GdiObject---图形对象类。 在Windows应用程序中,设备环境与图形对象共同工作,协同完成绘图显示工作。就像画家绘画一样,设备环境好比是画家的画布,图形对象好比是画家的画笔。用画笔在画布上绘画,不同的画笔将画出不同的画来。选择合适的图形对象和绘图对象,才能按照要求完成绘图任务。

有关CDC类的继承

父类:从 CObject 直接继承而来。继承了CObject类的各种特性,如动态创建等等。

子类:CClientDC-------代表操作窗口的DC ,是比较常用的一个子类

CmetaFileDC ------响应meta File的DC ,meta File是一些GDI消息。

CPaintDC-------响应WM_PAINT消息的DC。

CWindowDC ------代表整个屏幕的DC

CDC类的数据成员

数据成员只有两个:

HDC m_hDC : CDC对象使用的输出设备上下文

HDC m_hAttribDC : CDC对象使用的属性设备上下文

二者在CDC对象创建时指向相同的设备上下文。

问:VC 解释一下CDC *pDC=pWnd->GetDC()

答:绘图用到的所有有关的类与函数都被集合到一起,被称之为设备上下文,或设备环境。你可以将这个类集看成一个超级的大类。GetDC()是一个函数,它能获得DC的使用权,也就是说它将句柄(或指针)交给了你,也就是说它将使用它的钥匙交给了你。你可以使用它的所有函数了。不用再向API函数那样,每一个绘图动作都要使用一个函数,如果你不想改变它的默认值,可以直接绘图,当然,他提供了比API更加强大的函数与更加多的功能。当然,对初学者,最方便的是,不用记大量的函数了,当你用它实例化一个对象后(也称得到设备上下文(DC)),你只要用->或.就可以在VC提示的帮助下来选择相应的函数了。

CDC *pDC=pWnd->GetDC()

1.用CDC(MFC的设备上下文)实例化一个对象的指针

2.为这个对象的指针赋值为pWnd

3.pWnd被赋值为GetDC.相当于用API的DC实例化一个对象的指针pWnd

小结:用MFC的设备上下文实列化一个指针的对象,这个指针对象的值来源于API的设备上下文实例化。

==============

实际上,MFC的大多数调用的函数,最终调用的都是API里的相应的函数

问:VC++中绘图 用到的this->GetDC()函数是什么作用?还有 this->ReleaseDC(pDC)

答:1、this指针是当前类的对象的指针.它指向类实例化后的对象.它是隐含的指针.每个对象都有一个,使用它方便呀,不用自已再定义指针了.

--------------------------------------

2、this->GetDC()得到DC,

相当于

CDC *pDC

pDC->GetDC()

也相当于

CDC dc

dc.GetDC()

-----------------------------------

3、this->ReleaseDC()是释放DC

------------------------------------

4、DC的常被称为设备上下文,或设备环境.它是一个超大的类或函数的集合.它集合了,所有的绘图,打印,等相关的类及函数.你只要声明了它的对象或指针,你就得到了它的所有类及函数的使用权.象画笔,画刷,位图,绘图函数....等等全部的功能.你只要用/dc./this->/pDC->等方式就可以直接调用它的函数了.

CClientDC

类CClientDC派生于CDC,在构造时调用了Windows函数GetDC,在析构时调用了ReleaseDC。这意味着和CClientDC对象相关的设备上下文是窗口的客户区。

几种DC及区别

CClientDC:(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC:

用法是:CClientDC dc(this)//this一般指向本窗口或当前活动视图dc.TextOut(10,10,str,str.GetLength())//利用dc输出文本,如果是在CScrollView中使用,还要注意调用onPrepareDC(&dc)调整设备上下文的坐标。CPaintDC用于响应窗口重绘消息(WM_PAINT)时的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。

Detach()}CWindowDC:关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送

CWindowDC与CClientDC,CPaintDC的区别:CWindowDC可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。CWindowDC下坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。CClientDC与CPaintDC的区别:

CPaintDC的对象一般用在OnPaint内以响应Windows消息WM_PAINT,自动完成绘制,在整个窗口内进行重画,维持原有窗口完整性。CClientDC应用在非响应Windows消息WM_PAINT的情况下,进行实时绘制,绘制的区域内被重画。

CDC与CGdiObject的关系

说到CDC类就不能不提一下GdiObject---图形对象类。 在Windows应用程序中,设备环境与图形对象共同工作,协同完成绘图显示工作。就像画家绘画一样,设备环境好比是画家的画布,图形对象好比是画家的画笔。用画笔在画布上绘画,不同的画笔将画出不同的画来。选择合适的图形对象和绘图对象,才能按照要求完成绘图任务。

有关CDC类的继承

父类:从 CObject 直接继承而来。继承了CObject类的各种特性,如动态创建等等。

子类:CClientDC-------代表操作窗口的DC ,是比较常用的一个子类

CmetaFileDC ------响应meta File的DC ,meta File是一些GDI消息。

CPaintDC-------响应WM_PAINT消息的DC。

CWindowDC ------代表整个屏幕的DC

CDC类的数据成员

数据成员只有两个:

HDC m_hDC : CDC对象使用的输出设备上下文。

HDC m_hAttribDC : CDC对象使用的属性设备上下文。

二者在CDC对象创建时指向相同的设备上下文。

所需头文件:#include <afxwin.h>

VC++中,什么叫内存设备上下文

DC:

Device

Context,中文也叫设备上下文,通俗的理解叫窗口显示描述设备也行;

CDC:

MFC中封装了操作系统窗口输出底层API的封装类,如CDC的派生类CClientDC,用于窗口客户区域的输出。

HDC:

VC++开发环境中的DC句柄类型,32比特的无符号整数类型,用来标识DC设备的句柄。

设备上下文:看上面解释的第一行。

“HDC hdc”中“HDC”是什么意思?

“设备上下文”是The Device Context的翻译。

设备上下文是一种包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构。所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条、形状和文本的 Windows API。设备上下文允许在 Windows 中进行与设备无关的绘制。设备上下文可用于绘制到屏幕、打印机或者图元文件。

关于设备上下文,叫法颇多,有些书上说为设备环境、显示场景,更常见的叫做设备描述表或设备描述体。当然你爱怎么叫随你的便,我还是喜欢说为设备场景。

那么究竟什么是设备场景呢? 设备场景是一种windows对象,而windows则是一种图形环境,其图形系统令人难以自信地灵活和强大。而实质上,widnows下的所有绘图都是通过设备场景进行的,而不是直接对窗口和设备本身进行。为了说明设备场景,很多书都拿一些现实生活中的现象来进行对照说明。其中,最常见的是把它比喻为一位画家在作画。我想大家都看过画家是如何画画的,最起码是在电影里或者是在道旁的广告牌上作画的画家。我们可以想象一下∶有个风景秀丽的白云山(是我瞎起的名)上,有位画家一只手拿着调色板,另一只手则拿着画笔,面对一个画板正在写风景画。有些书认为画家的调色板相当于设备场景,有些书则认为画板相当于设备场景,说法不一。

这个别人的回答,很完整,很全面

hDC是设备场景句柄。

hDC与绘图API(GDI函数)有关,hDC是把窗口绘制在屏幕上用的。有了hWnd,可以使用APIGetDC()函数得到与其相关的hDC:hDC=GetDC(hWnd)

HDC设备上下文是一种包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构。所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条、形状和文本的 Windows API。

以上就是关于在MFC编程中有个概念叫“设备上下文”,究竟什么才算是设备上下文呢? 请高手帮忙,谢谢了全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

 
举报收藏 0打赏 0评论 0

免责声明:
1.本站部份内容系网友自发上传与公开信息收集转载,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。版权归属原平台(作者)所有,版权争议与本站无关;
2.秉承互联网开放、包容的精神,福步网欢迎各方(自)媒体、机构转载、引用我们原创内容,但要严格注明来源:福步网;
3.我们倡导尊重与保护知识产权,如发现本站文章存在版权问题,烦请将版权疑问、授权证明、版权证明、联系方式等,发邮件至service@fubuwang.com,我们将第一时间核实、处理,谢谢。

 
福步贸易网  |  公司简介  |  意见建议  |  法律申明  |  隐私政策  |  广告投放  |  如何免费信息发布?  |  如何开通福步贸易网VIP?  |  VIP会员能享受到什么服务?  |  怎样让客户第一时间找到您的商铺?  |  如何推荐产品到自己商铺的首页?  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  粤ICP备15082249号 |  m.fubuwang.com