/*****************************Windows程序设计********************************************/ 设备描述表是一个定义一组图形对象及其属性、影响输出的图形方式(数据)结构。windows提供设备描述表,用于应用程序和物理设备之间进行交互,从而提供了应用程序设计的平台无关性。设备描述表又称为设备上下文,或者设备环境。 设备描述表是一种数据结构,它包括了一个设备(如显示器和打印机)的绘制属性相关的信息。所有的绘制操作通过设备描述表进行。设备描述表与大多WIN32结构不同,应用程序不能直接访问设备描述表,只能由各种相关API函数通过设备描述表的句柄间接访问该结构。 设备描述表总是与某种系统硬件设备相关。比如屏幕设备描述表与显示设备相关,打印机设备描述表与打印设备相关等等。 屏幕设备描述表,一般我们简单地称其为设备描述表。它与显示设备具有一定的对应关系,在windows GDI界面下,它总是相关与某个窗口或这窗口上的某个显示区域。通常意义上窗口的设备描述表,一般指的是窗口的客户区,不包括标题栏、菜单栏所占有的区域,而对于整个窗口来说,其设备描述表严格意义上来讲应该称为窗口设备描述表,它包含窗口的全部显示区域。二者的操作方法完全一致,所不同的仅仅是可操作的范围不同而已。 windows 窗口一旦创建,它就自动地产生了与之相对应的设备描述表数据结构,用户可运用该结构,实现对窗口显示区域的GDI操作,如划线、写文本、绘制位图、填充等,并且所有这些操作均要通过设备描述表句柄了进行。 /***************************************************************************************/ 书中是这么说的,但是如何理解啊? 如果将设备描述表理解成为设备的一种抽象地描述(或者说是硬件在数据结构上一种映射),那么显示设备描述表对应显示器,在编写程序的时候现在假设以GetDC获得设备描述标的句柄。 hdc = GetDC(hwnd);//获得窗口设备描述表句柄 [使用GDI函数] ReleaseDC(hwnd, hdc); 我想知道这个过程和显存的关系。也就是如何通过显存绘制到显示器对应的窗口上的。 再确切地说就是GDI绘制既然针对的是设备描述表,那么设备描述表是否在内存中? 他和显存之间的关系是什么? |
通过设备描述表调用显示卡驱动,由显示卡驱动程序访问显存实现绘图输出,因此在GDI下面是无法直接访问到显存的。这种方式主要是提供了统一的编程界面,使得编程人员不用考虑具体的设备的特性,一切和设备打交道的工作交由系统完成,编程者只要调用统一的GDI函数即可。设备描述表在内存中是存在的。
今天总结一下设备描述表.
1.设备描述表
设备描述表是一个包含设备信息的结构体,(物理设备如显示器,打印机),MFC中关于图形操作都需要DC来完成.
2获取DC 有两种方式:
(1)在WM_PAINT消息时,使用BeginPaint EndPaint;
eg: HDC hdc;
PAINTSTRUCT ps;(用来接收绘制的信息)
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,0,0,"hello",strlen("hello"));
EndPaint(hwnd,&ps);
2.HDC hdc;
hdc=GetDc(hwnd);
TextOut(hdc,0,0,"hello",strlen("hello"));
ReleaseDC(hwnd,hdc);
在其他的场合,都是使用第二种方法来调用DC.
具有特殊类型的DC
CPaintDC | 用于在窗口客户区绘图(仅限于OnPaint处理程序) |
CClientDC | 用于在窗口客户区绘图(除OnPaint外的任何处理程序) CClientDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(m_ptEnd); |
CWindowDC | 用于在整个窗口.下面是以桌面为例,应该明确桌面也是一个窗口. CWindowDC dc(GetDesktopWindow()); dc.MoveTo(m_ptOrigin); dc.LineTo(m_ptEnd);
|
CMetaFileDC | 用于向GDI元文件绘图 |
CMetaFileDC dc(this);
dc.TextOut("hello");
这个就保存在元文件中,等待事件然后播放元文件.(如窗口重绘)
3设备描述表相关的工具有:bitmap,font,brush,palette,pen
使用原则:首先创建一个特定的对象,然后将其选入设备描述表中,接下来就一一介绍如何使用.
CClientDC dc(this);
CPen pen(类型,线宽,颜色);(定义一个画笔)
CBrush brush(颜色);(定义一个画刷,主要是填充作用)
CBitmap bitmap;(定义一个位图)
bitmap.LoadBitmap(IDB_BITMAP1);
CFont font;(定义一种字体)
font.CreatePointFont(大小,字体名称,NULL);(NULL 表示使用屏幕设备描述表来完成这中转换)
将他们都选入设备描述表中,并且保存以前的.运用SelectObject()函数,可以将其选入设备描述表,并且返回先前被选对象的指针.
CPen *poldpen=dc.SelectObject(&pen);
使用过程
dc.SelectObject(poldpen);(使用结束后,将其恢复到原来的状态)
CBrush *poldbursh=dc.SelectObject(&bursh);
dc.FillRect(CRect(100,100,200,200),&brush);
dc.SelectObject(poldbrush);