一起学MFC(三)GDI编程技术之一

  Windows中负责图形输出的是Graphics Device Interface(图形设备接口),或 称GDI.它是一个通用而强大的图形接口,Windows中有大部分的图形绘制工作都是由GDI来完成的。

  在Windows中,每个应用程序的窗口的结果大部分以窗口的形式展显。因此,程序A的输出与程序B的输出是相隔离的。这意味着各程序的输出必须限制在自己的窗口中。GDI使用一简单的机制保证在窗口中画图的各程序遵循这些规则。这种机制即为设备描述表(DC)。

   设备描述表表示的是一种逻辑意义上的“显示平面”,它是Window中的一种数据结构,它包含GDI需要的所有关于显示平面情况的描述字段,包括相连的物理设备和各种各样的状态信息。

   在平面上画图之前,Windows程序从GDI获取设备描述表句柄,并在每次调用GDI输出函数时将句柄返回给GDI。

   设备描述表在使GDI摆脱设备限制的过程中发挥了重要的作用。获得设备描述表句柄后,同一GDI函数可用来向多种输出设备上画图。

  

    获取设备描述表的方法,一种方法是调用CWnd::GetDC,它返回指向表示Windows设备描述表的CDC对象的指针。在画图完毕时,用CWnd::ReleaseDC释放由CWnd::GetDC获取的设备描述表指针。

    用代码表示如下

   

   

    在处理WM_PAINT消息的OnPaint函数时,需要用CWnd::BeginPaint和CWnd::EndPaint来处理。注意这是必须的哦。

   用代码表示如下

  

    

    当在处理WM_PAINT消息时,CWnd::BeginPaint与CWnd::EndPaint函数调用失败,将造成WM_PAINT不会从消息队列中删除。应用程序将一遍一遍的处理同一个WM_PAINT消息而陷入死循环。

 

    为了避免上面获取与释放设备描述表时需调用相应函数,因此,MFC对上面的过程进行了封装。按用途的不同,对CDC类进行了派生。

   

    由CDC派生的类如下

    CPaintDC                  用于在窗口客户区画图(仅限于OnPaint处理程序)

    CClientDC                 用于在窗口客户区画图(除OnPaint外的任何处理程序)

    CWindowDC             用于在窗口内任意地方画图,包括非客户区

    CMetaFileDC            用于向GDI元文件画图

 

     类CPaintDC

     专门来处理WM_PAINT消息的绘图动作,可以通过下面的方法来创建, 一种是在栈中创建

    

     这种方法好处是,当对象的生命周期结束,则它的析构函数会被自动调用。

     另一种方法是在堆中创建

    

     这种方法的好处是,很灵活。 但要记住调用delete删除对象。

 

     类CClientDC

     用于处理那些非OnPaint的绘图工作。它可以在不等待WM_PAINT消息时,在用户的客户区区域进行绘图工作。

 

     类CWindowDC

    用于处理在窗口客户区的地方进行绘图工作。一般情况下CWindowDC并不常用。如果想在窗口非客户区作图,你可以借助OnNcPaint处理程序捕获WM_NCPAINT消息,确定非客户区需要绘制的时间。

    一个有兴趣的调用,如下
   

 

 

    在用CDC绘图时,我们可以改变设备描述表属性,来绘制不同的效果的图形。比如我们可以在调用CDC::DrawText时,指定字符颜色与字体。

    设备描述表的主要属性如下:

    

    

 

  上表中,Default是设备描述表的缺省值。  

   最常用来定义设备描述表属性的CDC函数是SelectObject. 它可以选入的对象主要有6个对象,分别是Pen,Brush,Font,Bitmap,Palette,Region

   每当从Windows中获取设备描述表时,设备描述表都被设置为默认值。如果需要改变可以通过上表中相应函数改变。

 

   GDI将像素输出到逻辑显示平面上时,它不只是简单地输出像素点颜色。相反,它通过一系统的布尔运算将输出像素点的颜色与输出目标位置上像素点颜色合成在一起。它所使用的逻辑关系由设备描述表当前的绘图模式确定。使用CDC::SetROP2可以更改绘图模式。默认绘图模式为R2_COPYPEN,它将像素点复制到显示平面上。

   下面是GDI绘图模式

   

 

 

 

   对Window编程新手来说,GDI中最困难的部分就是映射模式了。

   映射模式是设备描述表的属性,用于确定从逻辑坐标值到设备坐标值的转换方式。传送给CDC输出函数的是逻辑坐标值。设备坐标值是指窗口中的相应像素点的位置。

   例如   dc.Rectangle(0,0,200,100);

   调用Rectangle函数时,它告诉GDI要绘制一个200个逻辑单位宽,100个逻辑单位高的矩形。在默认映射模式下MM_TEXT下,一个逻辑单位相当于一个像素的设备单位。因此,正好是200个像素宽,100个像素高的矩形。当在MM_LOENGLISH映射模式下,一个逻辑单位相当于1英寸的百分之一。因此在这种模式下200单位宽,100单位长的矩形,得到一个2英寸宽,1英寸长的矩形。这可以实现比例缩放的输出。

   映射模式如下

  

 

   MM_TEXT为默认的映射模式,如果要使用其它的映射模式,可以调用CDC::SetMapMode来改变默认的映射模式。

   在进行绘图时,可以使用CDC::LPtoDP将逻辑坐标值转换为设备坐标值,反之,调用CDC::DPtoLP函数可以将设备坐标值转换为逻辑坐标值。

 

   最后,谈谈“用户坐标值”与“屏幕坐标值”。用户坐标值是原点设立在窗口客户区左上角的设备坐标值。屏幕坐标值是原点位于屏幕左上角的设备坐标值。可以调用CWnd::ClientToScreen与CWnd::ScreenToClient函数可实现用户坐标值与屏幕坐标值之间的转换。

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值