33
Visual C++ 与与与与与与与与与与与 第 12 第 第第第第第第第第第 第第第第第第第第第 第第第第第第第第第 第第第第第 西 第第第第第 西

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

  • Upload
    lawson

  • View
    103

  • Download
    4

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

第 12 章 图形设备接口和资源

计算机教学实验中心计算机教学实验中心西安交通大学西安交通大学

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

教学目标

Windows 的图形设备接口 MFC 的设备环境类和图形对象 资源的概念和编程方法

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

学习要求

了解图形设备接口和资源的基本概念

掌握掌握画笔、画刷、位图以及菜单等对象和资源的用途和编程方法

学会简单的动画编程和 Developer Studio 的各种资源编辑器的使用方法

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

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

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

12.1 设备环境类和图形对象

设备环境 图形设备接口

MFC 应用程序在硬件上绘图的抽象层次

应用程序

MFC 设备环境类

图形设备接口( GDI )

设备驱动程序

物理设备硬件

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

设备环境

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

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

设备环境类

CDC 类 CPaintDC CClientDC CWindowDC CMetaFileDC

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

图形对象类

CGdiObject 类 CPen CBrush Cfont Cbitmap Cpalette CRgn

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

12.2 Windows应用程序资源

资源:是一种数据,它包含了决定程序的用户界面的文本和图形。 资源所决定的界面元素有:

菜单 加速键 位图、光标、图标 对话框、控件 字符串 工具栏

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

资源脚本文件和资源头文件

资源文件 .rc 定义资源内容 资源通过资源标识符加以区别

资源头文件 Resource.h 定义一个项目中所有的资源标识符

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

12.3 库存图形对象

CGdiObject Class MembersCGdiObject::CreateStockObject BOOL CreateStockObject( int nIndex );Return ValueNonzero if the function is successful; otherwise 0.

掌握 SelectStockObject() 方法 不必存储和恢复原来的图形对象

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

例 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:

…( 以下省略文档类的其它定义语句 )

}

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

例 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;

}

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

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

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

例 12-1 用鼠标切换椭圆的图形参数(续 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; // 修改颜色变量值InvalidateRect(pDoc->m_rectEllipse);

}

CView::OnLButtonDown(nFlags, point);

}

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

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

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

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

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

CDC::SelectObject ()函数原型

CPen* SelectObject( CPen* pPen ); CBrush* SelectObject( CBrush* pBrush ); virtual CFont* SelectObject( CFont* pFont );

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

例 12-2 彩色折线图

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

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

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

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

例 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)

… (以下省略其它定义语句)};

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

例 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;

}

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

例 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);

}

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

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

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

CDC::StretchBlt

实现图像缩放输出 BOOL StretchBlt( int x, int y, int nWidth, int nHeight,

CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );

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

12.6 菜单 编辑菜单资源:使用菜单编辑器

Separator 表示分隔线 Popup 选项可引出一子菜单。

载入菜单资源:在 CWnd 类 PreCreateWindow() 中进行virtual BOOL PreCreateWindow( CREATESTRUCT& cs );cs.hMenu = LoadMenu(NULL, MAKEINTRESOURCE(

IDR_MAINMENU));

为每个菜单选项添加 WM_COMMAND 消息映射ON_COMMAND ( id, memberFxn )

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

例 12-4 按比例放大或缩小图像

使用“菜单编辑器”对 AppWizard 生成的菜单进行修改: 加入一个命名为“图幅”的弹出式菜单,内含 3个菜单选项:缩小显示、正常显示和放大显示,其标识符分别改为

ID_SHRINK , ID_BESTFIT 和 ID_ZOOMOUT

修改例 12-3 ,使用 StretchBlt( ) 函数代替BitBlt( ) 函数

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

自学内容

12.7 字体 12.8 绘图模式 12.9 GDI 坐标系 12.10 图标、快捷键和字符串表

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

编程与调试:向项目中添加资源

使用 Developer Studio 的菜单选项 Insert/Resource… 调出 Insert Resource 对话框

选择相应的资源如 Bitmap 、 Icon 和 Menu 等 按下 New… 按钮进入相应的资源编辑器

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

编程与调试:资源编辑器

图标编辑器 位图编辑器 菜单编辑器 快捷键编辑器 字符串表编辑器

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

程序设计举例

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

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

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

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

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