回 帖 发 新 帖 刷新版面

主题:MFC学习进阶06

   这一次我们主要的任务是“创建和管理运用程序资源”,前面我们已经初步了解了一下资源,用自己的话来描述就是,凡是运用程序要用到数据就叫资源。我们还初步了解了怎么把资源嵌入程序框架中,还记不记得有Skeleton.rc和Resource.h这两个文件。

   我们下面的任务是:
1。了解资源的类型(我想用的地方不一样,类型就不同吧!估计不同类型的资源数据
类型不同才这样分的)
2。如何创建资源脚本。(资源脚本难道就是包含资源数据的文件,那么Skeleton.rc也是哟??)
3。如何使用资源。(这当然是我们最关心的)

书上先介绍了资源的任务,看看资源是干吗的?

我曾听到过这样的一句话“程序就是数据和算法”。书上说这个数据包括两个部分,一个是程序启动后,传递给运用程序的(是我们看得最明显的); 另一部分是在创建运用程序的过程当中,用来构建图形用户界面的,如菜单,图标等等。(也是哈,按照时间的先后分)这个另一部分就是指的资源了。

资源是被链入运用程序当中的,但我们有时候看不见资源,只有一个exe文件,这是因为资源已经被链入可执行文件中去了,也就是说,资源被编译为二进制文件,像源文件一样被链接为可执行文件.有时候是编译到DLL中了.

资源是怎么被编译的呢?其过程如下:
资源(RC,BMP,JCO)------资源编译器-------编译过的资源文件(.RES)-----------链入运用程序中
     注意:.RC的文件是资源脚本文件,所有的资源都是在其中定义,资源也支持预编译,如:#DEFINE和#INCLUDE
在MFC实践中,是在一个叫RESOURCE.H的文件中定义资源常量.任何与资源有关的文件都引用这个文 件

有的人会奇怪,为什么一定要编译进去?原因有二.
1.如果不编译,资源文件被破坏,程序就会瘫痪.
2.编译后速度会很快

进入第二个主题:资源类型
需要提出的是:WIN32和MFC依赖的是相同的资源.
主要有:加速键,位图,光标,图标,菜单,对话框,字符串表

下面一一介绍这些资源:
1.加速键
加速键就是我们常说的快捷键,用户可以定义一个和菜单命令绑定的键来创建加速键.清单如下:
IDR_MYAPP ACCELERATIONS //ACCELERATION是加速键列表标识,不同的资源是不同的标识
BEGIN
"X", ID_EDIT_CUT, VIRTKEY,CONTROL //ID_EDIT_CUT是标准菜命令"剪切"的标识符
"C", ID_EDIT_COPY, VIRTKEY,CONTROL //"C"表示组合基本键,CONTROL表示另一个
"V", ID_EDIT_PASTE, VIRTKEY,CONTROL //VIRTKEY表示这是一个对应关系
END(这里我们要能举一反三,要了解shift要怎么表示,还有些什么命令?)

2.位图
位图最多是用来为 工具栏的按钮 存贮图像.与加速键不同的是位图是从外部文件存取.下面是一个定义位图资源的例子.
IDR_MYIMAGE BITMAP "MyImage.bmp"//用了IDR_MYIMAGE(IDR_MYIMAGE是在Resource.h 中定义的标识符) 标识资源,BITMAP标识资源是一个位图,文件名为"MyImage.bmp"

3.光标
 光标是一个简单的可替换的鼠标,其实就是一个小的位图,不同的是光标有一个热点用来标识其位 置.光标也是要一个独立的文件(.CUR)中.下面是一个光标的定义:
IDR_MYAPP CURSOR "MyApp.cur"
其含义跟位图的差不多.

4.图标
图标是用来标识最小化了的应用程序的一个小位图,其大小为所欲为32*32或16*16.图标存入一个独立文件(.ICO)中.下面是一个图标的定义:
IDR_MYAPP ICON "MyApp.ico"

