windows设备上下文的概念

来源:互联网 发布:磁力链接软件 编辑:程序博客网 时间:2024/05/20 08:44
关于设备场景,叫法颇多,有些书上说为设备环境、显示场景,更常见的叫做设备描述表或设备描述体。当然你爱怎么叫随你的便,我还是喜欢说为设备场景。
那 么究竟什么是设备场景呢? 设备场景是一种windows对象,而windows则是一种图形环境,其图形系统令人难以自信地灵活和强大。而实质上,widnows下的所有绘图都是 通过设备场景进行的,而不是直接对窗口和设备本身进行。为了说明设备场景,很多书都拿一些现实生活中的现象来进行对照说明。其中,最常见的是把它比喻为一 位画家在作画。我想大家都看过画家是如何画画的,最起码是在电影里或者是在道旁的广告牌上作画的画家。我们可以想象一下∶有个风景秀丽的白云山(是我瞎起 的名)上,有位画家一只手拿着调色板,另一只手则拿着画笔,面对一个画板正在写风景画。有些书认为画家的调色板相当于设备场景,有些书则认为画板相当于设 备场景,说法不一。鉴于这种情况,我认为还是直接去说明设备场景比较好。

作为windows的对象,设备场景实际上是一种windows内部的数据结构。就象pointapi数据结构具有x和y两个属性一样,设备场景同样具有着它自身的属性,只是属性比较多而已,如下表∶

设备场景属性

属 性 默 认 值
背景色(background color) 白色(white)
背景模式(background mode) 不透明(opaque)
位图(bitmap)无(none)
刷子(brush)白色刷子(white brush)
刷子起点(brush origin) 0,0
剪切区(clipping region) 整个窗口或设备表面(entire window or device surface)
调色板(color palette) 默认调色板(default palette)
画笔位置(pen position) 0,0
绘图模式(drawing mode) r2_copypen
字体(font) 系统字体
字间距(intercharater spacing) 0
影射模式(mapping mode) mm_text
画笔(pen) 黑色(black)
多边形填充模式(mapping mode) alternate
伸缩模式(stretching mode) blackonwhite
文本色(text color) 黑色(black)
视口起点(viewport origin) 0,0
视口范围(viewport extents) 1,1
窗口起点(window origin) 0,0
窗口范围(window extents) 1,1
请你多看看这张表,对设备场景都有哪些属性,脑子里应当有个印象。事实上,设备场景的很多属性对应于vb中 的form、picturebox、text等窗体或控件的属性。比如,字体、背景色、绘图模式等等。可想而知,很多学vb的朋友尽管并不知道什么叫设备 场景,但实质上都不知不觉地使用了设备场景。可以说,设备场景是windows编程中最重要的概念之一。
对于设备场景,有些朋友可能一时不大好理解,这很自然,不用担心谁都是一样。不知对你能否作为一个帮助,我是把设备场景想象成一种配套的(包括画板、调色 板、画笔、刷子等)的绘画工具。其中画板是最重要的,其他的东西都是为这个画板服务的。如过你创建了一个设备场景,就等于是你从百货商店买来了这一套绘画 工具,从而具备了绘画的条件。但,你的房间总不是那么宽敞的。为了继续绘出别的画、继续购买新的绘画工具,无用的工具应当及时清理掉。因为设备场景本身是 占用内存的。不要担心这会降低运行速度,对计算机来说创建一个设备场景,再删掉一个设备场景,那都是瞬息之间的事情,根本谈不上什么浪费时间,绝对不像跑 一趟百货商店那么麻烦、费时。对于绘图,你应当认识的一点是,绘图并不是简单地指绘画,输出文本也是一种绘图过程。尽管如此,api函数中图形函数与文本 函数大体都是各自各的。绘画和写文本都是在同样的设备场景中进行,这一点很重要。
我想,你大概还是没有理解好,不过没有关系,继续往下看好了。本节中请记住一点∶

widnows下的所有绘图都是通过设备场景进行的。


一、设备环境(Device Context)(设备上下文)

    设备上下文DC是一个Windows数据结构,它包含了某个设备的绘制属性。通常,绘制调用都是借助于上下文对象,而这些设备上下文对象封装了用于画线、形状、文本等的Windows API。设备上下文是设备无关的,所以它既可以用于绘制屏幕,也可以用于绘制打印机甚至元文件。设备上下文在内存中创建,而内存经常受到扰动,所以它的地址是不固定的。因此,一个设备上下文句柄不是直接指向设备上下文对象,而是指向另外一个跟踪设备上下文地址的指针。

    我个人认为设备上下文相当于画图过程中的画布(画纸),在VC中,这个画布可以是显示器,也可以使打印机,设备上下文决定了画布的属性,而且封装了在画布上画画的方法,比如画线,画点,等等,例如: pDc->LineTo(512,0); //从左下角到右上角的一条红色直线 。我们在VC中画图时,首先要得到这块画布才可以画画,所以要进行获取设备环境。

     1、常见设备上下文及区别:CClientDC,CPaintDC,CWindowDC

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

CPaintDC:只能在客户区绘制图形。(1)CPaintDC类是CDC类的一个派生类,该类一般用在响应WM_PAINT消息的函数OnPaint()中。(2)WM_PAINT消息是当窗口的某个区域需要重画时激发的窗口消息。当程序中的消息循环接到WM_PAINT消息时就自动调用消息处理函数OnPaint(),如果在OnPaint函数内定义了CPaintDC类的对象,通过这个类对象就可以使用CDC类的成员函数完成视图客户区中的图形绘制操作。(3)CPaintDC用于响应窗口重绘消息(WM_PAINT)时的绘图输出。CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。CPaintDC也只能用在WM_PAINT消息处理之中。

CWindowsDC:(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在窗口的客户区绘制图形。(2)坐标原点是在窗口的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。

下面介绍一下获得这块画布的方法,即获取设备上下文的方法:

1、通过OnDraw()函数获得CPaintDC:在OnDraw()函数中入口参数CDC *pDC,传入这即操作的设备上下文,这个上下文既是CPaintDC。他是通过OnPaint()构建,并传入OnDraw(),View类如果没有重载OnPaint(),则窗口刷新时自动调用MFC底层代码的OnPaint()函数,从而调用OnDraw()。我们就可以通过OnDraw()在客户区进行初始化的绘制。

2、通过CClientDC,CPaintDC,CWindowDC定义一个DC。

例如:CClientDC dc(this);创建一个dc,在当前对象的客户区。创建一个CWindowDC类的对象:CWindowDC dc(this);

3、通过HDC GetDC(HWND hWnd);hWnd:设备上下文环境被检索的窗口的句柄,如果该值为NULL,GetDC则检索整个屏幕的设备上下文环境,返回值是hdc,即一个DC描述符,入口参数是一个窗口类型的句柄。

例如: pWnd=GetDlgItem(IDC_STATIC_PIC); //IDC_STATIC_PIC是对话框图片空间的一个标识号
           pWnd->SetWindowPos(NULL,0,0,512,120,SWP_NOZORDER|SWP_NOMOVE); //调整长宽为(512,120)
           pDc=pWnd->GetDC();

二,GDI及GDI函数

    GDI对象就是绘画时用的工具,比如画笔,画刷,字体,位图,调色板。如果绘图的时候,需要先把相应的GDI设备选入设备环境,就是为画图选个画笔,工具。

注意MFC中,GDI和CDC是两个独立的类


0 0
原创粉丝点击