回 帖 发 新 帖 刷新版面

主题: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个回复)

沙发

怎么没人顶啊,高手不屑顶,水手不敢顶?
赞一下楼主的学习态度

板凳

丁页

3 楼

高手干什么呢?不如解决些问题,这很无聊呀!

4 楼

[font=楷体_GB2312][/font]


赶快发,我需要学习这种语言,做毕业设计要用的。[em8]

5 楼

怎么说呢
[em9][em9][em9][em9]
你的学习态度的确很值得表扬
呵呵
但是你能不能
做点很实用的东东哦
你在上面讲的随便在那本介绍MFC的书上都有啊!

6 楼

你小什么意思

7 楼

很详细哦,,顶~~~

8 楼

我以后会在这里谈一谈我对侯杰<<深入浅出MFC>>的一些心得!

9 楼

顶先

10 楼

上面的仁兄,谢谢你的赞扬.但我有我的想法.一是仅管每一本书都有,但它未必像我这样自问自答,每一个人在看书时必有疑问,我不过把它提出来供大家讨论,其作用的大小本不在于它本身,而是在于各位是否愿意一起来讨论,提问的提问,解惑的解惑,这样才能共同进步!

我来回复

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