VC学习笔记——图形、文本输出

     Windows图形设备接口GDIGraphic Device Interface)提供了在Windows先绘图的基本功能。所有的绘制操作都是通过DC(设备描述表)进行的。设备描述表(device context),是对各种不同设备的抽象,应用程序只要向DC输出,由DC负责处理不同设备的差异。

1GDI绘图的实现

     图形设备接口(GDI)和设备驱动程序实现了设备无关性的图形的显示,而设备描述表则是用来确定GDI输出的位置和形象的属性。

    GDI可以看做是一个用用程序与输出设备之间的中介,一方面GDI向引用程序提供一个设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。

    应用程序运行时,必须通知GDI装入一定设备的驱动驱动程序,而后准备各种输出操作。这是通过创建和维护一个设备描述表来实现的。

     设备描述表是一种Windows数据结构,它包括了与一个设备的绘制属性相关的信息。所有的绘制操作通过一个设备上下文对象进行,该对象封装了实现绘制线条、形状和文本的Windows API函数。

2MFC图形对象类

    Windows提供了多种用于在设备描述表中进行绘制的图形对象、如画笔、位图、调色板、取悦和路径等。MFC对这些图形对象进行了封装,提供了等同于他们的图形对象类。

l        画笔对象,Cpen类,在画点和画线时有用。属性包括颜色、宽度和线的风格。

l        画刷,Cbrush类,画刷对象决定填充区域时所采用的颜色或模板。

l        字体,Cfont类,用于输出文字时选用不同等个和大小的字体。

l        位图,Cbitmap类,该对象可以包含一幅图像,保存在资源中

l        调色板,Cpalette类,一种颜色映射接口。

l        区域,CRng类,区域对象可以限制作图区域或改变窗口外形。

3、图形对象的操作步骤

1  定义一个图形对象,并用对应的Create××()方法初始化对象。例如,若要创建CPen对象,使用CreatePen()方法。

2  一般使用CDC::SelectObject()方法,选定新对象,该方法返回一个指针,指向被替换掉的原绘画对象,该返回对象要进行保存。

3  完成绘画后,再次使用CDC::SelectObject()方法,将上一步保存的原来的绘画对象恢复,使所有一切恢复原样。

注意:声明为指针并用new操作符进行分配的图形对象必须被显示删除[delete()方法]

4、设备描述类CDC

     MFC中,CDC类封装了设备描述表(DC),该类的核心是m_hDC,代表一个纸箱窗口DC的句柄。几个常用的CDC类的派生类:CpaintDCCclientDCCwindowDC

    CDC类派生自Cobject类,它既包括了设备属性又包括了绘图方法,通过此方法乐意实现GDI的所有图形输出。

l        CclientDC,代表客户窗口区的设备环境,绘图点(0,0),位于客户区的左上角。可在任何需要的时候随意创建一个CclientDc对象,其析构函数将自动调用ReleaseDC()自动释放设备描述表。

l        CwindowDC,代表整个窗口区(包括客户区和非客户区)设备环境,绘图点(0,0)在整个窗口的左上角。其也是可在任意地方创建,自动释放设备描述表。

l        CpaintDC,代表客户区的无效区域(需要重画的区域),如被对话框遮挡的部分,用于WM_PAINT消息的处理程序OnPaint()中,实现诸如窗口重绘之类重画图形的工作。

5、代码演示CclientDCCWindowDC的使用

1)创建工程

创建一个基于单文档的MFC应用程序

2)编辑菜单

   添加“图形绘制”下拉菜单项,其下包含两个菜单项“CclientDC”和“CwindowDC”。分别在视图类和主框架类中添加COMMAND消息响应函数OnClientdc()和OnWindowsdc()

3)添加代码,完善功能

   代码如下:

void CSDIDemoView::OnClient()

{

     // TODO: Add your command handler code here

     CClientDC dc(this);               //创建CClientDC类对象

     CPen pen1;                              //自定义画笔对象

     pen1.CreatePen(PS_SOLID,0,RGB(255,0,0));  //创建对象

     CPen *poldPen=dc.SelectObject(&pen1); 

 //选择新画笔,返回并保存原值

     dc.SelectStockObject(GRAY_BRUSH);  //选择库存灰色画刷

     CRect rect1(0,0,120,90);              //定义矩形

     dc.Rectangle(&rect1);                 //画出矩形

}

void CMainFrame::OnWindowsdc()

{

     // TODO: Add your command handler code here

     CWindowDC  dc(this);          //创建CWindowDC类对象

     CPen pen1;                    //自定义画笔

pen1.CreatePen(PS_SOLID,0,RGB(255,0,0));      

 //调用CreatPen函数设置画笔属性

     CPen *poldPen=dc.SelectObject(&pen1);            

  //将原画笔绑定到dc,并赋给一个画笔指针

     dc.SelectStockObject(GRAY_BRUSH);  //选择库存灰色画刷

     CRect rect1(0,0,120,90);        //创建矩形对象,并初始化

     dc.Rectangle(&rect1);           //画出矩形

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值