一、 作业注意事项
A. if else中的代码哪怕只有一行也要用大括号括起来;
B. TEXT()的应用;
C. while……continue的应用。
二、 C-Free的相关问题
1. 怎么打开VC6、VC7、DevC++的工程?
从网上下载了别人写的C语言程序,有可能是用VC写的,所以要转换一下。下了VC的程序不用担心,C-Free是支持的。
A. C-Free4.0用【工具】→【工程转换】;
B. C-Free4.1的话,直接把工程文件拖进来就可以。
2. 为什么代码自动提示不出来?怎么增加自动提示的数量?
【工具】→【编辑器选项】→【代码提示】
显示最大条数、输入几个字符后才激活,建议改成10、1。
3. 怎么修改新建文件的默认文件名为*.c?
【工具】→【环境选项】、修改“新建文件类型”
4. 每次都要输入WinMain以及那些参数,很麻烦,有没有快捷方式?
添加自己的“模板”:
【工具】→【编辑器选项】→【代码模板】,点击【添加】按钮,为模板取一个名字,然后将代码模板粘贴到“代码”框中。
使用方式:
在编辑器中点击鼠标右键,选择【模板】,然后选择创建的代码模板。
5. 怎么生成exe程序?怎么把做好的exe程序发给别人?
主菜单【工具】→【定位到工程文件夹】跳转到工程的文件夹,也可以在我的电脑里直接进入工程文件夹。Mingw3.4.1目录下生成的exe文件就是生成好的可执行文件,发给别人就可以。
三、 播放声音文件PlaySound
1. 函数介绍
(1) 用途
游戏里播放音乐;
自己动手给女友做音乐贺卡(图片、滚动的字母、温馨的音乐)。
(2) 函数原型
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
可以使用PlaySound函数播放声音文件,该函数原型位于mmsystem.h中。因此要使用PlaySound,首先需要添加对这个头文件的引用。
提示:mm就是MultiMedia的简写,即多媒体。
返回值表示是否播放成功;
参数pszSound是要播放声音的文件名,只支持WAV等格式的文件;
参数hmod是应用程序的实例句柄,一般传递NULL就可以;
参数fdwSound是标志的组合掩码,可选值有SND_FILENAME、SND_ASYNC、SND_SYNC等。
SND_FILENAME表示pszSound参数指定的是文件名(pszSound还可以指定资源、内存音乐、系统音乐等等);
SND_ASYNC:用异步方式播放声音,PlaySound函数在开始播放后立即返回;
SND_SYNC:同步播放声音,在播放完后PlaySound函数才返回;
SND_LOOP一遍遍的重复播放声音,必须与SND_ASYNC标志一块使用。
(3) 使用举例
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows XP启动.wav"), NULL, SND_FILENAME | SND_SYNC);
注意的问题:文件名中的反斜线要用“\\”,因为C语言中“\”默认是转义符,如果要表示“\”则需要使用“\\”,;对中文字符串要使用TEXT宏。
(4) 为啥构建不通过?
#include <mmsystem.h>只是保证编译通过,还要设定link。
解决方案:
工程上点击右键,选“工程设置”,连接,添加“winmm”库。
解决此问题时参考的文章:http://hi.baidu.com/big_foot/blog/item/4822fcd11a7f7cd6562c84e7.html。它虽然描述的是VC中解决此问题的方式,但是记住“一通百通”这个道理,C-Free中添加Link库的方式和VC非常相似,只是操作步骤不同而已。
附录:VC中添加Link库的方式
project->setting->Link下的Object/library modules里加入winmm.lib即可”,他这里用的是英文版,中文版应该是主菜单的【工程】→【设置】→【连接】,将“winmm.lib”加入到“对象/库模块”中。
关于link库
一个程序由源代码变成exe文件有两步:编译Compile;连接Link。
编译是把c文件编译成*.o、*.obj文件,而连接则是把这些*.o、*.obj、*.lib等文件连接到一起成为exe文件。
那什么是*.lib文件呢?以前用TC开发程序的时候用的都是C语言内置的函数,所以不存在使用非内置函数的情况。但是在开发大程序的时候要大量用到非内置的函数,比如PlaySound、MessageBox等等。在使用这些函数的时候需要使用两部分,一部分是*.h头文件,它定义了函数的参数和返回值,另一部分是*.lib文件,是用来进行程序链接用的。
C程序的构建分为编译(Compile)和连接(Link)两个过程,Compile是把源代码编译成*.obj文件,每个源码文件都对应一个*.obj文件,而连接则是把这些*.obj文件以及使用到的非内置函数的*.lib文件连接成一个*.exe文件。所以无论是忘了include *.h文件,还是丢了*.lib文件,都会构建出错。从上面的报错信息可以看出来是Compile成功,但是Link失败。一定要记得C程序编译的这两个过程,面试、笔试的时候常考。
(5) 同步播放音乐
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav", NULL, SND_FILENAME | SND_SYNC);
(6) 体会同步播放和异步播放的差异
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav", NULL, SND_FILENAME | SND_SYNC);
MessageBox(NULL,"同步播放完毕","信息",MB_OK);
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav", NULL, SND_FILENAME | SND_ASYNC);
MessageBox(NULL, "异步播放立即返回", "信息", MB_OK);
A. 同步模式:音乐播放过程中函数不返回,播放完成才返回;
B. 异步模式:在做游戏等需要播放时间较长的音乐时使用,因为程序不会在音乐播放过程中有假死的情况。
有没有同学注意到第二个对话框如果快速关闭的话音乐会中途停止?这是因为程序退出音乐就中断播放了。用户关了游戏,音乐也不能继续播放,应该停止,所以很合理!
(7) 循环播放
我可以做一个小程序,别人在我小程序运行的时候一直听播放的音乐,用异步方式可以保证音乐在后台播放。可是只能播放一遍,能不能音乐来回来去的不断播放呢?答案是使用SND_LOOP标志。
Loop:循环
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
(8) 如果我做一个小游戏,不断播放音乐,可是到达一个关卡的时候希望停止原来的音乐怎么办?
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows XP 启动.wav"), NULL, SND_FILENAME | SND_ASYNC);
MessageBox(NULL,TEXT(""),TEXT(""),MB_OK);
PlaySound(TEXT("C:\\WINDOWS\\Media\\Windows XP 关机.wav"), NULL, SND_FILENAME | SND_ASYNC);
MessageBox(NULL, TEXT(""), TEXT(""), MB_OK);
只能同时播放一段音乐,启动新的、旧的就被停了!
(9) 如果只是想停止目前的播放而不播放新音乐呢?
只要给PlaySound的第一参数传递NULL就可以停止目前的播放了。
PlaySound("C:\\WINDOWS\\Media\\Windows XP 关机.wav", NULL, SND_FILENAME | SND_ASYNC| SND_LOOP);
MessageBox(NULL, "点确定终止音乐", "信息",MB_OK);
PlaySound(NULL, NULL, SND_FILENAME);
MessageBox(NULL, "音乐被终止", "信息", MB_OK);
关于PlaySound函数更多的介绍见:http://zhidao.baidu.com/question/41366091.html
四、 关于API
(1) 什么是API
API是应用程序接口Application Programming Interface的简称。
API就是操作系统提供的一堆库函数,没啥稀奇的。printf、scanf是C语言内置的函数,其他的非内置的库函数都叫API。
(2) 我想找实现某个功能的API怎么办?
以“关闭显示器”为例讲解自学过程。可百度中搜索“关闭显示器 API”。
关闭显示器的API函数:
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
弹出和弹入光驱的API函数:
mciSendString("set cdaudio door open",NULL, 0, 0);
mciSendString("Set cdAudio door closed wait", NULL, 0, NULL);
(3) 怎么我查看MessageBox函数其实是MessageBoxW、MessageBoxA两个函数的宏定义?
Win32API中还有大量这种风格的函数。W结尾的是把字符当成Unicode处理的,A结尾的是把字符当成ASCII处理的。使用时不要直接调用W结尾的或者A结尾的。编译器会在编译时确定调用哪个。
(4) 关于Win32API
Win32API是语言无关的,这点是非常重要的。Win32API是操作系统提供的库函数,可以在C语言中调用,也可以在C++中调用,还可以在C#、Java、Delphi、Python、汇编等各种语言中调用,因此学会了我们这里的C语言Windows程序开发以后只要熟悉一下其他语言的语法就可以很快的用其他语言开发Windows程序,VC、C#、Delphi等语言中的程序界面、网络操作、文件操作等功能都是对Win32API的简单包装而已。
学了咱们JSJ321.com的《C语言也能干大事》以后就掌握了编程开发的“内功心法”,达到了一切语言都是纸老虎的大侠状态,就可以蔑视那些问“学VC还是学C#?”的菜鸟,你怎能不心动?!
五、 课后作业
改进上节课那个恶搞程序,在问不同问题的时候播放不同的音乐。同学提交作业的方式就是把代码以回帖的方式回复本帖。