📄 g03.htm
字号:
<p> RESOURCES.RC的内容:<br> #include "RESOURCES.H"<br> //here are the icon defines,note the use of C++ comments<br> ID_CURSO_CROSSHAIR CURSOR crosshair.cur<br> ID_CURSOR_GREENARROW CURSOR greenarrow.cur<br> 没有任何原因说明一个资源数据文件为什么不能存在于其他目录中。例如greenarrow.cur可能存在于一个CURSOR目录的根目录下,像下面一样:<br> ID_CURSOR_GREENARROW CURSOR C:\CURSOR\greenarrow.cur</p> <p> 技巧:我已经为本章创建了一些光标.cur文件。使用你的IDE来浏览一下这些光标文件,或者仅打开该目录,Windows将通过其文件名显示每个光标文件的位图。</p> <p> 现在已经了解了如何向一个.RC文件中添加一个光标资源,下面是按照字符串名从应用程序中加载该资源的程序代码。<br> 在.RC文件中:<br> CrossHair CURSOR crosshair.cur<br> 在程序代码中: <br> //注意使用hinstance而不是NULL<br> Winclass.hCursor=LoadCursor(hinstance,"crossHair");<br> 要通过.H文件中定义的符号标识来装载光标,具体步骤如下。</p> <p> 在.H文件中:<br> #define ID_CROSSHAIR 200</p> <p> 在.RC文件中:<br> ID_CROSSAIR CURSOR crosshair.cur</p> <p> 在程序代码中:<br> //注意使用hinstance而不是NULL<br> Winclass.hCursor=LoadCursor(hinstance,MAKEINTRESSOURCE(ID_CROSSHAIR));</p> <p> 现在已经是第二次使用宏MAKEINTRESOURCE()来将符号整型ID转换为Windows系统使用的格式。<br> 好,有一个细节可能还没有引起你的注意。到现在为止只遇到了Windows类图标和光标。但是在窗口之间操作窗口图标和光标可能吗?例如,如果想创建二个窗口,并且使光标在两个窗口之间不同。要想做到这一点话,应当使用SetCursor()函数:<br> HCURSOR SetCursor(HCURSOR hCursor);<br> 其中,hCursor是一个由LoadCursor()检索光标句柄。使用该技术唯一的问题就是SetCursor()函数不太灵便,因此应用程序中必须在鼠标从一个窗口移动到另一个窗口的同时跟踪和改变光标,下面是一个设置光标的例子:<br> //load the cursor somewhere maybe in the WM_CREATE<br> HCURSOR hcrosshair = LoadCursor(hinstance,"CrossHair");<br> //later in program code to change the cursor_<br> SetCursor(hcrosshair);<br> CD-ROM上DEMO3_1.CPP给出了一个设置窗口图标和鼠标光标的例子。下面清单给出了加载新图标和光标的重要的代码部分的摘录。<br> //include resources<br> #include "DEMO3_1RES.H"<br> .<br> .<br> //changes to the window class definition<br> winclass.hIcon =<br> LoadIcon(hinstance,MAKEINTRESOURCE(ICON_T3DX));<br> winclass.hCrusor=<br> LoadCursor(hinstance,MAKEINTRESOURCE(CURSOR_CROSSHAIR));<br> winclass.hIconSm = LoadIcon(hinstance,MAKEINTRESOURCE(ICON_T3DX));<br> 并且,程序使用了资源脚本程序DEMO3_1.RC和资源头文件DEMO3_1RES.H。</p> <p> DEMO3_1RES.H的内容:<br> #define ICON_T3DX 100<br> #define CURSOR_CROSSHAIR 200<br> DEMO3_1.RC的内容:<br> #include "DEMO3_1RES.H"<br> //note that this file has defferent types of resources<br> ICON_T3DX ICON t3dx.ico<br> CURSOR_CURSSHAIR CURSOR crosshair.cur</p> <p> 要自己建立应用程序,你需要下面文件:</p> <p> DEMO3_1.CPP——C/C++主文件<br> DEMO3_1RES.H——定义符号的头文件<br> DEMO3_1.RC——资源脚本程序<br> T3DX.ICO——图标的位图数据<br> CROSSHAIR.CUR——光标的位图数据</p> <p> 所有这些文件都应当放在同一个目录下作为一个工程。否则编译器和连接器很难找到它们。一旦创建并运行了该程序,或者使用预编译程序DEMO3_1.EXE,就应当看到如图3.5所示的图像,非常酷,是吧!<br> -----------图3.5 关于常用图标和光标的DEMO3_1.EXE的输入结果 <br> -----------<br> 作为一个试验,尝试用IDE打开DEMO3_1.RC文件。图3.6表示了我使用VC++5.0所作的内容。但是,使用专用编译器应当得到不同的结果,因此如果结果不相同也不必大惊小怪。OK!在进入下面内容之前讨论一下IDE。如前所述,可以使用IDE来创建.RC和.H文件,但是,应当阅读一下IDE的手册。<br> 但是装载一个人工编写的.RC文件还有一个问题,如果使用你的IDE保存该文件的话,毫无疑问Windows编译器认为在.RC文件中造成了无数的注释、宏、定义(#define)以及其他垃圾数据。实际上该问题的本质是如果想编辑人工编写的.RC文件的话,应当将.RC文件作为文本为加载来进行编辑。这样编译器就不会将它作为一个.RC文件来装载,但是应当注意只能是无格式的ASCII文本。 </p> <p><b>创建字符串表格资源</b></p> <p> 如引言中所提到的,Windows支持字符串资源。和其他资源不同的是,只能使用一个字符串表单来容纳所有的字符串。<br> 并且字符串资源不允许通过字符串来定义。因此,在.RC文件中定义的所有字符串表单必须和符号引用常量以及相关的解释该引用的.H头文件同时使用。<br> 我依然不能确认我使用字符串资源的感受。使用字符串资源实际上和使用头文件相同,并且两种情况下——字符串或无格式头文件——都必须重新编译。因此,我认为没有使用它们的必要。但如果你确实不嫌麻烦,可以将字符串资源放入.DLL文件中,主程序就不必要再重新编译它们。但是,我是一个技术人员,不是思想家,谁去关心这些问题?<br> 要在.RC文件中创建一个字符串表单,必须使用下面语法:<br> STRINGTABLE<br> {<br> ID_STRING1,"string 1"<br> ID_STRING2,"string 2"<br> .<br> .<br> }<br> 当然,符号常量可以是任何东西,就像注释中的字符串一样。只有一条原则:每行字符串不能超过255个字符(包括常量本身在内)。<br> 下面是一个包含可能在游戏菜单中使用的字符串表单的.H和.RC文件的例子。.H文件包含有:<br> //常数值取决于你<br> #define ID_STRING_START_GAME 16<br> #define ID_STRING_LOAD_GAME 17<br> #define ID_STRING_SAVE_GAME 18<br> #define ID_STRING_OPTIONS 19<br> #define ID_STRING_SAVE_EXIT 20</p> <p> .RC文件中包含有:<br> //note the stringtable does not have a name since<br> //only one stringtable is allowed per .RC file<br> STRINGTABLE<br> {<br> ID_STRING_START_GAME "Kill Some Aliens"<br> ID_STRING_LOAD_GAME "Doneload logs"<br> ID_STRING_SAVE_GAME "Upload Data"<br> ID_STRING_OPTIONS "Tweak The Settings"<br> ID_STRING_SAVE_EXIT "Let's Bail!"<br> }</p> <p> 技巧:你几乎可以将所有的想添加的内容都放到字符串表单中,包括printf()命令格式如%d、%s等等。不能使用换行符"\n",但是可以使用八进制换码顺序如\015等等。 </p> <p> 一旦创建了含有字符串资源的源文件,应当使用LoadString()函数来装载某一个字符串,下面是LoadString()函数的原型:<br> int LoadString(HINSTANCE hInstance,//handle of module withstring resource<br> UNIT uID,//resource identifier<br> LPTSTR lpBuffer,//address of buffer for resource<br> int nBufferMax);//size of buffer<br> LoadString返回一个所读字符的数量,或者在调用不成功时返回0。下面是如何在游戏运行过程中调用和保存游戏字符串的函数:<br> //create some storage space<br> char load_string[80],//used to hold load game string<br> save_string[80],//used to hold save game string</p> <p> //load in the first string and check for error<br> if(!LoadString(hinstance,ID_STRING_LOAD_GAME,load_string,80)<br> {<br> //there's an error<br> }//end if</p> <p> //load in the second string and check for error<br> if(!LoadString(hinstance,ID_STRING_SAVE_GAME,save_string,80)<br> {<br> //there's an error<br> }//end if</p> <p></p> <p> //use the string now</p> <p> 和前面一样,hinstance是应用程序在WinMain()中传递的实例。<br> 上面已经包含了所有的字符串资源的用法。如果你能为它们找到更好的用处,请给我发一个email:ceo@games3d.com。 </p> <p></p> <p><b>使用声音.WAV资源</b></p> <p> 到现在为止,或许你已经能够方便地使用资源脚本程序,又或许你已经非常厌烦以至于打算攻击我的Web页,来对我进行破坏了。请记住,那是Microsoft公司(http://www.microsoft.com)开发的内容。我仅仅是了解它而已。<br> 好吧,我已经向你声明了不经常使用的否认声明,让我们继续下面的装载声音资源的内容!<br> 大多数游戏都是用两种声音类型中的一种:<br> ■数据化.WAV文件<br> ■MIDI.MID文件<br> 据我所知,Windows的标准资源仅支持.WAV文件,因此我就只分析如何创建.WAV资源。当然如果不支持.MID资源的话,你可能可能创建用户定义的资源类型。我们现在不讨论这个主题,但别个会加以讨论。<br> 所需要的第一个事情就是一个.WAV文件,它只是一下含有大量的8位或16位的一定频率脉冲的数字式数据波形。对于游戏声音效果来讲,典型的脉冲频率为11MHz、22MHz和44MHz(CD级品质)。该内容仍然和你无关,但我希望对该 内容概述一下,在我们学习DirectSound时,将会学习有数字采样理论和.WAV文件的全部内容。现在,只讨论一下样本大小和频率。<br> 我们假设你的磁盘上已经有了.WAV文件,并且希望将该文件添加到一个源文件中,能够装载并且按照一定的程序播放。Let's go on!.WAV文件的源类型就是WAVE——这是令人惊奇的事。要将该文件添加到.RC文件中,应当使用下面语法:<br> 方法1——通过字符串名<br> wave_name WAVE FILENAME.WAV</p> <p> 例如:<br> BigExplosion WAVE exp11.wavr<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -