VC++讲义第11单元 资源.docx
- 文档编号:12232363
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:30
- 大小:1.11MB
VC++讲义第11单元 资源.docx
《VC++讲义第11单元 资源.docx》由会员分享,可在线阅读,更多相关《VC++讲义第11单元 资源.docx(30页珍藏版)》请在冰豆网上搜索。
VC++讲义第11单元资源
第11单元资源
本单元教学目标
介绍资源的概念以及图标、位图、菜单、工具栏和状态栏等资源的编程方法。
学习要求
掌握DeveloperStudio的各种资源编辑器的用法,能在应用程序中添加图标、位图、菜单和工具条等资源并进行相应的编程工作。
授课内容
除了文档对象的数据成员和变量外,典型的Windows应用程序还会用到一些称为资源的数据,包括确定应用程序的用户界面的一些文本和图形,如菜单、加速键、位图、光标、图标、对话框、控件、字符串和工具栏等。
当Windows调用一个应用程序时就从程序的可执行文件中读取程序代码和初始化数据,并将其复制到分配的内存中。
然而,除了一些特殊情况,资源数据仍保留在硬盘上的可执行文件中。
实际上,当应用程序创建窗口、显示对话框或装载位图时,才从EXE文件或DLL文件中读取相应的资源数据。
DeveloperStudio提供了几种资源编辑器,可以通过它们创建或编辑应用项目的资源数据。
本单元介绍在应用程序中首先会遇到的几种界面元素,包括图标、位图、菜单、工具栏、加速键和状态栏。
对话框和控件分别放在第14单元和第15单元讨论。
11.1资源脚本文件和资源头文件
项目在一个扩展名为.rc的文件中定义资源,资源文件常与项目同名。
资源文件是文本文件,可用文本编辑器编辑阅读,然而更方便的方法是通过DeveloperStudio的各种资源编辑器进行编辑。
在资源文件中定义了菜单脚本和字符串等内容,但不包含位图和图标的图形数据。
图形资源保存在单独的文件中,在资源文件中只保存了它们的名字和位置。
在项目中,资源通过资源标识符加以区别。
通常在使用资源编辑器建立资源或将一外部资源插入项目时为资源命名标识符。
标识符的命名有一定的规则,如IDR_MAINFRAME代表主框架窗口的菜单和工具栏,IDD_ABOUTBOX代表About(关于)对话框。
通常将一个项目中所有的资源标识符均放在头文件Resource.h中定义,因此在源代码文件中要包含此头文件。
下面列出一些MFC使用的资源标识符前缀:
标识符前缀说明
IDR_主菜单、工具栏、加速键表和应用程序图标
IDD_对话框
IDC_控件和光标
IDS_字符串
IDP_消息框提示字符串
ID_菜单命令
资源编译器是DeveloperStudio的一个独立组成部分,负责将程序的文本和图形资源编译成目标文件。
这些目标文件将和源程序编译生成的目标文件一起连接为可执行文件。
11.2图标(Icon)
在Windows中,每个文件均有一个图标,通过双击该图标可打开该文件。
作为应用程序的图标,应该醒目、美观,并能与程序的功能有所关联。
但在前几单元中,我们没有对程序的图标做相应处理,因此所有程序均使用了MFC缺省的程序图标,缺乏特色。
下面介绍在应用程序中添加图标的方法。
向程序中添加资源要经过经过如下步骤:
如果项目中还没有资源文件,则首先应为项目建立一个资源文件。
然后将资源加入项目,并在程序中引用资源。
向项目中添加资源可使用DeveloperStudio的Insert/Resource…菜单选项,选择相应的资源类型并加入新资源(参看11.8:
“向项目中添加资源”)。
在应用程序中引用资源,首先要在程序首部添加文件包含命令
#include“resource.h”
该头文件中包含了项目中所有资源的标识符定义(由资源编辑器自动插入)。
与设定图标有关的代码通常放在应用程序类的成员函数InitInstance()中。
首先使用CWinApp类的成员函数
HICONCWinApp:
:
LoadIcon(LPCTSTRlpszResourceName)const;
HICONCWinApp:
:
LoadIcon(UINTnIDResource)const;
载入图标。
这里HICON为图标句柄类型,参数lpszResourceName为图标的名称,nIDResource为图标的ID。
该函数的返回值即该图标的句柄。
然后调用CWnd类的成员函数
HICONCWnd:
:
SetIcon(HICONhIcon,BOOLbBigIcon);
安装图标。
其中参数bBigIcon确定安装的是何种图标。
图标有两种:
大图标为32×32点阵,小图标为16×16点阵。
使用哪个图标是由操作系统的设置决定的,作为应用程序,应该同时提供两种图标。
该函数的返回值为窗口原来图标的句柄。
[例11-1]为例9-3的吹泡泡程序添加一标识符为IDI_MAINICON的图标(该图标应已按11.8:
“向项目中添加资源”中的方法建立并加入项目)。
说明:
建立项目的方法见9.8:
“用VisualC++集成开发环境开发Win32应用程序”。
程序:
在例9-3程序前面添加一文件包含命令:
#include”resource.h”
并将CMyApp:
:
InitInstance()函数修改为:
BOOLCMyApp:
:
InitInstance()
{
HICONhIcon;
hIcon=LoadIcon(IDI_MAINICON);//载入图标
CMyWnd*pFrame=newCMyWnd;
pFrame->Create(0,_T("吹泡泡程序"));
pFrame->SetIcon(hIcon,TRUE);//设置大图标
pFrame->SetIcon(hIcon,FALSE);//设置小图标
pFrame->ShowWindow(m_nCmdShow);
this->m_pMainWnd=pFrame;
returnTRUE;
}
分析:
同一图标有大、小两种尺寸,均用同一标识符表示,同时载入程序,但要分别安装。
11.3位图(Bitmap)
所谓位图,即点阵式图象。
与图标不同的是位图的尺寸非常灵活,可以任意设置。
实际上,应用程序通常使用两种位图:
一种可由位图编辑器(参看11.9.2:
“位图编辑器”)生成、编辑,通常尺寸较小,颜色种类数较少(最多256色)。
这类位图往往用作应用程序中的某种标志或小幅图象。
另一种位图就是通常的图象文件,可通过专用的图象工具软件生成,也可通过扫描仪等设备直接将照片、图片等输入计算机,可以是真彩图象。
DeveloperStudio可将.BMP格式的图象文件作为资源加入项目。
在MFC中,用CBitmap类对象存放位图的参数。
CBitmap类有以下几个重要成员函数:
1.载入位图资源:
BOOLLoadBitmap(LPCTSTRlpszResourceName);
BOOLLoadBitmap(UINTnIDResource);
其中参数lpszResourceName和nIDResource分别为资源名称和标识符。
装载成功时该函数返回非零值,否则返回零。
2.读位图信息
intGetBitmap(BITMAP*pBitMap);
其中参数pBitMap为一BITMAP结构体对象的地址。
BITMAP结构体类型用于存放位图有关信息:
typedefstructtagBITMAP{
intbmType;//位图类型(0)
intbmWidth;//位图宽
intbmHeight;//位图高
intbmWidthBytes;//位图每行的字节数
BYTEbmPlanes;//位平面数
BYTEbmBitsPixel;//每点字节数
LPVOIDbmBits;//位图数据指针
}BITMAP;
与一般的图形相比,位图的显示过程稍复杂些。
首先应建立一合适的内存设备环境:
CDCMemDC;
MemDC.CreateCompatibleDC(NULL);
并将位图选入该设备环境:
MemDC.SelectObject(&m_Bitmap);
然后可用CDC类的BitBlt()成员函数从内存设备环境中将位图复制到指定设备(如窗口或打印机)。
BitBlt()函数的原型为:
BOOLBitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,
intxSrc,intySrc,DWORDdwRop);
其中参数x,y为目标区左上角坐标,nWidth和nHeight分别为目标区的宽度和高度(逻辑坐标),pSrcDC为内存设备指针,xSrc和ySrc为原图中欲显示块左上角坐标,dwRop为复制方式,常用值为SRCCOPY,即将位图按原样复制。
通过恰当设置这些参数,可以输出位图中的某个矩形区域。
[例11-2]显示一张位图文件(.BMP)。
说明:
首先建立Win32Application空白项目和源代码文件(不要忘记设置项目使之可以使用MFC类库),然后按11.8:
“向项目中添加资源”的方法为项目建立资源文件,并将待显示的位图文件作为资源装入项目。
程序:
//Example11-2:
显示BMP图片
#include
#include"resource.h"
//框架窗口类
classCMyWnd:
publicCFrameWnd
{
CBitmapm_Bitmap;
intm_nHeight;
intm_nWidth;
public:
CMyWnd();
protected:
afx_msgvoidOnPaint();
DECLARE_MESSAGE_MAP()
};
//消息映射
BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
//框架窗口类的成员函数
CMyWnd:
:
CMyWnd()
{
m_Bitmap.LoadBitmap(IDB_BITMAP1);
BITMAPBM;
m_Bitmap.GetBitmap(&BM);
m_nWidth=BM.bmWidth;
m_nHeight=BM.bmHeight;
}
//响应绘制窗口客户区消息
voidCMyWnd:
:
OnPaint()
{
CPaintDCdc(this);
CDCMemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&m_Bitmap);
dc.BitBlt(0,0,m_nWidth,m_nHeight,&MemDC,0,0,SRCCOPY);
}
//应用程序类
classCMinMFCApp:
publicCWinApp
{
public:
BOOLInitInstance();
};
//应用程序类的成员函数
//初始化应用程序实例
BOOLCMinMFCApp:
:
InitInstance()
{
CMyWnd*pFrame=newCMyWnd;
pFrame->Create(0,_T("BeautifulCats”));
pFrame->ShowWindow(m_nCmdShow);
this->m_pMainWnd=pFrame;
returnTRUE;
}
//全局应用程序对象
CMinMFCAppThisApp;
输出:
在框架窗口中显示一幅图片,如图11-1所示。
分析:
在框架窗口类的构造函数中载入位图资源并取得其宽度和高度数据。
在OnPaint()函数中,首先建立一内存设备环境并选入已装载的位图资源,然后使用BitBlt()函数将位图显示在框架窗口的客户区。
图11-1显示图片程序
CDC类的成员函数StreTchBlt()也可用来显示位图资源。
其原型为:
BOOLStretchBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,
intxSrc,intySrc,intnSrcWidth,intnSrcHeight,DWORDdwRop);
与BitBlt()对比,可发现StretchBlt()多了两个参数nSrcWidth和nSrcHeight。
这两个参数与xSrc和ySrc配合可确定位图中的一个矩形区域。
通过改变由参数nWidth和nHeight确定的目标区矩形,可实现图象的缩放输出(参看例11-3)。
11.4菜单(Menu)
菜单在Windows应用程序中具有非常重要的地位。
菜单也是一种资源,因此也要通过DeveloperStudio的资源编辑器编辑。
“弹出式菜单”(popup)、“选项”(menuitem)和“分隔线”(separator)是构成“树状菜单的三大要素”,如图11-2所示。
图11-2典型的菜单
通过“弹出式菜单”可以调出一个子菜单,也可以说弹出式菜单就是一个子菜单。
分隔线用来区分一组选项。
通过菜单中的“选项”可以调用应用程序的某项功能。
每个选项均有一个标识符,而且只有选项才有标识符,弹出式菜单和分隔线都没有标识符,在应用程序中只对选项编程。
当用户选择了一个菜单选项后,就会向应用程序发送一个命令消息WM_COMMAND。
该消息的格式为:
ON_COMMAND(id,memberFxn)
其中参数id可以是菜单选项的标识符,而参数memberFxn为接收该消息的窗口中用于处理该消息的成员函数名。
在MFC程序中,通过CMenu类对象对菜单进行操作。
在应用程序中加入菜单的要通过三个步骤:
1.编辑菜单资源,设置菜单属性(见11.8:
“向项目中添加资源”和11.9.3:
“菜单编辑器”);
2.在Wnd类的PreCreateWindow()成员函数中载入菜单;
3.为每个菜单选项添加WM_COMMAND消息映射和对应的消息处理函数。
载入菜单的工作可在CWnd类的PreCreateWindow()函数中进行,其原型为:
virtualBOOLPreCreateWindow(CREATESTRUCT&cs);
其中参数cs的类型为CREATESTRUCT。
该类型用于存放建立窗口的初始化参数:
typedefstructtagCREATESTRUCT{
LPVOIDlpCreateParams;//创建窗口的参数指针
HANDLEhInstance;//实例句柄
HMENUhMenu;//菜单
HWNDhwndParent;//父窗口
intcy;//窗口高
intcx;//窗口宽
inty;//窗口左上角y坐标
intx;//窗口左上角x坐标
LONGstyle;//窗口类型
LPCSTRlpszName;//窗口名称
LPCSTRlpszClass;//窗口类名
DWORDdwExStyle;//附加类型
}CREATESTRUCT;
PreCreateWindow()函数在窗口创建前被调用,通过重载该函数,程序员可以设置各种窗口参数,也可以使用LoadMenu()载入菜单资源。
其方法为:
cs.hMenu=LoadMenu(NULL,MAKEINTRESOURCE(IDR_MAINMENU));
载入菜单后,还需为每个菜单选项添加消息映射和消息处理成员函数。
[例11-3]修改11-2,使之可以不同比例放大或缩小图象。
说明:
使用StretchBlt()函数代替BitBlt()函数就可实现图象的缩放显示。
在项目中加入一个弹出式菜单(将标识符改为IDR_MAINMENU),内含3个菜单选项:
缩小1倍显示,按原尺寸显示和放大1倍显示,其标识符分别改为ID_SHRINK,ID_BESTFIT和ID_ZOOMOUT。
程序:
//Example11-3:
以不同尺寸显示BMP图片
#include
#include"resource.h"
//框架窗口类
classCMyWnd:
publicCFrameWnd
{
CBitmapm_Bitmap;
floatm_fTimes;
intm_nHeight;
intm_nWidth;
public:
CMyWnd();
BOOLPreCreateWindow(CREATESTRUCT&cs);
protected:
afx_msgvoidOnPaint();
afx_msgvoidOnShrink();
afx_msgvoidOnBestFit();
afx_msgvoidOnZoomOut();
DECLARE_MESSAGE_MAP()
};
//消息映射
BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)
ON_WM_PAINT()
ON_COMMAND(ID_SHRINK,OnShrink)
ON_COMMAND(ID_BESTFIT,OnBestFit)
ON_COMMAND(ID_ZOOMOUT,OnZoomOut)
END_MESSAGE_MAP()
//主窗口类的成员函数
CMyWnd:
:
CMyWnd()
{
BITMAPBM;
m_Bitmap.LoadBitmap(IDB_BITMAP1);
m_Bitmap.GetBitmap(&BM);
m_nWidth=BM.bmWidth;
m_nHeight=BM.bmHeight;
m_fTimes=1.0;
}
//装入菜单
BOOLCMyWnd:
:
PreCreateWindow(CREATESTRUCT&cs)
{
cs.hMenu=LoadMenu(NULL,MAKEINTRESOURCE(IDR_MAINMENU));
returnCFrameWnd:
:
PreCreateWindow(cs);
}
//缩小图象
voidCMyWnd:
:
OnShrink()
{
m_fTimes=0.5;
Invalidate();
}
//放大图象
voidCMyWnd:
:
OnZoomOut()
{
m_fTimes=2.0;
Invalidate();
}
//原样显示
voidCMyWnd:
:
OnBestFit()
{
m_fTimes=1.0;
Invalidate();
}
//响应绘制窗口客户区消息
voidCMyWnd:
:
OnPaint()
{
CPaintDCdc(this);
CDCMemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&m_Bitmap);
dc.StretchBlt(0,0,(int)(m_nWidth*m_fTimes),
(int)(m_nHeight*m_fTimes),
&MemDC,0,0,m_nWidth,m_nHeight,SRCCOPY);
}
//应用程序类
classCMyApp:
publicCWinApp
{
public:
BOOLInitInstance();
};
//应用窗口类的成员函数
//初始化应用程序实例
BOOLCMyApp:
:
InitInstance()
{
CMyWnd*pFrame=newCMyWnd;
pFrame->Create(0,_T("ShowBitmap1.0"));
pFrame->ShowWindow(SW_SHOWMAXIMIZED);
pFrame->UpdateWindow();
this->m_pMainWnd=pFrame;
returnTRUE;
}
//全局应用程序对象
CMyAppThisApp;
输入输出:
通过菜单可选择图片的显示尺寸,如图11-3所示。
自学内容
图11-3可变显示大小的图片程序
11.5快捷键
快捷键总是与菜单选项配合使用。
如果要为某菜单配上相应的快捷键,首先要插入快捷键表资源,然后插入对每个菜单项的快捷键(参看11.8:
“向项目中添加资源”和11.9.4:
“快捷键编辑器”)。
在程序中载入快捷键资源的方法与载入菜单资源的方法类似,均可在Wnd类的成员函数PreCreateWindow()中进行。
载入快捷键使用Wnd类的成员函数LoadAccelTable(),其原型为:
BOOLLoadAccelTable(LPCTSTRlpszResourceName);
其中参数lpszResourceName为快捷键表名称。
如果要使用资源标识符,可使用带参宏定义MAKEINTRESOURCE()将其转换为资源名称。
由于快捷键是与菜单选项配合使用,所以无需专为快捷键消息添加消息映射和消息处理函数。
11.6字符串表
应用程序窗口中使用的一些字符串信息如窗口标题和菜单项的说明信息等也是一种资源,通常存放在字符串表中。
对字符串表的编辑与其他资源的编辑类似,可参看11.9.5:
“字符串编辑器”。
11.7为框架自动装入资源
对于基于框架窗口的应用程序,可以简化主窗口使用的各种资源(如图标、标题字符串和菜单等)的装入过程,这可以通过给这些资源以相同的资源标识符来实现。
其方法为使用CFrameWnd类的成员函数LoadFrame(),原型为:
virtualBOOLLoadFrame(UINTnIDResource,
DWORDdwDefaultStyle=WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE,
CWnd*pParentWnd=NULL,CCreateContext*pContext=NULL);
虽然该函数的参数很多,但我们感兴趣的主要是第一个参数nIDResource(资源标识符),其他参数均可使用默认值。
nIDResource参数应为各种与框架窗口有关的资源(如图标、窗口标题字符串、主菜单和快捷键表)的共有资源标识符。
使用LoadFrame()可免除分别载入各种资源的麻烦,其应用见例11-4。
编程与调试
11.8向项目中添加资源
向项目中添加资源的方法如下:
1.如果项目中尚无资源文件,则使用DeveloperStudio的菜单项File/New…,从Files选项卡中选择ResourceScript(资源描述),并在选项卡右方添入资源文件名(通常与项目名相同)后按OK按钮。
此时即可发现DeveloperStudio的工作区窗口中新添了一个ResourceView。
通过ResourceView可以查看项目中的各种资源,也可以通过双击某资源标识来快速打开
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC+讲义第11单元 资源 VC 讲义 11 单元