《大师技巧》接下来继续资源讲解,介绍了字符串资源,WAVE(声音)资源,菜单资源。
注意,WAVE资源开始,需要包含mmsystem.h并且添加winmm.lib,我在VS2010里winmm.lib仅都找不到,于是学会用语句#pragma comment(lib,"winmm.lib")来添加LIB。
接着,在使用菜单资源的时候出现了问题。
case WM_COMMAND:
switch(LOWORD(wparam)){
case FuMenu_MusicStart:
PlaySound("FuMusic_Pal4Open",ghinstance,SND_RESOURCE|SND_ASYNC|SND_LOOP);
break;
case FuMenu_MusicStop:
//PostQuitMessage(0);
//MessageBox(hwnd,"text1","About FuApp",MB_OK|MB_ICONEXCLAMATION);
PlaySound(NULL,ghinstance,SND_PURGE);
break;
case FuMenu_About:
MessageBox(hwnd,"text1","About FuApp",MB_OK|MB_ICONEXCLAMATION);
break;
case FuMenu_Exit:
PostQuitMessage(0);
break;
default: break;
}
break;
上面是为菜单按钮添加到的事件,前两个按钮播放和停止音乐,接着ABOUT按钮弹出一个对话框,一切看起来都没有问题,但是编译后,点击About没有弹出消息。
反复检查,每句话都符合语法,将MessageBox移到播放音乐按钮除,能够成功弹出消息。
于是我照着原著,一句一句修改成书上的样子。终于发现错误所在:
#ifndef RESOURCE_H
#define RESOURCE_H
#define FuMenu_MusicStart 0001
#define FuMenu_MusicStop 0002
#define FuMenu_About 0101
#define FuMenu_Exit 0102
#endif
这是RC包含的资源头文件,里面定义了按钮的ID,我的ID是从0开始的,而书上的是从1开始,而头两个ID,0001,0002,可以成功运行,但是这样就以为数字开头的0没有问题,那就错了,About,Exit不能运行就是因为0101前面的0,我重新将ID设置为平时的数字后:
#ifndef RESOURCE_H
#define RESOURCE_H
#define FuMenu_MusicStart 1101
#define FuMenu_MusicStop 1102
#define FuMenu_About 2101
#define FuMenu_Exit 2102
#endif
程序正常运行了。
虽然不知道怎么回事,但是这提醒我们,在定义数字的时候,最好取正常数字。