77范文网 - 专业文章范例文档资料分享平台

第5章(2)

来源:网络收集 时间:2019-03-16 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org

IV. CBrush::CreatePatternBrush

创建样式由位图指定的刷子,其用法如下: BOOL CreatePatternBrush(CBitmap* pBitmap); 参数pBitmap指向指定位图刷子的位图对象的指针。 V. CBrush::CreateSysColorBrush

创建具有系统颜色的刷子,其用法如下: BOOL CreateSysColorBrush( int nIndex); 参数nIndex指定不同颜色的索引值。

5.4.2 自定义画笔(CPen)

? CPen类提供用于产生画笔的构造函数

CPen( );

CPen(int nPenStyle, int nWidth, COLORREF crColor);

CPen(int nPenStyle, int nWidth, const LOGBRUSH* lpLogBrush,

int nStyleCount=0, const DWORD* lpStyle=NULL); I. CPen(int nPenStyle, int nWidth, COLORREF crColor);

它可以生成一个能够指定线型、线宽和颜色的画笔,下面的代码生成了一个实线,宽度为6,颜色为黑色的画笔。要注意的是,有的线型只在线宽小于1时才有效。

CPen newpen(PS_SOLID ,6,RGB(0,0,0)); dc.SelectObject(&newpen);

II. CPen(int nPenStyle, int nWidth, const LOGBRUSH* lpLogBrush,

int nStyleCount=0, const DWORD* lpStyle=NULL);

生成一个由LOGBRUSH结构所指定风格、颜色和样式的画笔。

? CPen类提供用于产生画笔的成员函数

I. CPen::CreatePen

创建拥有指定类型、宽度和属性的几何或装饰笔,其用法如下:

BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );

BOOL CreatePen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL ); 参数nPenStyle指定笔的风格,如实线、虚线。 参数nWidth指定笔的线宽。 参数crColor指定笔的颜色。

参数lpLogBrush指向包含刷子信息的LOGBRUSH结构的指针。

参数nStyleCount指定lpStyle数组以双字为单位的长度,如果nPenStyle不是PS_USERSTYLE,该参数必须设为1。

参数lpStyle指向双字数组,第一个字指定第一个用户定义风格的实笔画长度,第二个字指定第一个空笔画的长度,依次类推,如果nPenStyle不是PS_USERSTYLE,该参数必须设为NULL。 II. CPen::CreatePenIndirect

创建拥有LOGPEN结构所指定风格、颜色和样式的画笔。用法如下:

BOOL CreatePenIndirect( LPLOGPEN lpLogPen );

参数lpLogPen指向LPLOGPEN结构的指针,详情参见MSDN。

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org

5.4.3 自定义字体(CFont)

创建字体对象,在使用之前必须用函数CreateFont、CreateFontIndirect、 CreatePointFont或CreatePointFontIndirect初始化,其用法如下:

Ⅰ. CFont:: CreateFont

创建具有指定属性的字体。用法如下:

BOOL CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation,

int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision,

BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );

参数详情请参见MSDN。 Ⅱ. CFont ::CreateFontIndirect

创建拥有LOGFONT结构所指定的属性的字体。其用法如下:

BOOL CreateFontIndirect(const LOGFONT* lpLogFont ); 参数lpLogFont指向LOGFONT结构的指针。 Ⅲ. CFont :: CreatePointFont

提供一种创建指定字体名和尺寸的字体的简单方法,自动将高度转换为pDC所指的

设备描述表中所用的逻辑单位,如果pDC为NULL,则转换为屏幕设备描述表中所用的逻辑单位。其用法如下:

BOOL CreatePointFont( int nPointSize, LPCTSTR lpszFaceName,

CDC* pDC = NULL);

参数nPointSize指定字体的高度,以一个点的1/10为单位。 参数lpszFaceName指定字体的字体名字,长度不超过30。 参数pDC指向CDC对象的指针。

如: CFont fn;

