教案2007 ~2008 学年第一学期主讲教师课程名称面向对象程序设计(VC++)课程类别专业基础课学时及学分80、4授课班级使用教材 VC++的使用及面向对象软件工程实例分析系(院、部)教研室(实验室)计算机应用教研室课时授课计划课次序号:一、课题: ch5 单文档程序编程(1)字体与绘图二、课型:讲授三、目的要求:1、理解设备环境类CDC及其派生类的功能与使用方法。
2、理解图形设备接口GDI类的功能及使用方法。
3、学会字体设置和文本输出。
4、学会简单的图形绘制方法。
四、重点、难点:重点容:字体设置与文本输出、图形绘制。
难点:正确理解CDC类和GDI类的功能与使用方法。
五、教学方法及手段:采用案例教学,在实例中理解CDC类和GDI类的使用,重点讲解其中的几个功能,其他的要求学生课下逐步深入学习,达到举一反三的目的。
六、参考资料:《VC++实用教程》(第二版)阿奇编著,电子工业第8章《C++面向对象程序设计》涛编著,高等教育,第10章七、作业:简答:习题5.1 , 5.2 , 5.6设计:(1) 5.9(2)单文档实验容1:编写单文档应用程序,当用户双击鼠标左键时,能在客户区画一个椭圆,并用45度交叉线填充。
八、授课记录:九、授课效果分析:十、教学进程(教学容、教学环节及时间分配等)1、复习单文档应用程序的特点:应用程序类、主框架类、文档类、视图类文档与视图的关系2、导入课题如何再单文档窗口中按照需要输出文本、绘制图形呢?利用CDC类和GDI接口类,它封装了绘图所需要的所有函数,是用户编写图形和文字处理程序必不可少的。
3、教学容ch5.1 概述一、设备环境类:1、CDC类:设备环境是Windows保存的一个数据结构,该结构包含应用程序向设备输出时所需要的信息,例如图形是在屏幕上输出还是在打印机上输出。
为了让用户使用一些特殊的设备环境,MFC还提供了CDC类的派生类,CPaintDC、CClientDC、CwindowDC、 CmetaFileDC其中,前两个较常用。
2、CDC类的主要功能:SelectObject():选择绘图对象,返回被替代的对象的指针,常用于选择画笔、画刷、字体、图片等。
MoveTo():移动当前位置LineTo():从当前位置画线Ellipse():画椭圆TextOut():用当前字体在指定位置输出文本二、颜色和颜色对话框的使用绘图和显示文本时都要按照指定的(或默认的)颜色执行。
常用的颜色空间右RGB和YUV两种。
其中,RGB颜色空间选用红、绿、蓝三种颜色的分量配比来表示,即三基色原理。
而YUV颜色空间用亮度(Y)和色差(V、U)表示。
在MFC中采用RGB颜色空间。
编程设置颜色的方法有两种:方法一、通过程序代码直接设置,比如可以将颜色表示为:RGB(int r,int g,int b); 或 COLORREF clr;方法二、利用MFC的颜色对话框选择设置:MFC的CColorDialog类提供了颜色选择通用对话框,供用户选择颜色。
具体用法: CColorDialog dlg;If(dlg.DoModal==IDOK)COLORREF myColor=dlg.GetColor();颜色对话框举例:在单文档视图中用选定的颜色输出一句话“这是我自己选的颜色!”。
实现:在单文档程序的视图类的OnDraw()中添加如下代码:void CEx_colordlgView::OnDraw(CDC* pDC){ CEx_colordlgDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCOLORREF myColor;CColorDialog dlg;if(dlg.DoModal()==IDOK)myColor=dlg.GetColor();pDC->SetTextColor(myColor); //设置文本的颜色值pDC->TextOut(20,50," 这是我自己选的颜色!");}若改用RGB()直接设置:COLORREF myColor =RGB(0,0,250);则文字以蓝色显示。
三、通用对话框使用说明:MFC提供了许多通用对话框类,比如颜色设置对话框、字体设置对话框(CFontDialog)、查找替换对话框(CFindReplaceDialog)、打印对话框(CPrintDialog)、页面设置对话框(CPageSetupDialog)、文件对话框(CfileDialog,打开或保存文件)。
[它们的使用方法类似,课下尝试练习]ch5.2 字体一、字体的结构与字体类:1、字体结构中包含了字体的属性,比如高度、宽度、相对页面的角度、重量(如粗体)、斜体、下划线、删除线、字符集、字体名称等。
详见教材P174结构体LOGFONT的定义。
[熟悉或了解即可]2、字体类:Cfont3、字体对象的使用步骤:[同GDI对象,包括定义字体对象、创建字体对象、选入设备环境、使用、删除、恢复等]二、创建字体对象的方法:1、在程序中设定字体的各个属性值,利用CreateFont(); 创建字体对象。
比如,5.1.3示例 P182~183 [要求:了解使用方法]2、调用字体设置对话框类取的用户选择的字体,保存在LOGFONT类型的变量中,然后调用CreateFontIndirect(const LOGFONT *lpLF);创建字体对象。
3、CreatePointFont(); //简单方法,只能设定字体大小三、字体应用:功能:在单文档程序的客户区双击鼠标,在鼠标指定位置按照设定的字体显示一句话“字体随意设,简单吧!”。
其中,字体设置功能是通过在主菜单中添加一个菜单项“字体设置”,单击该菜单项,打开字体设置对话框,共用户设置字体、字号等属性。
单击确定后新的字体有效。
实现方法:(1)创建单文档应用程序ex_font(2)在视图类中添加变量:LOGFONT m_lfText;int m_xPos, m_yPos; //表示当前鼠标点击的坐标(3)添加菜单项:在资源视图中打开Menu 资源中的IDR_MAINFRAME,在最后的空白项上右击,添加一个新菜单项的名称、ID号(ID_FONT_TEST)。
(4)在类向导中为新的菜单项添加COMMAND命令映射函数:OnFontTest() void CEx_fontView::OnFontTest(){ // TODO: Add your command handler code hereCFontDialog dlg;if(dlg.DoModal()==IDOK)dlg.GetCurrentFont(&m_lfText); //获取当前选择的字体对象}}(5)在类向导中添加视图类双击鼠标的WM_LBUTTONDBLCLK消息映射函数:void CEx_fontView::OnLButtonDblClk(UINT nFlags, CPoint point){ // TODO: Add your message handler code here and/or call defaultm_xPos=point.x;m_yPos=point.y;Invalidate(); //调用OnDraw()重画窗口CView::OnLButtonDblClk(nFlags, point);}(6)在视图类的OnDraw()中添加代码:CFont cf; //定义字体对象cf.CreateFontIndirect(&m_lfText); //创建字体CFont * oldFont=pDC->SelectObject(&cf); //选定字体到当前设备环境pDC->TextOut(m_xPos,m_yPos," 字体随意设,简单吧!"); //输出文本cf.DeleteObject(); //删除字体对象pDC->SelectObject(oldFont); //恢复原来的字体(7)运行:单及“字体设置”,设置字体,然后双击客户区。
反复进行。
小结:字体的使用方法(定义字体对象、创建字体对象、选入设备环境、使用、删除、恢复等),结合实例理解并熟练掌握。
ch5.3 简单图形绘制Windows系统为应用程序的绘图操作提供了一个图形设备接口,用于处理来自应用程序的图形函数调用。
一、图像设备接口GDIMFC将各种绘图工具(如画笔、画刷、字体等)封装成GDI类,比如:CPen CBrush CFont CBitmap Cpalette CRgn二、使用GDI对象绘图的步骤:(1)定义一个GDI对象,比如:CPen m_pen;(2)调用该对象的成员函数创建对象,比如:m_pen.CreatePen(PS_SOLID,2,RGB(0,0,0)); //创建画笔(3)将该对象选入当前设备环境中,同时注意保存原来GDI对象。
比如:CPen * pOldPen=pDC->SelectObject(&m_pen);(4)绘图结束后,恢复当前设备环境中原来的GDI对象。
比如:pDC->SelectObject(pOldPen);三、画笔的创建:CPen::CreatePen(int nPenStyle, int nWidth, COLORREF crColor)参数1:画笔的风格,如实线、虚线、点线等。
参数2:线宽参数3:颜色四、画刷的创建1、//创建固定颜色的画刷BOOL CBrush::CreateSolidBrush(COLORREF crColor);2、创建指定颜色和风格的画刷BOOL CBrush:: CreateHatchBrush(int nIndex,COLORREF crColor);// nIndex指定画刷的风格,如HS_VERTICAL为垂直阴影线3、创建以8*8位图为模板的画刷BOOL Cbrush::CreatePatternBrush(Cbitmap * pBitmap);五、应用GDI实现简单的绘图:功能要求:在单文档程序主菜单中添加“画刷”、“画笔”两个菜单项,当单击“画刷”时,在客户区画一个椭圆(垂直阴影线填充);当单击“画笔”时,在客户区画实线。
实现过程:(1)创建单文档程序ex_pen_brush(2)在资源视图中为IDR_MAINFRAME主菜单资源添加菜单项(名称、ID:ID_PEN、ID_BRUSH)(3)在视图类中添加一个用于识别“画笔”和“画刷”菜单项的变量:enum {PEN,BRUSH}m_GdiType;(4)在视图类中添加两个菜单项的命令函数:void CEx_pen_brushView::OnBrush(){ m_GdiType=BRUSH; Invalidate(); }void CEx_pen_brushView::OnPen(){ m_GdiType=PEN; Invalidate();}(5)在OnDraw()函数中添加绘图代码:CPen newPen,*pOldPen; //定义画笔对象switch(m_GdiType){case PEN:newPen.CreatePen(PS_SOLID,2,RGB(0,0,255)); //创建画笔pOldPen=pDC->SelectObject(&newPen);pDC->MoveTo(20,20);pDC->LineTo(300,20);pDC->SelectObject(pOldPen); //恢复系统画笔break;case BRUSH:CBrush newBrush, *pOldBrush;newBrush.CreateHatchBrush(HS_VERTICAL,RGB(0,255,255));pOldBrush=pDC->SelectObject(&newBrush);pDC->Ellipse(40,40,300,300);pDC->SelectObject(pOldBrush);}(6)运行。