330 likes | 498 Views
Visual C++ 与面向对象程序设计教程. 第 12 章 图形设备接口和资源 计算机教学实验中心 西安交通大学. 教学目标. Windows 的图形设备接口 MFC 的设备环境类和图形对象 资源的概念和编程方法. 学习要求. 了解 图形设备接口和资源的基本概念 掌握 掌握画笔、画刷、位图以及菜单等对象和资源的用途和编程方法 学会 简单的动画编程和 Developer Studio 的各种资源编辑器的使用方法. 授 课 内 容. 12.1 设备环境类和图形对象 12.2 Windows 应用程序资源 12.3 库存图形对象
E N D
Visual C++与面向对象程序设计教程 第12章 图形设备接口和资源 计算机教学实验中心 西安交通大学
教学目标 • Windows的图形设备接口 • MFC的设备环境类和图形对象 • 资源的概念和编程方法
学习要求 • 了解 • 图形设备接口和资源的基本概念 • 掌握 • 掌握画笔、画刷、位图以及菜单等对象和资源的用途和编程方法 • 学会 • 简单的动画编程和Developer Studio的各种资源编辑器的使用方法
授 课 内 容 • 12.1 设备环境类和图形对象 • 12.2 Windows应用程序资源 • 12.3 库存图形对象 • 12.4 画笔与画刷 • 12.5 位图 • 12.6 菜单 • 调试技术 • 程序设计举例
MFC应用程序在硬件上绘图的抽象层次 应用程序 MFC设备环境类 图形设备接口(GDI) 设备驱动程序 物理设备硬件 12.1 设备环境类和图形对象 • 设备环境 • 图形设备接口
设备环境 • 在Windows程序中,应用程序的输出并不直接面向物理的设备,如显示屏或打印机,而是针对一个称之为设备环境(Device Context)的逻辑设备进行操作,设备环境与实际设备之间的信息传送由Windows直接管理。
设备环境类 • CDC类 • CPaintDC • CClientDC • CWindowDC • CMetaFileDC
图形对象类 • CGdiObject类 • CPen • CBrush • Cfont • Cbitmap • Cpalette • CRgn
12.2 Windows应用程序资源 • 资源:是一种数据,它包含了决定程序的用户界面的文本和图形。 • 资源所决定的界面元素有: • 菜单 • 加速键 • 位图、光标、图标 • 对话框、控件 • 字符串 • 工具栏
资源脚本文件和资源头文件 • 资源文件 • .rc • 定义资源内容 • 资源通过资源标识符加以区别 • 资源头文件 • Resource.h • 定义一个项目中所有的资源标识符
12.3 库存图形对象 • CGdiObject Class Members CGdiObject::CreateStockObject BOOL CreateStockObject( int nIndex ); Return Value Nonzero if the function is successful; otherwise 0. • 掌握SelectStockObject()方法 • 不必存储和恢复原来的图形对象
例12-1 用鼠标切换椭圆的图形参数 修改文档类的定义(头文件),加入二个变量定义: class CMyDoc : public CDocument { protected: // create from serialization only CMyDoc(); DECLARE_DYNCREATE(CMyDoc) // Attributes public: int m_nColor; CRect m_rectEllipse; // Operations public: …(以下省略文档类的其它定义语句) }
例12-1 用鼠标切换椭圆的图形参数(续1) 修改文档类的OnNewDocument函数,对变量进行初始化: BOOL CMyDoc::OnNewDocument() { if (!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; }
例12-1 用鼠标切换椭圆的图形参数(续2) 修改视图类的OnDraw函数,加入显示椭圆代码: void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); 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); //画椭圆 }
用ClassWizard建立鼠标左键的消息处理函数,并加入代码用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; //修改颜色变量值 InvalidateRect(pDoc->m_rectEllipse); } CView::OnLButtonDown(nFlags, point); } 例12-1 用鼠标切换椭圆的图形参数(续3)
12.4 画笔与画刷 CPen类: 成员函数CreatePen()用于创建画笔,其原型为: BOOL CreatePen (int nPenStyle, int nWidth, COLORREF crColor); 第1个参数是画笔样式,可取 画笔样式 说明 PS_SOLID 创建实线笔 PS_DASH 创建由短线构成的虚线 PS_DOT 创建由点构成的虚线 PS_DASHDOT 创建由短线和点构成的虚线 PS_DASHDOTDOT 创建由短线、点、点构成的虚线 PS_NULL 创建空(空白)画笔
CBrush类 创建画刷的成员函数的原型为: BOOL CreateSolidBrush ( COLORREF crColor ); BOOL CreateHatchBrush ( int nIndex, COLORREF crColor ); 其中参数nIndex指定了阴影风格,可取值为: 阴影风格 说明 HS_BDIAGONAL 从左下角到右上角的45度斜线 HS_CROSS 水平线与垂直线 HS_DIAGCROSS 相互垂直的45度线 HS_FDIAGONAL 从左上角到右下角的45度斜线 HS_HORIZONTAL 水平线 HS_VERTICAL 垂直线
CDC::SelectObject()函数原型 • CPen* SelectObject( CPen* pPen ); • CBrush* SelectObject( CBrush* pBrush ); • virtual CFont* SelectObject( CFont* pFont );
例12-2 彩色折线图 • 创建一个CPen的图形对象显示折线颜色 • 调用CPen类的成员函数DeleteObject() 将画笔从设备环境中删除 • 调用CreatePen()成员函数创建一个新颜色的画笔 • 选入设备环境中,再用新的颜色画线
12.5 位图 • 向项目中添加资源: Developer Studio的Insert/Resource…菜单选项 • 载入位图资源:使用 CBitmap类的成员函数 BOOL LoadBitmap( LPCTSTR lpszResourceName ); BOOL LoadBitmap( UINT nIDResource ); • 建立一合适的内存设备环境并将位图选入该设备环境: CDC MemDC; MemDC. CreateCompatibleDC(NULL); MemDC.SelectObject(&m_Bitmap); • 从内存设备环境中将位图复制到指定设备: 使用 CDC:: BitBlt 使用 CDC:: StretchBlt
例12-3 显示一张位图文件(.BMP) 修改视图类的定义(头文件),加入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) …(以下省略其它定义语句) };
例12-3 显示一张位图文件(.BMP)(续1) 修改视图类的构造函数: // CMyView construction/destruction CMyView::CMyView() { // TODO: add construction code here // 载入位图资源,读位图信息 m_Bitmap.LoadBitmap(IDB_BITMAP1); BITMAP BM; m_Bitmap.GetBitmap(&BM); m_nWidth = BM.bmWidth; m_nHeight = BM.bmHeight; }
例12-3 显示一张位图文件(.BMP)(续2) 修改视图类的OnDraw函数,显示位图: // CMyView drawing // 响应绘制窗口客户区消息 void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here // 显示位图 CDC MemDC; MemDC.CreateCompatibleDC(NULL); MemDC.SelectObject(&m_Bitmap); pDC->BitBlt(0,0,m_nWidth,m_nHeight,&MemDC,0,0,SRCCOPY); }
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源位图的左上角坐标 • 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 );
12.6 菜单 • 编辑菜单资源:使用菜单编辑器 • Separator表示分隔线 • Popup选项可引出一子菜单。 • 载入菜单资源:在CWnd类PreCreateWindow()中进行 virtual BOOL PreCreateWindow( CREATESTRUCT& cs ); cs.hMenu = LoadMenu(NULL, MAKEINTRESOURCE( IDR_MAINMENU)); • 为每个菜单选项添加WM_COMMAND消息映射 ON_COMMAND ( id, memberFxn )
例12-4 按比例放大或缩小图像 • 使用“菜单编辑器”对AppWizard生成的菜单进行修改: • 加入一个命名为“图幅”的弹出式菜单,内含3个菜单选项:缩小显示、正常显示和放大显示,其标识符分别改为ID_SHRINK,ID_BESTFIT和ID_ZOOMOUT • 修改例12-3,使用StretchBlt( )函数代替BitBlt( )函数
自学内容 • 12.7 字体 • 12.8 绘图模式 • 12.9 GDI坐标系 • 12.10 图标、快捷键和字符串表
编程与调试:向项目中添加资源 • 使用Developer Studio的菜单选项Insert/Resource…调出Insert Resource对话框 • 选择相应的资源如Bitmap、Icon和Menu等 • 按下New…按钮进入相应的资源编辑器
编程与调试:资源编辑器 • 图标编辑器 • 位图编辑器 • 菜单编辑器 • 快捷键编辑器 • 字符串表编辑器
程序设计举例 例12-5 通过菜单选择改变所画折线的颜色。 例12-6 飞舞的彩色泡泡程序。
作业 • 编一程序,在窗口客户区绘制一幅包括太阳、蓝天、草地和房子的彩色图画。 • 为例12-2的彩色折线图重新设计一个美丽大方的图标,并修改窗口标题字符串。
结 束 语 • 学好程序设计语言的唯一途径是 上机练习。 • 你的编程能力与你在计算机上投入的时间成 正比。