fn.CreatePointFont(120,\楷体\

dc.SelectObject(&fn);

我们通常说的12号的字体,它的大小实际上就是12个点的大小,因此在函数CreatePointFont中,若自定义的字体为12号字,那么参数nPointSize值应为120。CreatePointFont 是产生字体最简单的方法,它的第二个参数是字体的名字,具体你的系统中装了哪些字体,可以打开记事本,在其中的“格式”――“字体”中查到。 Ⅳ. CFont :: CreatePointFontIndirect

创建拥有LOGFONT结构所指定的属性的字体,自动将高度转换为pDC所指的设

备描述表中所用的逻辑单位,如果pDC为NULL,则转换为屏幕设备描述表中所用的逻辑单位。其用法如下:

BOOL CreatePointFontIndirect( const LOGFONT* lpLogFont,

CDC* pDC = NULL);

参数lpLogFont指向LOGFONT结构的指针。

参数pDC指向CDC对象的指针。

5.5 GDI对象的使用及示例

上一节讲述了如何构造一个GDI对象,本节将介绍GDI对象的使用方法,通常,使用绘图工具的一般步骤为:

1. 创建刷子、笔或字体,若该绘图工具已初始化,则可以直接跳到第三步。

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org

2. 对不能仅仅由构造函数来创建的绘图工具(如前面讲过的CFont和CRgn),需要通

过调用它们的成员函数来对其进行初始化。

3. 使用SelectObject函数将自定义绘图工具选入设备描述表;用SelectStockObject将

库存绘图工具选入设备描述表。下面是这两个函数的用法: ? CPen* SelectObject( CPen* pPen );

CBrush* SelectObject( CBrush* pBrush );

virtual CFont* SelectObject( CFont* pFont ); 参数pPen指向要选取的笔对象的指针。 参数pBrush指向要选取的刷子对象的指针。 参数pFont指向要选取的字体对象的指针。 该函数调用成功之后,会返回原来的设备描述表内的GDI对象,在使用完选取的GDI对象之后应该恢复为原来的GDI对象。

? virtual CGdiObject* SelectStockObject ( int nIndex );

参数nIndex 指定库存GDI对象的索引。如 BLACK_BRUSH 代表黑色刷子; DKGRAY_BRUSH 代表深灰色刷子; GRAY_BRUSH 代表灰色刷子; HOLLOW_BRUSH 代表空心色刷子; LTGRAY_BRUSH 代表浅灰色刷子; NULL_BRUSH 代表空心色刷子; WHITE_BRUSH 代表白色刷子; BLACK_PEN 代表黑色画笔; NULL_PEN 代表空画笔; WHITE_PEN 代表白色画笔;

ANSI_FIXED_FONT 代表ANSI固定字宽系统字体; ANSI_VAR_FONT 代表ANSI可变字宽系统字体; DEVICE_DEFAULT_FONT 代表设备相关字体; SYSTEM_FONT 代表可变字宽系统字体; SYSTEM_FIXED_FONT 代表固定字宽系统字体;

该函数同SelectObject一样,在调用成功之后,会返回原来的设备描述表内的GDI对象,在使用完选取的GDI对象之后应该恢复为原来的GDI对象。 4. 进行绘图操作。

5. 将旧的GDI对象选回设备描述表,若第一步中是用new创建对象,使用完毕后应

该用Delete删除该对象。

上面介绍了GDI对象的使用方法,一般的绘图工作基本上都采用上面的步骤来完成的,接下来,我们就将通过几个实例来分别描述各种GDI对象的用法。

5.5.1 画笔的使用

这一部分,我们将向读者介绍三个小例子,这三个例子不仅包含了本章所讲的画笔的用法及设备描述表的概念,而且还包括了以前所讲过消息及添加变量的概念,请读者仔细消化。 5.5.1.1在MFC应用程序中画线

首先我们来分析一下编程的思路,试想一下,如果要在窗口上画线,应该先将鼠标在要画线的起始点按下,然后向某个方向拖去,当达到用户要求的时候,将鼠标抬起,这样一条

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org

线才完成,那么整个画线过程至少需要用户响应两个事件:鼠标左键按下和鼠标左键抬起,而且还要定义一个变量将用户最先按下的点的坐标保存。完整例程请参见光盘中的例子代码EX05-00。

? 第一步:新建一个MFC应用程序工程。

1) 启动Visual C++,选择File|New,弹出新建对话框。

2) 在新建对话框左边选择MFC AppWizard(exe),右边工程名为EX05_00或用户

自定义工程名,文件存放位置用户自定义。

3) 单击OK按钮,弹出MFC AppWizard对话框,选择新建Single document单文

档应用程序,其他一切采用默认设置。

? 第二步:在工程的CEX05_00View类中添加成员变量CPoint m_ptOrigin,用于记录

用户鼠标左键按下时的点坐标。CPoint是一个用于描述点的简单的类,它有两个成员变量可以存放点的(x,y)坐标。

1) 在工作台中,点击EX05_00 classes结点旁的加号,展开工程中的类。

2) 选中CEX05_00View类,右击CEX05_00View,在弹出的快捷方式菜单中选择

