第二章 MFC 绘图基础

更新时间:2024-01-01 11:24:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

本章学习目标

?

???

??

MFC上机操作步骤MFC绘图方法

CDC类的主要绘图成员函数设备上下文的调用和释放双缓冲机制

MFC绘制图形的几种方法

本章内容

2.1 MFC上机操作步骤

2.2 MFC2.3 2.4 2.5 MFC2.6 绘图方法

设备上下文的调用与释放

双缓冲机制绘图的几种方法

本章小结

2.1 MFC上机操作步骤

微软基类库MFC(microsoft foundation class

library,MFC)是以C++形式封装的Windows API(Application Program Interface),包含了200多个已经定义好的常用基类。在程序设计过程中,一般是通过MFC调用基类的成员函数来完成设计任务的。

6. 在应用程序框架的ClassView标签页中显示所创建的类和成员函数;在ResourceView标签页板中显示所创建的资源;在FileView标签页中显示源程序文件。如图2-6所示。

图2-6 应用程序框架的三个标签页显示

标签页:

从ClassView标签页可以看出,CTestApp是应用的主函数类,用来处理消息。MFC中的数据是存储在

CTestDoc类文档中,而结果却显示在CTestView类中,即显示在CMainFram类的客户区中。MFC中的文档/视图结构用来将程序的数据本身和数据显示相互隔离,文档类负责管理和维护数据本身,视图类负责处理用户鼠标和键盘的操作。

全部展开FileView标签页后,显示如图2-7所示的内容。本书后续的编程过程中一般使用的是CTestView类的TestView.h头文件和TestView.cpp源文件。

图2-7 FileView标签页的展开显示

在CTestView类的源文件TestView.cpp中可以找到OnDraw()函数。其内容如下:

void CTestView::OnDraw(CDC* pDC){

CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);

// TODO: add draw code for native data here}

?pDC定义为CDC类的指针。

?pDoc通过GetDocument()函数得到指向文档类CTestDoc的指针。

ASSERT_VALID(pDoc)函数使pDoc指针有效。

?使用pDC指针,可以对CDC类的成员函数进行操作。

?OnDraw()函数由系统框架直接调用,程序一运行就会自动执行。

7. 点击工具条上的按钮(如图2-8所示),就可以直接编译、运行程序。Test工程运行结果如图2-9所示。

图2-8 执行按钮图2-9 Test工程运行效果图

尽管未编写一句代码,但Test程序已经形成一个可执行程序框架。

2.2 MFC绘图方法

?MFC运算功能强大,拥有完备的绘图功能。?在Windows平台上,应用程序的图形设备接口(

graphics device interface,GDI)被抽象为设备上下文(Device Context,DC)。

?在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图函数都在CDC基类中定义。当需要输出文字或图形时,就需要调用CDC类的成员函数,这些成员函数具备输出文本、绘制图形的功能。

?本节讲解的例程全部在TestView.cpp文件的void CTestView::OnDraw(CDC* pDC)函数中实现。

2.2.1 CDC类结构和GDI对象

1.CDC类

CDC类派生了CClientDC类、CMetaFileDC类、

CPaintDC类和CWindowDC类。如图2-10所示。

图2-10 CDC类

CClientDC类:

显示器客户区设备上下文类。

?CClientDC只能在窗口的客户区进行绘图。

(不包括边框、标题栏、菜单栏及状态栏的空白区域)?点(0,0)是客户区的左上角。

?构造函数自动调用GetDC()函数,析构函数自动调用

ReleaseDC()函数。

CMetaFileDC类:

Windows图元文件设备上下文类。

?CMetaFileDC封装了在Windows中绘制图元文件的方法。?图元文件是微软定义的一种Windows平台下的与设备无关的的图形文件格式(扩展名为wmf),其所占的磁盘空间比其它任何格式的图形文件都要小得多。?wmf格式文件通常用于存储一系列由绘图命令所描述的图形(如绘制直线与文本等)。

?在建立图元文件时,不能实现即绘即得,而是先将GDI调用记录在图元文件中,然后在GDI环境中重新执行图元文件,才可显示图像。

4.删除GDI对象

类属:CGdiObject::DeleteObject原型:

BOOL DeleteObject();

返回值:如成功删除GDI对象,返回“非0”;否则,返回“0”。参数:无。

5.选入库对象

类属:CDC::SelectStockObject原型:

virtual CGdiObject *SelectStockObject(int nIndex);返回值:如果调用成功,返回被替代的CGdiObject类对象的指针;否则返回NULL。

参数:参数nIndex可以是表2-4给出的库画笔代码或表2-5给出的库画刷代码。

表2-3 常用的阴影线样式

阴影样式HS_BDIAGONAL

含义

45°上升阴影线(从左到右)

阴影样式HS_FDIAGONAL

含义

45°下降阴影线(从左到右)

水平阴影线垂直阴影线

HS_CROSS

水平与垂直交叉阴影线

HS_DIAGCROSS45°十字交叉阴

影线

HS_HORIZONTALHS_VERTICAL

表2-4 3种常用库笔

库画笔代码BLACK_PENNULL_PENWHITE_PEN

含义

宽度为1个像素的黑色实线画笔透明画笔

宽度为1个像素的白色实线画笔

表2-5 7种常用库画刷

库画刷代码BLACK_BRUSH

含义

黑色的实心画刷

对应的RGBRGB(0,0,0)

DKGRAY_BRUSHGRAY_BRUSHHOLLOW_BRUSHLTGRAY_BRUSHNULL_BRUSHWHITE_BRUSH

暗灰色的实心画刷灰色的实心画刷空心画刷

淡灰色的实心画刷透明画刷白色的实心画刷

RGB(64,64,64)RGB(128,128,128)

RGB(192,192,192)

RGB(255,255,255)

2.2.4 CDC类绘图成员函数

1.绘制像素点函数

类属:CDC::SetPixel 和CDC::SetPixelV原型:

COLORREF SetPixel(int x,int y,COLORREF crColor );BOOL SetPixelV(int x, int y, COLORREF crColor);返回值:SetPixel()函数如果调用成功,返回所绘制像素点的RGB值;否则,返回-1。SetPixelV()函数如果调用成功,返回“非0”;否则,返回“0”。

参数:x是像素点位置的x逻辑坐标;y是像素点位置的y逻辑坐标;crColor是像素点颜色。

说明:SetPixelV()函数不需要返回所绘制像素点的RGB值,执行速度比SetPixel()快得多。推荐使用SetPixelV()函数绘制像素点。

2.获取像素点颜色函数

类属:CDC::GetPixel原型:

COLORREF GetPixel(int x,int y)const;返回值:指定像素的RGB值。

参数说明:得到指定像素的RGB颜色值。本函数是常成员函数。

例2-6在屏幕的P0(20,20)坐标位置处绘制一个绿色像素点,然后读出该像素点的颜色,水平平移100个像素绘制P1点。效果如图2-13所示。

本文来源:https://www.bwwdw.com/article/12hx.html

Top