MFC设备描述表的总结

/*****************************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);

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值