关于设备上下文DC和GDI的理解

一、设备环境(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是两个独立的类

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDI(Graphics Device Interface)是Windows图形设备接口,是用于管理Windows图形设备的API集合。它包括了一系列的函数和数据结构,用于图形的绘制、显示和打印等操作。 在Windows编程中,可以使用GDI来创建和操作图形设备对象,如窗口、位图、画笔、刷子、字体等。GDI主要包含以下内容: 1. 设备上下文(Device Context,DC):表示一个输出设备上下文环境,包含了设备的属性和当前的绘画状态。 2. GDI对象:表示对图形设备进行操作的对象,包括画笔(Pen)、刷子(Brush)、字体(Font)等。 3. 绘图函数:包括绘图、填充、显示等函数,用于在设备上绘制和显示图形。 创建GDI设备可以通过以下步骤: 1. 获取设备上下文DC):通过调用Windows API函数GetDC获取一个输出设备上下文环境。 2. 创建GDI对象:通过调用相应的GDI函数创建所需的GDI对象,如画笔、刷子、字体等。 3. 使用绘图函数:通过调用相应的绘图函数,在设备上绘制和显示图形。 使用GDI设备可以通过以下步骤: 1. 获取设备上下文DC):通过调用Windows API函数GetDC获取一个输出设备上下文环境。 2. 创建GDI对象:通过调用相应的GDI函数创建所需的GDI对象,如画笔、刷子、字体等。 3. 使用绘图函数:通过调用相应的绘图函数,在设备上绘制和显示图形。 4. 释放设备上下文:使用完毕后,通过调用Windows API函数ReleaseDC释放设备上下文。 总之,GDI是一个强大的图形设备接口,可以用来创建和操作各种图形设备对象,实现各种图形绘制和显示操作,并且可以在Windows编程中广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值