5.菜单
菜单包含一系列命令,每一个菜单命令都有一个标识符与之对应,如上面我们看到的ID_EDIT_CUT等,在资源脚本中定义的菜单有时是作为菜单模板存储的.下面是一个菜单模板的例子:
IDR_MYAPP MENU//MENU表明这是个菜单资源
BEGIN
POPUP"&File" //POPUP用来标识子菜单
BEGIN
MENUITEM "&New\tCtrl+N", ID_FILE_NEW //MENTITEM标识菜单项
MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN  
MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE,GRAYED //GRAYED标识菜单开始为灰色
MENUITEM "Save&As...", ID_FILE_SAVE_AX,GRAYED//GRAYED开始不能用
MENUITEM SEPARATON  //SEPARATON 表明此菜单项作为上下菜单的分界线
MENUITEM "E&xit", ID_APP_EXIT
END
POPUP"&Help"
BEGIN
MENUITEM "About MyApp...", ID_APP_ABOUT
END
END

菜单项的命名格式:
其格式为菜单名加上每一项的加速键.&用来指定在项目的哪一个字母下加下划线,也决定了与"ALT"绑定的键."\t"用于向加速文本中插入标签.菜单项属性选择可以为菜单项指定初使状态,以下是菜单的属性:
CHECKED 菜单项被选中时显示一选中标记,只对菜单项有效.
GRAYED  置不活动状态
INACTIVE 不更改菜单项内文本,使菜单项的顶端菜单为不活动状态

以上定义的菜单项其实不用再在Resource.h中定义了,因为这些都在AfxRes.h中定义过了,这个文件同Resource.h一起包含到资源脚中了.

6.对话框
对话框是比较复杂的,这里只给出一个直观的代码.
IDD_ABOUTBOX DIALOG 0,0,217,55
VAPTION "About MyApp"
STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU
FONT 8,"MS Sans Serif"
BEGIN
ICON IDR_MYAPP,IDC_STATIC,11,17,20,20
LTEXT "MyApp version .0",
                      IDC_STATIC,40,10,119,8,SS_NOPREFIX
LTEXT "Copyright(c) 1998 Michael Morrison",
                       IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "OK",IDOK,178,7,32,14,WS_GROUP
END
我的体会是DIALOG肯定是表明这是一个对话框资源,VAPTION是用来标识对话框标题的,STYLE是用来干什么的,我猜不出来了,FONT标识字体,ICON 标识图标,后面的数字表示大小的吗?LTEXT表示左对齐的显示文本,DEFPUSHBUTTON标识确定按钮,以上是我的看法.错误的请提出来.

7.字符串表
字符串表我们在前面介绍过,它主要用来让字符串与应用程序分离.具体的请看上一次的.写一个简单的吧:
STRINGTABLE
BEGIN
AFX_IDS_APP_TITLE "MyApp"
END
这次就到这儿了,现在我会少量多次.好,拜!





回复列表 (共238个回复)

51 楼

谢谢楼主! 顶!

52 楼

努力!

53 楼

努力,

54 楼

努力!

55 楼

顶!有收获
也说说
STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU
这是对话框的属性设置时的对话框显示模式

DS_MODALFRAME:这表示对话框是模式窗口
WS_POPUP:表示是?不敢说
WS_CAPTION:表示是有标题栏
WS_SYSMENU:表示有系统菜单

56 楼

楼主说的是very滴对,支持,加油,继续努力哦!~~Oo~~

57 楼

顶,俺就是想看这样的东东.简单,实惠.

58 楼

支持楼主

59 楼

支持一个,顺便求助一下。
求助《C++程序设计实践教程》书  名: C++程序设计实践教程书  号:7-04-12923-x 作  者:李海文 吴乃陵 出版时间:2003-9-1 最好是电子版本的,minghongliu@163.com QQ:65586226 谢谢大家了!

60 楼

我顶

我来回复

您尚未登录,请登录后再回复。点此登录或注册