




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、绘图第09章本章主要内容9.2 文本处理9.3 映射模式9.1 基础绘图操作9.1.1 绘图基本概念设备环境的概念绘图工具绘图的基本流程1、设备环境设备环境是Windows提供的一个数据结构,描述了应用程序向设备输出时所需要的信息,是对物理设备(显示器、打印机等)的逻辑抽象;此外Windows还提供了大量的用于绘制图形、文本、位图的API函数。MFC通过CDC类,将设备环境数据结构和相关的绘图操作封装在一起。在MFC应用程序中,设置绘图环境、完成绘图操作等功能都是通过CDC类对象完成的。CDC类的派生类CPaintDC:用于WM_PAINT消息映射函数OnPaint()中;一般不映射该消息,如
2、果要映射,需要调用OnDraw。CClientDC:描述窗口的客户区,完成对客户区窗口的绘制,比较常用。CWindowDC:描述整个窗口,包括工具栏、菜单栏、状态栏;允许在窗口任意位置进行绘图。CMetaFileDC:应用于图元文件中绘图2、绘图工具Windows为设备环境提供了各种各样的绘图工具,如用于画线的画笔、填充区域的画刷、绘制文本的字体。在进行绘制操作时,首先应该创建绘图工具,然后将绘图工具选入设备环境中。MFC封装了这些绘图工具,提供了多个图形设备接口类对象,如CPen、CBrush、CFont、CBitmap等,它们有一个公共的抽象基类CGdiObject。小结:绘图工具由GDI
3、类对象描述,绘图环境设置及绘图函数封装在CDC类中。3、绘图操作基本步骤获得设备环境类对象;创建合法的GDI对象,如画笔、画刷、位图、字体等;将GDI对象选入CDC类对象中,同时保存原来的GDI对象;进行绘图操作;结束绘图后,恢复原始的GDI对象;有时候需要释放CDC类对象。获取设备环境视图类的OnDraw函数体内void CMyView:OnDraw(CDC *pDC)pDC-Ellipse();pDC对象可以直接使用,使用完成后不能删除系统间接调用时传递的参数,屏幕刷新后能重新绘制获取设备环境在普通成员函数体内void CMyView:MyFunction()CClientDC dc(th
4、is);dc.Ellipse();得到dc对象后可以直接使用,使用完成后不用释放,函数返回后,由析构函数释放资源多用于一次性绘制,屏幕刷新后不会重绘获取设备环境在普通成员函数体内void CMyView:MyFunction()CDC *pDC=GetDC();pDC-Ellipse();ReleaseDC(pDC)得到pDC对象后可以直接使用,使用完成后需要使用ReleaseDC释放该对象。动态创建对象,位于堆中,用完后必须释放特殊的设备环境视图类普通成员函数中void CMyView:MyFunction()CWindowDC dc(GetParent();/CClientDC dc (G
5、etParent();dc.Ellipse();得到主框架窗口指针,用于对整个窗口绘图特殊的设备环境视图类普通成员函数中void CMyView:MyFunction()CWindowDC dc( GetDesktopWindow() );dc.Ellipse();得到桌面的窗口指针,可以对整个桌面进行绘图9.1.2 基本绘图工具画笔画刷库存对象简单的绘图示例1、画笔画笔是用来绘制直线和曲线的工具,具有宽度、风格和颜色三种属性。风格属性为一些预定义常量,如实线PS_SOLID、虚线PS_DASH、点线PS_DOT、点划线PS_DASHDOT。只有实线设置线宽才有意义。风格属性宏/WinGdi.
6、h中#define PS_SOLID 0#define PS_DASH 1 /* - */#define PS_DOT 2 /* . */#define PS_DASHDOT 3 /* _._._._ */#define PS_DASHDOTDOT 4 /* _._._ */#define PS_NULL 5#define PS_INSIDEFRAME 6#define PS_USERSTYLE 7#define PS_ALTERNATE 8#define PS_STYLE_MASK 0 x0000000F创建画笔方法一:通过构造函数直接初始化CPen(int nPenStyle,int nW
7、idth,COLORREF crColor);CPen pen(PS_SOLID,2,RGB(255,0,0);方法二:调用CreatePen成员创建BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);CPen pen;pen.CreatePen(PS_SOLID,2,RGB(255,0,0);设置颜色COLORREF实际就是一个unsigned int型,DWORD类型,32位二进制整数,用来描述一种颜色。前3个字节用于表示红、绿、兰三种颜色分量,最后一个字节表示透明度。RGB宏:通过R、G、B三个分量构造一个颜色常量,每个分量
8、值范围为0255COLORREF rColor=RGB(255,0,0);CPen pen(PS_SOLID,2,rColor);2、画刷画刷用于指定填充的属性。画刷的属性包括填充颜色、填充图案和填充样式。实心画刷用COLORREF描述填充颜色;阴影画刷使用一组预定义宏定义填充模式,宏以HS_打头;位图画刷指定一个位图(通常是88位图)作为画刷的填充图案。创建实心画刷BOOL CreateSolidBrush(COLORREF crColor ) CBrush b;b.CreateSolidBrush(RGB(255,0,0);CBrush b(RGB(255,0,0);创建阴影画刷BOOL
9、CreateHatchBrush( int nIndex, COLORREF crColor ) CBrush b;b.CreateHatchBrush(HS_CROSS,RGB(255,0,0);创建位图画刷CreatePatternBrush( CBitmap* pBitmap)CBrush b;CBitmap *pMap=;b.CreatePatternBrush(pMap);3、库存GDI对象Windows系统预定义好的GDI对象,直接使用,使用前无须定义,使用后无须删除。#define WHITE_BRUSH 0 白色刷子#define LTGRAY_BRUSH 1 浅灰色刷子#de
10、fine GRAY_BRUSH 2 灰色刷子#define DKGRAY_BRUSH 3 深灰色刷子#define BLACK_BRUSH 4 黑色刷子#define NULL_BRUSH 5 空刷子#define WHITE_PEN 6 白色画笔#define BLACK_PEN 7 黑色画笔#define NULL_PEN 8 空笔4、简单的绘图示例void CPenView:OnDraw(CDC* pDC)CPen Pen1(PS_SOLID,2,RGB(255,0,0);CPen *pOldPen;pOldPen=pDC-SelectObject(&Pen1);pDC-SelectSt
11、ockObject(GRAY_BRUSH);pDC-Rectangle(CRect(0,0,20,20);pDC-SelectObject(pOldPen);要点对于用户创建的绘图工具,使用CDC类的SelectObject选中,完成绘图后要恢复;库存的绘图工具,使用SelectStockObject选中,完成绘图后无需恢复;初始时,系统有默认的绘图设置,每次绘图完成后,应恢复到该默认状态。9.1.3 基本绘图操作画点画线折线矩形多边形椭圆基本数据类型绘图模式1、画点操作画点COLORREF SetPixel (int x,int y,COLORREF crColor);COLORREF Se
12、tPixel (POINT point,COLORREF crColor);BOOL SetPixelV (int x,int y,COLORREF crColor);获取点的颜色COLORREF GetPixel(int x,int y)const;也可以传递一个CPoint对象2、画线操作画直线BOOL LineTo(int x,int y);BOOL LineTo(POINT point);/ 从当前点绘制直线到point指定的点,同时/ 由point指定的点称为新的当前点设置当前点CPoint MoveTo(int x,int y);/ 设置新的当前点并返回之前的当前点查询当前点CPo
13、int GetCurrentPosition() const;3、画折线BOOL Polyline( LPPOINT lpPoints, int nCount );BOOL PolylineTo( const POINT* lpPoints, int nCount );这两个函数用来画一系列连续的折线。参数lpPoints是POINT或CPoint的顶点数组;nCount表示数组中顶点的个数,它至少为2;Polyline不使用当前位置,也不更新当前位置;而PolylineTo把当前位置作为起始点,并且在折线画完之后,把折线终点位置设为新的当前位置。4、画矩形CDC的Rectangle和Roun
14、dRect函数用于矩形和圆角矩形的绘制:BOOL Rectangle( int x1, int y1, int x2, int y2 );BOOL Rectangle( LPCRECT lpRect );BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 );BOOL RoundRect( LPCRECT lpRect, POINT point );矩形参数BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 );5、画多边形多边形是由首尾相接的封闭
15、折线所围成的图形。画多边形的函数Polygon原型如下:BOOL Polygon( LPPOINT lpPoints, int nCount );由lpPoints数组构成的顶点绘制封闭的多边形,nCount指定顶点的数量。6、弧和椭圆BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); BOOL Ellipse( int x1, int y1, int x2, int y2 );/绘制内
16、接矩形的椭圆,当矩形构成正方形时/绘制的便是圆。弧的参数BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );7、常用数据类型CPoint:描述一个坐标点CPoint p(20,20);pDC-MoveTo(0,0);pDC-LineTo(p);pDC-LineTo(p.x,p.y);常用数据类型CRect:构造一个矩形区域CRect rr(0,0,20,20);pDC-Rectangle(rr);pDC-Rectangle(&rr);常用方法Width():返回矩形的宽度Height():返回矩形
17、的高度PtInRect( POINT point ) 判断point是否位于矩形区域内常用数据类型CSize:构造一个尺寸大小CSize sz(10,20);CRect rc(0,0,100,100);rc.InflateRect(sz);rc.InflateRect(sz.cx,sz.cy);8、绘图模式绘图模式概念进行绘图时,并不是简单输出图形像素点颜色;而是将输出颜色与目标位置像素现有颜色进行某种逻辑运算,运算结果作为输出。逻辑运算由绘图模式定义。设置绘图模式int SetROP2(int nDrawMode);默认的绘图模式为R2_COPYPEN,新的输出覆盖原来的输出。常用绘图模式绘
18、图模式为一组整数宏R2_BLACK 最后像素为黑R2_NOP 保持原来颜色R2_NOT 对原来颜色取反R2_COPYPEN 新的颜色覆盖原来颜色R2_XORPEN 新颜色与原来颜色异或运算绘图前要保存原来的绘图模式,绘制完成后再恢复原来的模式。本章主要内容9.2 文本处理9.3 映射模式9.1 基础绘图操作9.2.1 字体工具字体的基本概念创建字体获取字体属性1、字体基本概念字体也是基本的GDI工具,封装于CFont类字体属性字样:字符书写时表现出的特定模式,如汉字的宋体、楷体、黑体等风格:主要表现为字体的粗细和是否倾斜等尺寸:指字符占据区域的大小,通常用字符高度描述,常以mm、英寸或点度量,
19、一点约1/72英寸,汉字还有用号的度量方法。2、创建字体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 ) CreateFontIndirect(cons
20、t LOGFONT* lpLogFont ) :建议使用LOGFONT常用成员lfFaceName:指定字体名称。nHeight:指定宽度,当nHeight为0,表示高宽比例固定;如果希望字体为指定的尺寸,应将高度设置为负值,nWidth设置为0。nWidth:指定字体高度nEscapement:整个文本行的倾斜角度,0.1为单位nWeight:指定字体的粗细,取值100900创建字体的常见方法CreateFontIndirect的使用LOGFONT lf;pDC-GetCurrentFont()-GetLogFont(&lf);CFont font,*pOldFont;lf.lfCharse
21、t=GB2312_CHARSET;lf.lfHeight=80; lf.lfWidth=0;strcpy(lf.lfFaceName, “黑体”);font.CreateFontIndirect(&lf);pOldFont=pDC-SelectObject(&font);只需修改部分常用属性 tmExternalLeading tmInternalLeading 纯高度tmHeight:字体高度,纯高度加音标高度tmExternalLeading:本行音标之上至上一行基线,可以为0tmHeight+tmExternalLeading:字符高度3、字体的尺寸计算tmHeightTEXTMETRI
22、C结构tmHeight、tmExternalLeadingGetTextMetrics(LPTEXTMETRIC lpMetrics); 将当前字体属性填入结构体lpMetris中GetTextExtent(const CString& str)得到当前字体下,输出字符串str时所占用的宽度和高度,可以精确控制行距。常用函数9.2.2 文本输出TextOut(int x, int y, const CString& str) x、y指定输出的位置,str为输出的字符串DrawText( const CString& str, LPRECT lpRect, UINT nFormat ) str:
23、指定要输出的字符串lpRect:指定输出的矩形区域nFormat:指定输出时的对齐方式文本输出控制SetTextColor( COLORREF crColor ) 设置输出文字的文本颜色SetBkColor(COLORREF crColor)设置输出文本时的背景颜色SetBkMode(int nBkMode)设置绘图模式nBkMode取OPAQUE,为不透明绘图nBkMode取TRANSPARENT,透明背景,此时背景颜色无效。文本输出控制SetTextAlign(UINT nFlags)主要设置TextOut函数的对齐方式TA_LEFT、 TA_CENTER、TA_RIGHT确定水平方向上的
24、对齐方式,TA_BOTTOM、TA_BASELINE、 TA_TOP确定垂直方向对齐方式,水平方向和垂直方向可各取一值进行组合,如UINT n=SetTextAlign(TA_LEFT|TA_TOP);SetTextAlign(n); /恢复原来的对齐方式9.2.3 示例:旋转文字void CDrawView:OnDraw(CDC* pDC)CRect rect;GetClientRect(rect);LOGFONT lf;pDC-GetCurrentFont()-GetLogFont(&lf);CFont font,*pOldFont;lf.lfCharSet=GB2312_CHARSET;
25、lf.lfHeight=30; lf.lfWeight=FW_BOLD;lf.lfOrientation=0;strcpy(lf.lfFaceName, 宋体);示例:旋转文字void CDrawView:OnDraw(CDC* pDC)for(int i=0;iSelectObject(&font);pDC-TextOut(rect.Width()/2,rect.Height()/2, 旋转文字示例);font.Detach();pDC-SelectObject(pOldFont);本章主要内容9.2 文本处理9.3 映射模式9.1 基础绘图操作9.3.1 坐标系统逻辑坐标应用系统中使用的逻
26、辑坐标系,如500300的区域范围,不用考虑具体设备设备环境类的绘图函数往往使用逻辑坐标。设备坐标显示器、打印机等物理设备采用的坐标系统,不同设备的坐标系不同。对于显示器,坐标单位为像素,(0,0)位于左上角,X正轴向右,Y正轴向下。坐标系统三种设备坐标屏幕坐标系:整个屏幕区域的坐标系统;窗口坐标系:以包括边框在内应用程序窗口区域的坐标系统;用户区坐标系:以窗口客户区为区域的坐标系统。CWnd类成员函数一般使用设备坐标作为参数,如返回鼠标位置。9.3.2 坐标转换屏幕坐标和用户区坐标转换映射模式设置映射模式设备坐标和逻辑坐标转换1、屏幕坐标和用户区坐标屏幕坐标和用户区坐标使用场合多数CWnd类
27、成员函数使用用户区坐标,如鼠标操作等,产生的是相对客户区的坐标;右击弹出快捷菜单、创建窗口、MoveWindow等设置窗口的函数往往以屏幕坐标为参考。相互转换void ScreenToClient(LpPoint lpPoint) const;void ClientToScreen(lpPoint lpPoint) const;2、映射模式CDC类中的函数基本上都使用逻辑坐标。最终的输出由Windows完成向设备坐标转换;转换过程由映射模式决定。8种映射模式MM_TEXT方式:默认的方式,左上角(0,0),X轴向右增加,Y轴向下增加 MM_LOENGLISH、MM_HIENGLISH、MM_L
28、OMETRIC、MM_HIMETRIC、MM_TWIPS、MM_ANISOTROPIC、MM_ISOTROPIC视口和窗口的概念视口:以像素为坐标单位,即用户在屏幕上所观察到的应用程序客户区的一块屏幕区域窗口:应用程序中的坐标范围,对应逻辑坐标,如1km2km,在显示时,Windows需要将窗口坐标映射到视口坐标中(即设备坐标)视口和窗口的概念3、设置映射模式CDC类设置映像方式的基本方法SetMapMode(int nMapMode),设置指定的映像模式后,返回原来的映像模式MM_ANISOTROPIC映射模式下,可以设置长宽方向不同比例 SetWindowsExt(SIZE size),窗
29、口大小 SetViewportExt(SIZE size),视口大小SetViewportOrg(POINT point),设置视口坐标原点,使用设备坐标,单位为像素;SetWindowOrg,设置窗口坐标原点,使用逻辑坐标。设置映射模式的地方刷新屏幕的操作通常在OnDraw中,应用框架在调用OnDraw成员函数之前要调用OnPrepareDC,所以通常将设置映射模式房在该函数中。在其它消息处理函数中,在获得CDC类对象之后,需要调用OnPrepareDC(&dc),以便正确设置映射模式。一个典型示例pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowExt
30、(2000, -2000);pDC-SetWindowOrg(-1000, 1000);CRect rc;GetClientRect(rc);pDC-SetViewportOrg(0, 0);pDC-SetViewportExt(rc.Width(), rc.Height();/先设置映像模式,再设置窗口,最后设置视口通常将一个坐标原点保留为(0,0),另一个进行调整。效果(0,0)(800,600)(-1000,1000)(1000,1000)(-1000,-1000)(1000,-1000)4、设备和逻辑坐标转换CDC的成员函数void LPtoDP(LPPoint lpPoints,in
31、t nCount)void DPtoLP(LPPoint lpPoints,int nCount)void LPtoDP(LPRect lpRect);void DPtoLP(LPRect lpRect);鼠标点击命中测试等场合需进行坐标转换单击时得到设备坐标,需要转换为逻辑坐标,再使用CRect:PtInRect进行命中测试。5、 正弦曲线设置映射模式void CMyView:OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowExt(2000, -2000);pDC-SetWindowOrg(-1000, 1000);CRect rc;GetClientRect(rc);pDC-SetViewportOrg(0, 0);pDC-SetVi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高炉炼铁工质量管控考核试卷及答案
- 高炉炼铁工工艺考核试卷及答案
- 浴池服务员工艺创新考核试卷及答案
- 固体矿产钻探工适应性考核试卷及答案
- 压铸模具工新员工考核试卷及答案
- 课件文案简短
- 金属切割考试题及答案
- 社群健康助理员入职考核试卷及答案
- 飞机数字化装配工三级安全教育(车间级)考核试卷及答案
- 2025年中国T/R双弹单面华达呢数据监测研究报告
- 医疗法律法规知识培训
- 血友病课件完整版
- 神经系统的分级调节课件 【知识精讲+备课精研+高效课堂】 高二上学期生物人教版选择性必修1
- 三年级上册数学试卷-第一单元 混合运算 北师大版 (含答案)
- 临床职业素养
- 种子学-种子的化学成分课件
- 教学课件-英语学术论文写作(第二版)
- 手术室无菌技术 课件
- ISO 31000-2018 风险管理标准-中文版
- 六年级数学上册教案6:分数乘法:分数乘小数-人教版
- 小学综合实践六年级上册第1单元《考察探究》教材分析及全部教案
评论
0/150
提交评论