《大学VisualC案例教程.ppt》由会员分享,可在线阅读,更多相关《大学VisualC案例教程.ppt(36页珍藏版)》请在三一文库上搜索。
1、大学Visual C+案例教程,第三讲 图形设备接口和资源编程 西安交通大学 计算机教学实验中心 http:/,教学目标,Windows的图形设备接口 MFC的设备环境类和图形对象,授课内容,3.1 设备环境类和图形对象 3.2 库存图形对象 3.3 画笔与画刷 3.4 字体 3.5 绘图模式 3.6 GDI坐标系 3.7 WINDOWS应用程序资源 3.8 位图 3.9 菜单 3.10 图标、快捷键和字符串表 3.11工具条与状态条 3.12更新命令用户接口消息,3.1 设备环境类和图形对象,设备环境 图形设备接口,设备环境,在Windows程序中,应用程序的输出并不直接面向物理的设备,如显
2、示屏或打印机,而是针对一个称之为设备环境(Device Context)的逻辑设备进行操作,设备环境与实际设备之间的信息传送由Windows直接管理。,设备环境类,CDC类 CPaintDC CClientDC CWindowDC CMetaFileDC,图形对象类,CGdiObject类 CPen CBrush CFont CBitmap CPalette CRgn,3.2 库存图形对象,virtual CGdiObject* SelectStockObject( int nIndex ); nIndex指定要创建的图形对象 图形对象 说 明 BLACK_PEN 黑笔 NULL_PEN 空笔
3、,不画线或边框 WHITE_PEN 白笔 BLACK_BRUSH 黑色刷子 WHITE_BRUSH 白色刷子 DKGRAY_BRUSH 暗灰刷子 GRAY_BRUSH 灰色刷子 LTGRAY_BRUSH 淡灰色刷子 NULL_BRUSH 空刷子,内部不填充 ANSI_FIXED_FONT Windows固定倾角(单间隔)系统字体 ANSI_VAR_FONT Windows可变倾角(比例间隔)系统字体 DEFAULT_GUI_FONT 缺省GUI字体(如菜单和对话框字体) SYSTEM_FONT 系统字体 不必存储和恢复原来的图形对象,【例】 用鼠标切换椭圆的图形参数,修改文档类的定义(头文件)
4、,加入二个变量定义: class CMyDoc : public CDocument protected: / create from serialization only CMyDoc(); DECLARE_DYNCREATE(CMyDoc) / Attributes public: int m_nColor; CRect m_rectEllipse; / Operations public: (以下省略文档类的其它定义语句) ,【例】 用鼠标切换椭圆的图形参数(续1),修改文档类的OnNewDocument函数,对变量进行初始化: BOOL CMyDoc:OnNewDocument() i
5、f (!CDocument:OnNewDocument() return FALSE; / TODO: add reinitialization code here / (SDI documents will reuse this document) m_rectEllipse = CRect(100,100,300,250); m_nColor = 0; return TRUE; ,【例】 用鼠标切换椭圆的图形参数(续2),修改视图类的OnDraw函数,加入显示椭圆代码: void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument();
6、ASSERT_VALID(pDoc); / TODO: add draw code for native data here switch(pDoc-m_nColor) /根据颜色变量值决定用不同的画刷 case 0: pDC-SelectStockObject(GRAY_BRUSH);break; case 1: pDC-SelectStockObject(LTGRAY_BRUSH);break; case 2: pDC-SelectStockObject(BLACK_BRUSH);break; pDC-Ellipse(pDoc-m_rectEllipse); /画椭圆 ,【例】 用鼠标切换
7、椭圆的图形参数(续3),用ClassWizard建立鼠标左键的消息处理函数,并加入代码 void CMyView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(pDoc-m_rectEllipse.PtInRect(point) /判断鼠标是否点在椭圆内 pDoc-m_nColor = (pDoc-m_nColor+1)%3; /
8、修改颜色变量值 InvalidateRect(pDoc-m_rectEllipse); CView:OnLButtonDown(nFlags, point); ,3.3 画笔与画刷,画笔是用来画线的工具,是CPen类的对象 成员函数CreatePen()用于创建画笔,其原型为: BOOL CreatePen (int nPenStyle, int nWidth, COLORREF crColor); 第1个参数是画笔样式,可取: 画笔样式 说 明 PS_SOLID 创建实线笔 PS_DASH 创建由短线构成的虚线 PS_DOT 创建由点构成的虚线 PS_DASHDOT 创建由短线和点构成的虚线
9、 PS_DASHDOTDOT 创建由短线、点、点构成的虚线 PS_NULL 创建空(空白)画笔,CBrush类,画刷是用来填充图形的工具,是CBrush类的对象 创建画刷的成员函数的原型为: BOOL CreateSolidBrush ( COLORREF crColor ); BOOL CreateHatchBrush(int nIndex, COLORREF crColor ); 其中参数nIndex指定了阴影风格,可取值为: 阴影风格 说 明 HS_BDIAGONAL 从左下角到右上角的45度斜线 HS_CROSS 水平线与垂直线 HS_DIAGCROSS 相互垂直的45度线 HS_FD
10、IAGONAL 从左上角到右下角的45度斜线 HS_HORIZONTAL 水平线 HS_VERTICAL 垂直线,图形对象的使用,创建新的GDI对象 CreatePen(); CreateSolidBrush(); CreateHatchBrush (); 将GDI对象选入到DC中,保存原有GDI对象指针 pOld=pDC- SelectObject(); 绘图 恢复原有GDI对象 pDC- SelectObject(pOld);,CDC:SelectObject()函数原型,CPen* SelectObject( CPen* pPen ); CBrush* SelectObject( CBr
11、ush* pBrush ); virtual CFont* SelectObject( CFont* pFont );,【例】 用鼠标切换椭圆的图形参数(续),void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CBrush brushNew, *pbrushOld; CPen penNew, *ppenOld; switch(pDoc-m_nColor) /根据颜色变量值决定创建不同的画刷和画笔 ca
12、se 0: brushNew.CreateSolidBrush(RGB(255,0,0); penNew.CreatePen(PS_DASH, 1, RGB(0,0,0); break; case 1: brushNew.CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0); penNew.CreatePen(PS_SOLID, 1, RGB(255,0,0); break; case 2: brushNew.CreateSolidBrush(RGB(0,0,255); penNew.CreatePen(PS_SOLID, 3, RGB(0,255,0); br
13、eak; pbrushOld = pDC-SelectObject( / 恢复原来的画笔 ,3.4 字体,描述输出文字的字体可用CFont对象。CFont对象的使用方法与画笔、画刷类似 BOOL CreateFont( int nHeight, / 字符逻辑高度 int nWidth, / 字体逻辑宽度 int nEscapement, / 出口矢量与X轴的角度 int nOrientation, / 字符基线与X轴的角度 int nWeight, / 字体磅值 BYTE bItalic, / 非0则为斜体 BYTE bUnderline, / 非0则加下划线 BYTE cStrikeOut,
14、 / 非0则加删除线 BYTE nCharSet, / 此字体的字符集 BYTE nOutPrecision, / 输出精度 BYTE nClipPrecision, / 裁剪精度 BYTE nQuality, / 输出质量 BYTE nPitchAndFamily, / 调距和字体族 LPCTSTR lpszFacename ); / 字体的字型名,3.5 绘图模式,绘图模式由CDC的成员函数SetROP2( )设定,其原型为: int SetROP2 ( int nDrawMode ); 其中R2_NOT模式可保证所绘图形是可见的,即如果画笔色与背景色相同,则以与背景色相反的颜色作图。,3
15、.6 GDI坐标系,GDI支持两种类型的坐标系: 逻辑坐标系: 按坐标设置方式(又称为映射模式)可分为8种 最常用(也是缺省设置)的映射模式是MM_TEXT 设备坐标系 客户区坐标系统 屏幕坐标系统 窗口坐标系统。,3.7 Windows应用程序资源,资源:是一种数据,它包含了决定程序的用户界面的文本和图形。 资源所决定的界面元素有: 菜单 加速键 位图、光标、图标 对话框、控件 字符串 工具栏,资源脚本文件和资源头文件,资源文件 .rc 定义资源内容 资源通过资源标识符加以区别 资源头文件 Resource.h 定义一个项目中所有的资源标识符,3.8 位图,向项目中添加资源: Develop
16、er Studio的Insert/Resource菜单选项 载入位图资源:使用 CBitmap类的成员函数 BOOL LoadBitmap( LPCTSTR lpszResourceName ); BOOL LoadBitmap( UINT nIDResource ); 建立一合适的内存设备环境并将位图选入该设备环境: CDC MemDC; MemDC. CreateCompatibleDC(NULL); MemDC.SelectObject( 从内存设备环境中将位图复制到指定设备: 使用 CDC: BitBlt 使用 CDC: StretchBlt,【例】 显示一张位图文件(.BMP),修改
17、视图类的定义(头文件),加入3个变量定义: / MyView.h : interface of the CMyView class class CMyView : public CView / 定义CBitmap类对象以及位图的高度和宽度变量 CBitmap m_Bitmap; int m_nHeight; int m_nWidth; protected: / create from serialization only CMyView(); DECLARE_DYNCREATE(CMyView) (以下省略其它定义语句) ;,【例】 显示一张位图文件(.BMP)(续1),修改视图类的构造函数:
18、 / CMyView construction/destruction CMyView:CMyView() / TODO: add construction code here / 载入位图资源,读位图信息 m_Bitmap.LoadBitmap(IDB_BITMAP1); BITMAP BM; m_Bitmap.GetBitmap( ,例12-3 显示一张位图文件(.BMP)(续2),修改视图类的OnDraw函数,显示位图: void CMyView:OnDraw(CDC* pDC) CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TO
19、DO: add draw code for native data here / 显示位图 CDC MemDC; MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject( ,CDC:BitBlt,BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop ); x, y用于指定目标矩形区域的左上角坐标 nWidth, nHeight为目标区域的宽度和高度 pSrcDC是指向源设备对象的指针 xSrc, ySrc源位图
20、的左上角坐标 dwRop决定了位图的显示方式,CDC:StretchBlt,实现图像缩放输出 BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );,3.9 菜单,编辑菜单资源:使用菜单编辑器(注意ID) Separator表示分隔线 Popup选项可引出一子菜单 为每个菜单选项添加WM_COMMAND消息映射和对应的消息处理函数 ON_COMMAND ( id, memberFxn
21、 ),3.10 图标、快捷键和字符串表,这些资源数据都可通过资源编辑器创建或编辑,3.11 工具条与状态条,在MFC中,通过CToolBar类和CStatusBar类控制工具条和状态条。,3.12 更新命令用户接口消息,UPDATE_COMMAND_UI就是更新命令用户接口消息,专门用于处理菜单项和工具条钮的更新。,编程与调试:向项目中添加资源,使用Developer Studio的菜单选项Insert/Resource调出Insert Resource对话框 选择相应的资源如Bitmap、Icon和Menu等 按下New按钮进入相应的资源编辑器,编程与调试:资源编辑器,图标编辑器 位图编辑器 菜单编辑器 快捷键编辑器 字符串表编辑器,基本范例,例3-1 编一程序,允许用鼠标左键拖动一个椭圆在客户区内移动 例3-2 显示一张位图文件(并能够通过菜单选择缩小显示、正常显示和放大显示)。,学好程序设计语言的唯一途径是 你的编程能力与你在计算机上投入的时间成,结 束 语,上机练习,正比,
链接地址:https://www.31doc.com/p-3107777.html