Upload
lawson
View
107
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
Visual C++与面向对象程序设计教程
第 12 章 图形设备接口和资源
计算机教学实验中心计算机教学实验中心西安交通大学西安交通大学
教学目标
Windows 的图形设备接口 MFC 的设备环境类和图形对象 资源的概念和编程方法
学习要求
了解图形设备接口和资源的基本概念
掌握掌握画笔、画刷、位图以及菜单等对象和资源的用途和编程方法
学会简单的动画编程和 Developer Studio 的各种资源编辑器的使用方法
授 课 内 容 12.1 设备环境类和图形对象 12.2 Windows应用程序资源 12.3 库存图形对象 12.4 画笔与画刷 12.5 位图 12.6 菜单 调试技术 程序设计举例
12.1 设备环境类和图形对象
设备环境 图形设备接口
MFC 应用程序在硬件上绘图的抽象层次
应用程序
MFC 设备环境类
图形设备接口( GDI )
设备驱动程序
物理设备硬件
设备环境
在 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 MembersCGdiObject::CreateStockObject BOOL CreateStockObject( int nIndex );Return ValueNonzero 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); // 画椭圆}
例 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);
}
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 的彩色折线图重新设计一个美丽大方的图标,并修改窗口标题字符串。
结结 束束 语语 学好程序设计语言的唯一途径是 上机练习。 你的编程能力与你在计算机上投入的时间成 正比。