1 / 33

Visual C++ 与面向对象程序设计教程

Visual C++ 与面向对象程序设计教程. 第 12 章 图形设备接口和资源 计算机教学实验中心 西安交通大学. 教学目标. Windows 的图形设备接口 MFC 的设备环境类和图形对象 资源的概念和编程方法. 学习要求. 了解 图形设备接口和资源的基本概念 掌握 掌握画笔、画刷、位图以及菜单等对象和资源的用途和编程方法 学会 简单的动画编程和 Developer Studio 的各种资源编辑器的使用方法. 授 课 内 容. 12.1 设备环境类和图形对象 12.2 Windows 应用程序资源 12.3 库存图形对象

lawson
Download Presentation

Visual C++ 与面向对象程序设计教程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Visual C++与面向对象程序设计教程 第12章 图形设备接口和资源 计算机教学实验中心 西安交通大学

  2. 教学目标 • Windows的图形设备接口 • MFC的设备环境类和图形对象 • 资源的概念和编程方法

  3. 学习要求 • 了解 • 图形设备接口和资源的基本概念 • 掌握 • 掌握画笔、画刷、位图以及菜单等对象和资源的用途和编程方法 • 学会 • 简单的动画编程和Developer Studio的各种资源编辑器的使用方法

  4. 授 课 内 容 • 12.1 设备环境类和图形对象 • 12.2 Windows应用程序资源 • 12.3 库存图形对象 • 12.4 画笔与画刷 • 12.5 位图 • 12.6 菜单 • 调试技术 • 程序设计举例

  5. MFC应用程序在硬件上绘图的抽象层次 应用程序 MFC设备环境类 图形设备接口(GDI) 设备驱动程序 物理设备硬件 12.1 设备环境类和图形对象 • 设备环境 • 图形设备接口

  6. 设备环境 • 在Windows程序中,应用程序的输出并不直接面向物理的设备,如显示屏或打印机,而是针对一个称之为设备环境(Device Context)的逻辑设备进行操作,设备环境与实际设备之间的信息传送由Windows直接管理。

  7. 设备环境类 • CDC类 • CPaintDC • CClientDC • CWindowDC • CMetaFileDC

  8. 图形对象类 • CGdiObject类 • CPen • CBrush • Cfont • Cbitmap • Cpalette • CRgn

  9. 12.2 Windows应用程序资源 • 资源:是一种数据,它包含了决定程序的用户界面的文本和图形。 • 资源所决定的界面元素有: • 菜单 • 加速键 • 位图、光标、图标 • 对话框、控件 • 字符串 • 工具栏

  10. 资源脚本文件和资源头文件 • 资源文件 • .rc • 定义资源内容 • 资源通过资源标识符加以区别 • 资源头文件 • Resource.h • 定义一个项目中所有的资源标识符

  11. 12.3 库存图形对象 • CGdiObject Class Members CGdiObject::CreateStockObject BOOL CreateStockObject( int nIndex ); Return Value Nonzero if the function is successful; otherwise 0. • 掌握SelectStockObject()方法 • 不必存储和恢复原来的图形对象

  12. 例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: …(以下省略文档类的其它定义语句) }

  13. 例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; }

  14. 例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); //画椭圆 }

  15. 用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)

  16. 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 创建空(空白)画笔

  17. 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 垂直线

  18. CDC::SelectObject()函数原型 • CPen* SelectObject( CPen* pPen ); • CBrush* SelectObject( CBrush* pBrush ); • virtual CFont* SelectObject( CFont* pFont );

  19. 例12-2 彩色折线图 • 创建一个CPen的图形对象显示折线颜色 • 调用CPen类的成员函数DeleteObject() 将画笔从设备环境中删除 • 调用CreatePen()成员函数创建一个新颜色的画笔 • 选入设备环境中,再用新的颜色画线

  20. 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

  21. 例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) …(以下省略其它定义语句) };

  22. 例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; }

  23. 例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); }

  24. 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决定了位图的显示方式

  25. CDC::StretchBlt • 实现图像缩放输出 BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );

  26. 12.6 菜单 • 编辑菜单资源:使用菜单编辑器 • Separator表示分隔线 • Popup选项可引出一子菜单。 • 载入菜单资源:在CWnd类PreCreateWindow()中进行 virtual BOOL PreCreateWindow( CREATESTRUCT& cs ); cs.hMenu = LoadMenu(NULL, MAKEINTRESOURCE( IDR_MAINMENU)); • 为每个菜单选项添加WM_COMMAND消息映射 ON_COMMAND ( id, memberFxn )

  27. 例12-4 按比例放大或缩小图像 • 使用“菜单编辑器”对AppWizard生成的菜单进行修改: • 加入一个命名为“图幅”的弹出式菜单,内含3个菜单选项:缩小显示、正常显示和放大显示,其标识符分别改为ID_SHRINK,ID_BESTFIT和ID_ZOOMOUT • 修改例12-3,使用StretchBlt( )函数代替BitBlt( )函数

  28. 自学内容 • 12.7 字体 • 12.8 绘图模式 • 12.9 GDI坐标系 • 12.10 图标、快捷键和字符串表

  29. 编程与调试:向项目中添加资源 • 使用Developer Studio的菜单选项Insert/Resource…调出Insert Resource对话框 • 选择相应的资源如Bitmap、Icon和Menu等 • 按下New…按钮进入相应的资源编辑器

  30. 编程与调试:资源编辑器 • 图标编辑器 • 位图编辑器 • 菜单编辑器 • 快捷键编辑器 • 字符串表编辑器

  31. 程序设计举例 例12-5 通过菜单选择改变所画折线的颜色。 例12-6 飞舞的彩色泡泡程序。

  32. 作业 • 编一程序,在窗口客户区绘制一幅包括太阳、蓝天、草地和房子的彩色图画。 • 为例12-2的彩色折线图重新设计一个美丽大方的图标,并修改窗口标题字符串。

  33. 结 束 语 • 学好程序设计语言的唯一途径是 上机练习。 • 你的编程能力与你在计算机上投入的时间成 正比。

More Related