Add Member Variable.

3) 在Add Member Variable对话框的Variable Type文本框中输入添加的变量的

类型CPoint,在Variable Name文本框中输入要添加的变量的变量名称m_ptOrigin,访问类型选择public,单击OK。

? 第三步:打开ClassWizard,在工程的CEX05_00View类中添加鼠标左键按下和鼠标

左键抬起的消息响应,分别为WM_LBUTTONDOWN和WM_LBUTTONUP(因为只有CEX05_00View类中才能接收到鼠标消息)。

1) 打开Class Wizard对话框,选择Class name下拉列表框为CEX05_00View,

在Object IDs下面列表框中选中CEX05_00View,然后在右边的Messages列表框中选中WM_LBUTTONDOWN消息,双击该消息或者单击Add Function按钮,将消息添加进工程中。该消息对应的消息函数为OnLButtonDown。

2) 用同样的方法,将WM_LBUTTONUP消息添加入工程中,或通过工作台加入该消

息映射(如何添加消息映射在上一章中有详细的介绍)。该消息对应的消息函数为OnLButtonUp。

? 第四步:完成WM_LBUTTONDOWN消息执行代码,当鼠标左键按下时,用户只需要一

个操作,就是保存按下的点的坐标。

1) 在工作台CEX05_00View类下面找到OnLButtonDown函数,双击它,在左边的

代码编辑区中显示该函数体。 2) 在该函数中填写如下代码:

void CEX05_00View::OnLButtonDown(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default m_ptOrigin =point;

CView::OnLButtonDown(nFlags, point); }

其中point是调用OnLButtonDown函数时,系统自动给我们传入的鼠标按下的点的坐标。

? 第五步:完成WM_LBUTTONUP消息执行代码,当鼠标抬起时画线,并且在画线之前

创建一个红色的画笔,画线结束后,将原来的画笔选回。

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org

1) 在工作台CEX05_00View类下面找到OnLButtonUp函数,双击它,在左边的代

码编辑区中显示该函数体。

2) 创建一个线型为实线,线宽为2的红色画笔。

CPen newPen(PS_SOLID ,2,RGB(255,0,0));

3) 获取一个设备描述表。

CClientDC dc(this);

4) 定义一个指向画笔对象的指针变量,将新创建的画笔选入设备描述表,并将返

回的旧画笔保存在我们定义的指向画笔对象的指针变量中。

CPen *pOldPen;

pOldPen=dc.SelectObject(&newPen);

上面的两句代码与CPen *pOldPen=dc.SelectObject(&newPen);一句等价。

5) 将设备描述表中的画笔先移动到原来保存的鼠标按下的点的位置,然后画线到

鼠标抬起的点的位置。由于该设备描述表中的画笔是我们选给它的自定义的画笔,因此,画出来的线就是带颜色的线条。

dc.MoveTo(m_ptOrigin); dc.LineTo(point);

6) 画线工作结束,将旧的画笔选回设备描述表。

dc.SelectObject(pOldPen);

到此为止,一个画线的应用程序诞生了。上面为了使用户清楚的了解鼠标左键抬起时的操作,将OnLButtonUp函数中的代码分解开来讲,该函数中的代码如下: void CEX05_00View::OnLButtonUp(UINT nFlags, CPoint point)

{ // TODO: Add your message handler code here and/or call default CPen newPen(PS_SOLID ,2,RGB(255,0,0)); CClientDC dc(this); CPen *pOldPen=dc.SelectObject(&newPen); dc.MoveTo(m_ptOrigin); dc.LineTo(point); dc.SelectObject(pOldPen); CView::OnLButtonUp(nFlags, point);

}

现在,用户编译运行该程序,可以在屏幕上画出红色的线条。

5.5.1.2在Windows Application程序中画线

这个例子中,我们要在Win32程序中实现画线的功能。在画线之前,至少应该有一个可以画线的窗口,只有窗口建立完成之后,才可以响应鼠标的按下和抬起事件。Win32程序建立窗口的过程在第二章中有详细的讲解。本例完整例程请参见光盘中的例子代码EX05-01。

? 第一步:新建一个Windows Application程序工程。

1) 启动Visual C++,选择File|New,弹出新建对话框。 2) 在新建对话框左边选择Win32 Application,右边工程名为EX05_01或用户自定

义工程名,文件存放位置用户自定义。 3) 单击OK按钮,弹出Win32 Application向导对话框,选择新建An empty project

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第5章(2)在线全文阅读。

第5章(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/524769.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: