版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、图形与图像编程基础,本章主要学习内容: 图形处理的基本原理: 图形设备接口 设备环境 GDI坐标系 映射模式 使用画笔和画刷绘制图形 文本与字体 位图、图标和光标,6.3 绘制基本图形,Windows中的基本图形包括点、直线、圆、圆弧、矩形、椭圆等。MFC把绘制这些图形的函数封装在CDC类中。 绘图通常编写C*View类的OnDraw(CDC *pDC)函数,其中参数pDC指当前设备环境指针。,补充:橡皮筋技术(利用SetROP2函数),先了解SetROP2函数的两个参数R2_NOT与R2_NOTXORPEN的使用效果,以下为该两种绘画模式举例: R2_NOTXORPEN绘画模式你用红色画笔在
2、黑色背景上画一条直线,显示红色,但你再用这只笔在刚画的直线上重画一遍,就相当于把开始画的红线擦除掉了,划线的地方显示为背景色。 R2_NOT绘画模式同样有在同一个地方画两次相当于什么都没画的功能,不过R2_NOT绘画模式第一次画的时候显示颜色并不是你选定的画笔颜色,而是默认的颜色。,颜色,一个彩色象素的显示需要颜色空间的支持,常用的颜色空间有RGB。RGB颜色空间选用红(R)、绿(G)、蓝(B)三种基色分量,通过对这三种基色不同比例的混合,可以得到不同的彩色效果。 在MFC中,CDC使用的是RGB颜色空间,其中,COLORREF是用来表示RGB颜色的一个32位的数据类型。它可以用下列的十六进制
3、表示一个RGB值:0 x00bbggrr,其中bb、gg、rr分别表示蓝、绿、红3个颜色分量的十六进制值。,颜色,在具体操作RGB颜色时,可使用下列的宏操作: GetBValue、GetGValue、GetRValue来获得其中各个颜色分量值。 如:int nRed=GetBValue(color); RGB可以将指定的三个分量值转换成一个32位的RGB颜色值。 如: COLORREF color=RGB(nRed,nGreen,nBlue);,颜色和颜色对话框,MFC的CColorDialog类为应用程序提供了颜色选择通用对话框,构造函数如下: CColorDialog(COLORREF c
4、lrInit=0,DWORD dwFlags=0,CWnd * pParentWnd=NULL); 其中,clrInit指定选择的默认颜色值,默认为RGB(0,0,0)黑色。pParentWnd指定对话框的父窗口指针。dwFlags指定对话框外观和功能(见教材P209)。 当对话框单击OK退出时,可调用下列成员函数获得相应的颜色。 COLORREF GetColor() const; void SetCurrentColor(COLORREF clr); static COLORREF * GetSavedCustomColors(),输出文本与画点,/设置文本的前景色 pDC-SetText
5、Color(RGB(255,0,255); /输出文本 pDC-TextOut(20,20,Point); /以不同的颜色画点 pDC-SetPixel(100,20,RGB(255,0,0); pDC-SetPixel(110,20,RGB(0,255,0); pDC-SetPixel(120,20,RGB(0,0,255);,画直线、矩形与椭圆,/画直线 pDC-MoveTo(20,90); pDC-LineTo(160,90); pDC-LineTo(130,80); /直角矩形 pDC-Rectangle(190,270,250,310); /圆角矩形 pDC-RoundRect(26
6、5,270,330,310,30,20); /椭圆 pDC-Ellipse(200,160,280,200);,6.4 画笔和画刷,6.4.1 画笔 6.4.2 画刷 6.4.3 画笔和画刷的应用程序举例,6.4.1 画笔,一个画笔通常具有宽度、样式和颜色三种属性。画笔的宽度用来确定所画的线条宽度,它是用设备单位表示的。默认的画笔宽度是一个像素单位。画笔的颜色确定了所画的线条颜色。画笔的样式确定了所绘图形的线型,它通常有实线(PS_SOLID)、虚线(PS_DASH)、点线(PS_DOT)、点划线(PS_DASHDOT)、双点划线(PS_DASHDOTDOT)、不可见线(PS_NULL)和内框
7、线(PS_INSIDEFRAME)等七种样式。,1. 创建画笔,CPen类封装图形设备接口GDI画笔对象的功能。创建画笔可以采用以下几种方法: (1)使用无参构造函数声明对象,之后调用成员函数CreatePen()创建具体的画笔。 BOOL CreatePen(int nPenStyle, int nWidth, COLORREF crColor); 其中nPenStyle表示画笔的样式。nWidth表示画笔的线宽。crColor表示画笔的RGB颜色。 例如: CPen Pen; Pen.CreatePen(PS_SOLID,1,RGB(255,0,0); /调用成员函数,创建线宽为1的红色实
8、线画笔,1. 创建画笔,(2) 使用构造函数创建画笔 CPen(int nPenStyle,int nWidth,COLORREF cfColor) 例如: CPen Pen(PS_SOLID,1,RGB(255,0,0); / 调用构造函数,创建线宽为1的红色实线画笔,2. 库存画笔,库存画笔又叫堆画笔。Windows定义了三种库存画笔,程序员可以直接使用这些画笔,而不用创建对象。三种库存画笔分别是: BLANK_PEN:黑色画笔;WHILE_PEN:白色画笔; NULL_PEN:空画笔。 可以使用CPen:CreatestockObject()函数进行创建。 CPen Pen; Pen.C
9、reatestockObject(WHILE_PEN); 可以以库存画笔为参数来调用SelectStockObject()函数,此函数选定放入当前设备环境的新对象,并返回一个指向被替换对象的指针, CPen *pOldPen=pDC-SelectStockObject(BLANK_PEN);,3. 画笔的使用方法,(1) 创建画笔; (2) 使用新的画笔,保存原来的画笔以便恢复; CPen *pOldPen; pOldPen=pDC-selectObject( 保存并恢复原来画笔的原因是每个图形设备接口对象要占用一个HDC句柄,而可用的句柄数量有限,如果用完后未及时释放,积累下去将导致严重的运
10、行错误。,例:画笔的使用,CPen *pNewPen=new CPen; if(pNewPen-CreatePen(PS_DASHDOT,3,RGB(255,0,0) CPen *pOldPen=pDC-SelectObject(pNewPen); /用新创建的画笔绘图 pDC-MoveTo(10,10); pDC-LineTo(150,10); /恢复设备描述表中原有的笔 pDC-SelectObject(pOldPen); else MessageBox(CreatePen ERROR!); delete pNewPen;,例:堆画笔的使用,CPen *pOldPen=(CPen *)pD
11、C-SelectStockObject(BLACK_PEN); pDC-MoveTo(10,20); pDC-LineTo(200,20); pDC-LineTo(200,40); pDC-LineTo(10,40); pDC-LineTo(10,20); /恢复设备描述表中原有的笔 pDC-SelectObject(pOldPen);,6.4.2 画刷,画刷是用来填充图形的工具。 画刷的属性通常包括填充色、填充图案和填充样式三种。画刷的填充色和画笔颜色一样,都是使用COLORREF颜色类型;画刷的填充图案通常是用户定义的8 x 8位图;而填充样式往往是CDC内部定义的一些特性,它们都是以HS
12、_为前缀的标识,如图所示:,6.4.2 画刷,MFC把GDI画刷封装在CRush类中。画刷的使用方法同画笔。画刷分为纯色画刷、阴影画刷、堆画刷和图案画刷。CBrush类为不同的画刷类型提供了不同的构造函数。 Windows定义的堆画刷共有7种,分别是: BLACK_BRUSH:黑色画刷; DKGRAY_BRUSH:深灰色画刷; GRAY_BRUSH:灰色画刷; HOLLOW_BRUSH:空画刷; LTGRAY_BRUSH:浅灰色画刷; NULL_BRUSH:空画刷; WHITE_BRUSH:白色画刷;,6.4.2 画刷,对堆画刷,调用SelectStockObject()函数进行选择画刷, 例
13、如: CBrush * pOldBrush=pDC- SelectStockObject(WHITE_BRUSH); / 选择白色堆画刷,创建CBrush对象的四个构造函数为:,(1) CBrush(); / 使用前必须初始化画刷 (2) CBrush (COLORREF cfColor); / 构造带有指定颜色的纯色画刷 例如: CBrush Brush(RGB(255,0,0); / 创建红色画刷 (3) CBrush(int nIndex, COLORREF cfColor); / 构造带有指定阴影风格和颜色的填充画刷 nIndex指定的阴影风格,如表6.4所示。 (4) CBrush(
14、CBitmap*pBitmap); / 构造使用位图图案的画刷 CBitmap对象最大可使用88像素,若位图过大,则只有左上角的部分可以用作画刷图案。,创建画刷的其他成员函数,还可在创建画刷对象后,调用以下的CBrush类的成员函数来创建不同的画刷: CreateSolidBrush():创建纯色画刷 CreateHatchBrush():创建阴影画刷 CreatePatternBrush():创建图案画刷 如: CBrush Brush;COLORREF c; c=RGB(255,255,0); Brush. CreateHatchBrush(HS_DIAGCROSS, c);,例:画刷的使
15、用,CBrush *pNewBrush=new CBrush; pNewBrush-CreateSolidBrush(RGB(180,70,230); CBrush * pOldBrush=pDC-SelectObject(pNewBrush); /选择新画刷 pDC-Rectangle(10,60,200,100); /绘制矩形 pDC-SelectObject(pOldBrush); /恢复设备描述表中原有的画刷 delete pNewBrush; /删除新画刷,例:画刷的使用,CBrush *pNewBrush=new CBrush; pNewBrush-CreateSolidBrush
16、(RGB(180,70,230) CBrush * pOldBrush=pDC-SelectObject(pNewBrush); /选择新画刷 pDC-Rectangle(10,60,200,100); /绘制矩形 pDC-SelectObject(pOldBrush); /恢复设备描述表中原有的画刷 delete pNewBrush; /删除新画刷,6.5 字体,字体定义显示文本的符号和字符,通过处理字体可以显示某种特殊效果的文字,描述输出文字的字体可用CFont对象。CFont对象的使用方法与画笔和画刷类似, 定义字体对象, 创建字体并保存原来的字体, 在文字输出工作结束后恢复原来的字体。
17、,字体的属性,字体的主要属性有字样、风格和尺寸。字样是字符书写和显示时表现的特定模式,如宋体、楷体等多种字样。字体风格主要表现为字体的粗细和是否倾斜等特点。字体是用来指定字体所占区域的大小,通常用字符高度来描述。,1字体的创建(1),(1)为了方便用户创建字体,系统定义一种逻辑字体,根据定义的逻辑字体,可调用CFont类的CreateFontIndirect函数来创建字体。 LOGFONT lf;CFont cf; memset(,typedef struct tagLOGFONT LONG lfHeight; / 字体的逻辑高度 LONG lfWidth; / 字符的平均逻辑宽度 LONG
18、lfEscapement; / 倾角 LONG lfOrientation; / 书写方向 LONG lfWeight; / 字体的粗细程度 BYTE lfItalic; / 斜体标志 BYTE lfUnderline; / 下划线标志 BYTE lfStrikeOut; / 删除线标志 BYTE lfCharSet; / 字符集,汉字必须为GB2312_CHARSET TCHAR lfFaceNameLF_FACESIZE / 字样名称 / LOGFONT;,1字体的创建(2),当需要某一特定的字体时,可以使用MFC的CFont类的CreateFont()成员函数来创建字体,若该函数调用成功
19、,则返回非0值,否则返回0。 其函数原型如下: BOOL CFont:CreateFont( int nHeight, / 字符逻辑高度 int nWidth, / 字符逻辑宽度 int nEscapement, / 出口矢量与X轴的角度 int nOrientation, / 字符基线与X轴的角度 int nWeight, / 字体磅值 BYTE bItalic, / 非0则为斜体,BYTE bUnderline, / 非0则加下划线 BYTE cStrickOut, / 非0则加删除线 BYTE nCharSet, / 此字体的字符集 BYTE nClipPrecision, / 裁剪精度
20、 BYTE nQualty, / 输出质量 BYTE nPitAndFamity, / 调距和字体族 LPCSTR lpszFacename;/ 字体的字符名 ); CreateFont()成员函数并不能产生新的Windows GDI字体,它只是从GDI字库中选择一种最近似的可用字体。,1字体的创建(2),字体和字体对话框,CFontDialog类提供了字体及其文本颜色选择的通用对话框,表10.24列出常用的成员函数。 LOGFONT f; CFont cf; CFontDialog d; if(d.DoModal()=IDOK) d.GetCurrentFont( ,2 绘制文本常用文本输出
21、函数,文本的最终输出不仅依赖于文本的字体,而且还跟文本的颜色、对齐方式等有很大关系。CDC类提供了4个输出文本的函数。,(1)显示文本TextOut ()函数 TextOut ()函数是用当前字体在指定位置 (x,y) 处显示一个文本。 virtual BOOL TextOut(int x,int y,LPCTSTR lpszString int nCount); BOOL TextOut(int x,int y,const CString ,常用文本输出函数,(2) 根据制表位,设置字符输出相应位置 TabbedTextOut也是用当前字体在指定位置处显示一个文本,但它还根据指定的制表位(T
22、ab)设置相应字符位置,函数成功时返回输出文本的大小。 virtual CSize TabbedTextOut(int x,int y,LPCTSTR lpszString int nCount,int nTabPositions,LPINT lpnTabStopPostions,int nTabOrigin); CSize TabbedTextOut(int x,int y,const CString ,常用文本输出函数,(3) DrawText函数是当前字体在指定矩形中对文本进行格式化绘制。 virtual int DrawText( LPCTSTR lpszString, int nCo
23、unt, LPRECT lpRect, UINT nFormat ); int DrawText( const CString nFormat表示文本的格式,如下表所示,可以是其中的常用值之一或|组合。,DrawText函数中nFormat的值,常用文本输出示例,(10,10),(200,140),200,20,停止位为40个单位,停止位为80个单位,停止位为默认值,在C*View类的OnDraw(CDC *pDC)函数中添加绘图代码:,CRect rc(10, 10, 200, 140); pDC-Rectangle( rc ); pDC-DrawText( 单行文本居中, rc, DT_C
24、ENTER | DT_VCENTER | DT_SINGLELINE);,在C*View类的OnDraw(CDC *pDC)函数中添加绘图代码:,rc.OffsetRect( 200, 0 );/ 将矩形向右偏移200 pDC-Rectangle( rc ); int nTab = 40; /将Tab位的值指定为40个逻辑单位 pDC-TabbedTextOut( rc.left, rc.top, 绘制tTabt文本t示例, 1, / 使用默认的停止位,文本格式化属性,文本的格式属性通常包括文本颜色、对齐方式、字符间隔以及文本调整等。在绘图设备环境中,默认的文本颜色是黑色,而文本背景色为白色,
25、 在CDC类中,SetTextColor、SetBkColor和SetBkMode函数就是分别用来设置文本颜色、文本背景色和背景模式,而与之相对应的GetTextColor、GetBkcolor和GetBkMode函数则是分别获取这三项属性的。 SetTextAlign、GetTextAlign函数是设置和获取文本对齐方式(文本的对齐方式如P221表7.5所示)。,文本格式化属性,virtual COLORREF SetTextColor( COLORREF crColor ); COLORREF GetTextColor( ) const; virtual COLORREF SetBkColor( COLORREF crColor ); COLORREF GetBkColor( ) const; int SetBkMode( int nBkMode ); int GetBkMode( ) const; UINT SetTextAlign(UINT nFlags); UINT GetTextAlign() const;,3字体的应用举例,【例6.3】字体的应用程序举例。,代码(C*View:OnDraw(),/默认的字体 pDC-TextOut(10,10,默认的字体); /设置字体颜色 pDC-SetTextColor(RG
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采购需要先付款报销制度
- 采购领域规范管理制度
- 采购验收项目管理制度
- 金徽酒采购制度
- 食品采购管理制度
- 七年级下学期第一次月考易错题复习(13个考点36题)(学生版)-人教版(2024)七下
- 2026年借钱买房合同(1篇)
- 2026年门定购合同(1篇)
- 《数学广角-数与形》教学设计
- 软件服务合同(15篇)
- 某铝合金窗热工性能计算书
- 级自制书119本13黑今天穿什么
- 安全文明专项施工方案
- 01厨房组织人员管理篇
- 冀教版八年级生物下册昆虫的生殖和发育同步练习(含答案)
- GB/T 11337-2004平面度误差检测
- 2022年德清县文化旅游发展集团有限公司招聘笔试试题及答案解析
- 泌尿生殖系统的解剖与生理资料课件
- 芪苈强心-课件
- 江苏省中等专业学校毕业生登记表
- 合格供应商评估表格
评论
0/150
提交评论