《Windows游戏编程大师技巧》学习笔记(四)
资源与Windows应用程序
Windows程序支持将资源数据编译到.EXE
文件中,优势如下:
- 更容易发布
- 不易丢失附加资源
- 无法被轻易访问和修改
支持编译到程序中的资源类型有:图标,光标,字符串,声音,位图,对话框,图元文件;
我们只需要创建扩展名为.RC
的文本文件,资源编译器会自动根据所配置的资源脚本装载所需的资源,并编译到以.RES
为扩展名的文件中,后续与.LIB
和.OBJ
文件编译为一个完整的应用程序文件;
使用图标资源
在.RC
脚本中使用如下方式定义ICON资源:
1 | // 使用字符串命名 |
资源脚本中支持引入头文件,所以我们就可以在头文件中给整数ID定义含义明确的名字,如下:
1 | // 在头文件 RESOURCES.H 中 |
1 | // 在资源脚本 xxx.RC 中 |
使用字符串命名资源和使用整数ID命名资源本质相同,只是在加载使用时写法不一样:
1 | // 加载使用字符串命名的图标资源 |
MAKEINTRESOURCE
宏的作用是将整数转换为一个字符串指针,相关定义如下:
1 |
使用光标资源
资源的定义和加载与上述操作相似,不再赘述;
除去在窗口类初始化时定义其光标,还可以后续通过SetCursor
函数改变当前窗口的光标,如下:
1 | // 初始化窗口类时设置光标 |
使用字符串资源
字符串使用如下方式的字符串表进行定义:
1 | STRINGTABLE |
花括号也可以被替换成BEGIN...END
对;
需要注意的是,只能有一个字符串表,来包含所有的字符串资源,并且字符串在定义时不支持换行,每行长度不能超过255字符(包括字符串名在内);
除此之外,字符串资源只能使用者整数ID来定义,而不允许使用字符串标识来定义;
字符串资源可以通过LoadString
函数进行加载,在非Unicode环境下原型如下:
1 | int WINAPI LoadStringA( |
函数在调用成功时返回加载的字符数量,失败时返回0,示例如下:
1 | char str_buffer[80]; |
使用声音资源
标准的Windows声音资源只支持.WAV
格式的文件;
定义声音资源的方式与前述相同,并且声音资源和图标资源一样,支持使用字符串或整数ID定义;
静态装载声音资源较为复杂,此处只介绍使用PlaySound
函数即时装载和播放声音资源的技巧;
在非Unicode环境下,PlaySound
函数原型如下:
1 | BOOL WINAPI PlaySoundA( |
关于参数DWORD fdwSound
的取值,可以是下表中的一个或多个值:
1 | PlaySound("SOUND_NAME", hinstance, SND_ASYNC | SND_LOOP | SND_RESOURCE); |
需要注意的是,PlaySound
函数位于头文件mmsystem.h
中,而如果在包含Windows.h
前定义了WIN32_LEAN_AND_MEAN
这个宏,那么mmsystem.h
就会被排除在外,所以可以单独引入该头文件或者取消上述宏定义;
总结
虽然手写资源脚本很酷,但是现代化的IDE都对自动生成资源配置提供了用户界面,知其所以然,而后在开发中选择高效的生产工具。
《Windows游戏编程大师技巧》学习笔记(四)