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)在线全文阅读。
相关推荐: