VC++6简明教程
DEFAULT_PITCH|FF_DONTCARE, \大号字\ pDC->SelectObject (&NewFont2); pDC->SetTextColor(RGB(155,155,155)); pDC->TextOut(x,y,outstr[3]); pDC->SelectObject (pOldFont); pDC->SelectObject (&NewFont2); pDC->SetTextColor(RGB(155,155,155)); pDC->TextOut(x,y,outstr[3]); pDC->SelectObject (pOldFont); }
分析如表5-6所示:
表5-6
文本串1 文本串2 文本串3 文本串4 文本属性 红色 绿色 蓝色 灰色 求下一行位置 求同行字符串尾部位置 求下一行位置 格式化 默认字体 高度20,宽度10,粗体,黑体字 高度30,斜体,下划线,大号字 字体
请注意pOldFont的使用,在第一次调用SelectObject()函数,函数返回老的字体设置,由CFont对象指针pOldFont接受,在OnDraw()函数的最后再使用SelectObject()是恢复原来的字体设置。
5.3 处理绘图 5.3.1 简单的图形输出
CDC提供了基本的绘图操作函数,如画点,画线,画圆,画矩形,画多边形等等,简单介绍如下: 1. 点
pDC->SetPixel(CPoint(200,200),RGB(255,0,0)); //在[200,200]的位置画一个红点
2. 线
pDC->MoveTo(0,0); //直线起点的坐标为(0,0)
pDC->LineTo (100,100); //从起点(0,0)到终点(100,100)画一条直线 pDC->MoveTo (0,100); pDC->LineTo (100,0);
3. 矩形
CRect rect(0,0,100,100); //画一个长100,宽100的矩形 pDC->Rectangle(&rect);
4. 圆和椭圆
CRect rect(0,0,100,100); //在矩形内画圆 pDC->Ellipse(&rect);
CRect rect(0,0,50,100); //在矩形内画椭圆
16
第5章 图形与文本输出
pDC->Ellipse(&rect);
5. 多边形
CPoint poly[4]; //画一个平行四边形 poly[0]=CPoint(0,0); poly[1]=CPoint(50,50); poly[2]=CPoint(50,100); poly[3]=CPoint(0,50); pDC->Polygon(poly,4);
6. 其它图形
CDC::Pie // 画饼图 CDC::Chord //画弦
CDC::FillRect //用指定颜色填充矩形且不画边线 CDC::Draw3DRect //用于绘制名种3D边框 CDC::RoundRect //画圆角矩形 绘图函数的具体的使用方法可以查阅MSDN。
5.3.2 库存对象
不管以CDC类指针形式还是以CDC子类对象形式获得设备上下对象,系统都默认指定了一组绘图属性,如表5-7所示。
表5-7 系统默认绘图属性
绘图属性 画笔 画刷 背景颜色 背景模式 刷子原点 当前绘图位置 混合模式 映射模式 默认值 一个像素宽的黑色实线 白色的实心刷 白色 OPAQUE 设备坐标(0,0) 逻辑坐标(0,0) R2_COPYPEN MM_TEXT 改变默认值的函数 SelectObject,SelectStockObject SelectObject,SelectStockObject SetBKColor SetBKMode SetBrushOrg MoveTo SetRop2 SetMapMode
库存对象是由操作系统维护的用于绘制屏幕的常用对象,包括库存画笔、画刷、字体等。使用SelectStockObject()函数可以直接选择库存对象修改系统默认值。可直接选用的库存对象如表5-8所示。
表5-8 系统默认绘图属性
GDI分类 Fonts ANSI_FIXED_FONT ANSI_VAR_FONT DEVICE_DEFAULT_FONT OEM_FIXED_FONT SYSTEM_FONT Pens BLACK_PEN WHITE_PEN NULL_PEN 库存对象值 17
VC++6简明教程
Brushs BLACK_BRUSH DKGRAY_BRUSH GRAY_BRUSH HOLLOW_BRUSH LTGRAY_BRUSH NULL_BRUSH WHITE_BRUSH
下面的实例演示了如何使用库存对象:
程序清单5-12:在视图中选用画笔和画刷库存对象画图的OnDraw()函数 void CExam5View::OnDraw(CDC* pDC) { CExam5Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rect; rect.SetRect (CPoint(0,0),CPoint(200,200)); pDC->SelectStockObject (WHITE_PEN); //选用白色画笔 pDC->SelectStockObject (GRAY_BRUSH);//选用灰色画刷 pDC->Rectangle (rect); pDC->MoveTo(0,0); pDC->LineTo (200,200); pDC->MoveTo (0,200); pDC->LineTo (200,0); }
演示效果如图5-10所示。
图5-10 选用库存对象设置绘图属性
18
第5章 图形与文本输出
5.3.3设置绘图坐标系
首先要介绍逻辑坐标和设备坐标的概念,一般地说,如果要把一幅大小为400mm×800mm的图画显示在500像素×200 像素的windows窗口中,前者称为逻辑坐标,后者称为设备坐标。它们的关系如图5-11所示:
400mm 500像素
200像素
逻辑坐标
图5-11 逻辑坐标与设备坐标
800mm 设备坐标 设备坐标系的原点总是在窗口的左上角,它的单位是像素。而逻辑坐标系的单位有多种,可以是像素,也可以是厘米、毫米、英寸等,逻辑坐标按映像模式可分为三大类,一共八种模式:
(1) MM_TEXT
默认的映像模式,原点在左上角,向右x增加,向下y增加。 (2) 固定比例的映射模式 向右x增加,向下y减少。 (3) 可变比例的映射模式
允许改变比例因子和原点。在用户改变窗口大小时,绘制的内容会随之改变。如果改变一个轴的比例,则所绘的图像也会在其它轴上相应的改变。
表5-9 映像模式
类别 默认模式 固定比例的映射模式 映像模式名称 MM_TEXT MM_LOMETRIC MM_HIMETRIC MM_LOENGLISH MM_HIENGLISH MM_TWIPS 可变比例的映射模式 MM_ISOTROPIC MM_ANISOTROPIC 像素 0.1mm 0.01mm 0.01inch 0.001inch 1/1440inch 可调整(x=y) 可调整(x!=y) 逻辑单位
要准确的确定绘图效果,要正确地设置映像模式,可以使用CDC::SetMapMode()函数更改映像模式。例如:
CClientDC dc;
int OldMode=dc.SetMapMode(MM_LOMETRIC);
并可以使用CDC::SetViewportOrg()函数和CDC::SetWindowOrg函数移动逻辑坐标系的原点。例如,下面程序语句段将坐标系的原点移动到客户区中央:
19
VC++6简明教程
CRect rect;
GetClientRect(rect);
pDC->SetViewportOrg(rect.width()/2,rect.height()/2);
现在所面临的问题是如何区分使用逻辑坐标和设备坐标的场合。一般来说,MFC的CDC绘图函数都使用逻辑坐标为参数;CWnd的成员函数一般使用设备坐标为参数,如返回鼠标位置作为屏幕位置测试时,一般也是使用设备坐标。设备坐标系统分为三类:
(1) 工作区(Viewport)坐标系统
它以窗口客户区左上角为原点(0,0),主要用于窗口客户区绘图输出以及处理窗口的一些消息。鼠标消息传给框架的位置消息参数以及CDC一些用于绘图的成员都是使用工作区坐标。
(2) 窗口(Windows)坐标系统
它以窗口左上角为坐标原点(0,0),它包含窗口控制菜单、标题栏等内容。一般情况下很少在窗口标题栏上绘图,因此这种坐标系统很少使用。
(3) 屏幕(Screen)坐标系统
它以屏幕左上角为原点(0,0)。当以CreateDC()或GetDC()取得设备上下文使用的是屏幕坐标系。一般设置和取得光标的位置的函数SetCursorPos()和GetCursorPos()是使用屏幕坐标;弹出式菜单使用屏幕坐标;CreateWindow()、MoveWindow()等函数用于设置窗口相对于屏幕的位置,使用的也是屏幕坐标系统。
MFC使用ClientToScreen()和ScreenToClient()两个函数,用于完成工作区坐标和屏幕坐标之间的转换工作。逻辑坐标和设备坐标的转换是经常发生的事情,例如,用户在视图滚动后单击鼠标,会得到鼠标的设备坐标。如果要保存这个数据到文档,则需要把它转化为逻辑坐标。相反,当调用MFC绘图函数绘图时,Windows自动将逻辑坐标转换成设备坐标再绘图。CDC也提供了成员函数LPToDP()和DPToLP()完成两种坐标之间的转换。5.3.5节中例5-3演示了不同映像模式的使用。
5.3.4创建和使用自定义画笔和画刷
创建CPen的方法有两种: (1) 定义时直接创建
CPen Mypen(PS_SOLD,2,RGB(255.0.0)); (2) 定义CPen对象,再调用CreatePen()函数
CPen pen;
pen.CreatePen(PS_SOLD,2,RGB(255,0,0));
其中第一个参数是笔的风格,可选值有:PS_SOLD(实线),PS_DOT(虚线),PS_NULL (空画笔)。第二个参数是线的宽度,第三个参数是线的颜色。
表5-10画笔样式及说明
样式 PS_DASH PS_DASHDOT PS_DASHDOTDOT PS_DOT 说明 虚线 点划线 双点划线 点线 样式 PS_INSIDEFTAME PS_NULL PS_SOLID 说明 实线(边框线) 无 实线
创建画刷的方法有下面几种:
(1) 创建实心画刷CreateSolidBrush()函数
CBrush bs;
20
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VC++6.0入门第五章 图形和文本输出(4)在线全文阅读。
相关推荐: