1、9录一.2二.12三.18田.22上.26.33六.41七.45八.49九、第一次亲身体灸一百遏的威力!.65十、Socket网以杼卷2.69十 一.73十二、数据唐仔卷.79十田.85口C语言也能孑之事。1、Mingw就是一个C/C+的编译器。编译器和编辑器:编译器其实就是把源代码编译成目标代码的程序;Tc就是一个编辑器:能在里边敲代码,高亮显示,自动提示。2、C-Free里边可以运行、也可以调试。设置断点很简单,就是在要设置断点的代码行前边点 击一下鼠标,有了一个红色小点就说明设置好了断点。3、控制台程序的入口是main,Win32程序的入口是WinMain4、以前用TuborC的同学会问
2、彳十么叫工程?在以前大家用TurboC写的程序一般也就是 一个文件,但是用C语言写大程序的时候不可能把所有的代码都写在一个文件中,肯定要写很 多文件。工程(Project)就是这些问题的一个集合。)在“工程名”中写入你为这个工程取的名 字,最好有一定意义。5、Windows程序的骨干代码:#include int WINAPI WinMain(HINSTANCE hlnstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)(return 0;)6、向Windows的世界问好(1)MessageBox(NULL,TEXT(世界你好)
3、TEXT(问好),MB_OK);第一个参数暂时不讲;第二个是正文;第三个是标题(Caption);第四个是类型。MB.OK就是表示有一个0K按钮【确定】)2/91口C语言也能孑之事。TEXT是一个宏,当字符串中有中文的时候最好用TEXT来包围这个字符串,虽然不使用 TEXT在VC6中没问题,但是在VC7中有问题,而且微软也建议使用TEXT宏,因此在涉及到中 文的场合要使用它。他的作用就是把中文转化成不会乱码的格式。(暂时这么认为 JV问好。,其实_T只是TEXT的一个缩写而已。而且一T在有的低版本里不识别。正XT()低版本也识别。换个样子:MessageBox(NULL,TEXT(世界你好),
4、TEXT(你好)MB_OKCANCEL);可从设置希望在对话框中显示的按钮:#define MB_OKOxOOOOOOOOL#define MB_OKCANCEL0 x0000000IL#define MB_ABORTRETRYIGNORE0 x00000002L#define MB_YESNOCANCEL0 x00000003L#define MB_YESNO0 x00000004L#define MB_RETRYCANCEL0 x00000005L也可以设置对话框中显示的图标:#define MBJCONHAND0 x00000010L#define MBJCONQUESTION0 x00
5、000020L#define MBJCONEXCLAMATION0 x00000030L#define MBJCONASTERISK0 x00000040L比如:MessageBox(NULL,TEXT(世界你好),TEXT(你好)MBCONQUESTION);(2)可是如果我想显示确定、取消按钮的时候同时使用问号图标呢?MessageBox(NULL,TEXT(世界你好),TEXT(你好)MB_OKCANCEL|MBJCONQUESTION);3/91打。语言也能孑大事MessageBox(NULL,TEXT(世界你好),TEXT(你好)MB_ABORTRETRYIGNORE|define
6、MBJCONEXCLAMATION);(3)思考:到这一步如果你只是在背诵“第一组和第二组中间放一个竖线就可以实现两种效果的组合 形式”,那么你未来只会成为一个代码工人。我们要思考一下其背后的原理。首先说T是什么意思?T是位运算里的“或运算,只有对应的两个二进位有一位为1时,结 果位才为1,否则为0o MB_OK、MB.OKCANCEL等的低四位不同,但是高位永远为0;MBCONHAND、MB.ICONQUESTION等的低5至第8位不同,而其他位永远为0。这样“MB_OK、MB_OKCANCEL”组的数值与“MBCONHAND、MBCONQUESTION”组的数值进行或运算后能分另(J保 留
7、各自的部分,也就是在结果值中同时体现两组的取值。拿到1000010以后怎么判断是不是和0000010或运算来的?10000100000010 与&000001010000110000010&0000010这种风格叫掩码”,在Windows编程中这种用法会经常用到。大家想像一下MessageBox的内部实现是怎么样的?if(mode&MB_OK)=MB_OK)(/显示OK按钮)if(mode&MB_ICONQUESTION)=MB_ICONQUESTION)4/91口C语言也能孑之事。显示问好)itoa、atoi 定义在 stdlib.h 中。(4)默认按钮为什么要有默认按钮:一个方便用户,不用
8、思考,直接点回车就可以选择默认按钮;防止用户误操作,默认的按钮应该是最优选的按钮。”是否保存文件?”默认应该是“确定”,“是 否发射导弹?”默认应该是“取消还可以指定哪个按钮是默认按钮,猜一下这些选项的取值的特征是什么?#defineMB_DEFBUTTON10 x00000000L#defineMB_DEFBUTTON20 x00000100L#defineMB_DEFBUTTON30 x00000200L#defineMB_DEFBUTTON40 x00000300L示例代码:MessageBox(NULL,TEXT(你是人吗?),TEXT(火星人)MB.YESNO|MB_ICONQUES
9、TION|MB_DEFBUTTON2);(5)返回值MessageBox是有返回值的,返回值为用户点击的按钮:#define IDOK1#define IDCANCEL2#define ID ABORT3#define IDRETRY4#define IDIGNORE5#define IDYES5/91口C语言也能孑之事。6#define IDNO7代码:int ret=MessageBox(NULL,TEXT(你是人吗?),TEXT(火星人)MB_YESNO I MBJCONQUESTION);if(ret=IDYES)(MessageBox(NULL,TEXT(火星人你好),TEXT(问好
10、),MB_OK);)else(MessageBox(NULL,TEXT(“欢迎回家来TEXT(“问好),MB_OK);)7、课后作业:自己动手写恶搞程序。(1)运行以后弹出询问对话框(有【是】、【否】两个按钮,默认选择【否】按钮,以及 问号图标)“你是好人吗?”,如果点击【是】,则弹出对话框(只有一个【确定】按钮以及一个 警告图标)“你看你就不像好人,点击【确定】开始格式化C盘!”;如果点击【否】,则弹出 对话框(有【重试】、【取消】两个按钮)“尝试把你变成好人失败,是否重试?(2)自己发挥完善上边的恶搞程序。1、MingW就是一个C/C+的编译器。编译器和编辑器:编译器其实就是把源代码编译成
11、目标代码的程序;Tc就是一个编辑器:能在里边敲代码,高亮显示,自动提示。2、C-Free里边可以运行、也可以调试。设置断点很简单,就是在要设置断点的代码行前边点 击一下鼠标,有了一个红色小点就说明设置好了断点。3、控制台程序的入口是main,Win32程序的入口是WinMain6/91口C语言也能孑之事,4、以前用TuborC的同学会问“什么叫工程?”。在以前大家用TurboC写的程序一般也就是 一个文件,但是用C语言写大程序的时候不可能把所有的代码都写在一个文件中,肯定要写很 多文件。工程(Project)就是这些问题的一个集合。)在“工程名”中写入你为这个工程取的名 字,最好有一定意义。5
12、、Windows程序的骨干代码:#include int WINAPI WinMain(HINSTANCE hlnstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)(return 0;)6、向Windows的世界问好(1)MessageBox(NULL,TEXT(世界你好)TEXT(问好)MB_OK);第一个参数暂时不讲;第二个是正文;第三个是标题(Caption);第四个是类型。MB.OK就是表示有一个0K按钮【确定】)TEXT是一个宏,当字符串中有中文的时候最好用TEXT来包围这个字符串,虽然不使用 TEXT在VC6中没问
13、题,但是在VC7中有问题,而且微软也建议使用TEXT宏,因此在涉及到中 文的场合要使用它。他的作用就是把中文转化成不会乱码的格式。(暂时这么认为 JV问好),其实一T只是TEXT的一个缩写而已。而且一T在有的低版本里不识别。正XT()低版本也识别。换个样子:MessageBox(NULL,TEXT(世界你好)TEXT(你好)MB_OKCANCEL);可从设置希望在对话框中显示的按钮:#define MB_OKOxOOOOOOOOL#define MB_OKCANCEL7/91打。语言也能孑大事0 x00000001L#define MB_ABORTRETRYIGNORE0 x00000002L
14、#define MB_YESNOCANCEL0 x00000003L#define MB_YESNO0 x00000004L#define MB_RETRYCANCEL0 x00000005L也可以设置对话框中显示的图标:#define MBJCONHAND0 x00000010L#define MBJCONQUEST1ON0 x00000020L#define MBJCONEXCLAMATION0 x00000030L#define MBJCONASTERISK0 x00000040L比如:MessageBox(NULL,TEXT(世界你好),TEXT(你好)MBJCONQUESTION);
15、(2)可是如果我想显示确定、取消按钮的时候同时使用问号图标呢?MessageBox(NULL,TEXT(世界你好),TEXT(你好)MB_OKCANCEL|MBJCONQUESTION);MessageBox(NULL,TEXT(世界你好),TEXT(你好)MB_ABORTRETRYIGNORE|define MBJCONEXCLAMATION);(3)思考:到这一步如果你只是在背诵“第一组和第二组中间放一个竖线就可以实现两种效果的组合 形式”,那么你未来只会成为一个代码工人。我们要思考一下其背后的原理。首先说T是什么意思?T是位运算里的或运算,只有对应的两个二进位有一位为1时,结 果位才为1
16、,否则为0o MB_OK、MB_OKCANCEL等的低四位不同,但是高位永远为0;MBJCONHAND、MB_ICONQUESTION等的低5至第8位不同,而其他位永远为0。这样MB_OK、MB_OKCANCEL”组的数值与“MBJCONHAND、MBCONQUESTION”组的数值进行或运算后能分另U保 8/91打。语言也能孑大事留各自的部分,也就是在结果值中同时体现两组的取值。拿到1000010以后怎么判断是不是和0000010或运算来的?10000100000010 与&000001010000110000010&0000010这种风格叫号奄码,在Windows编程中这种用法会经常用到。
17、大家想像一下MessageBox的内部实现是怎么样的?if(mode&MB_OK)=MB_OK)(/显示OK按钮)if(mode&MB_ICONQUESTION)=MBJCONQUESTION)(显示问好)itoa、atoi 定义在 stdlib.h 中。(4)默认按钮为什么要有默认按钮:一个方便用户,不用思考,直接点回车就可以选择默认按钮;防止用户误操作,默认的按钮应该是最优选的按钮。”是否保存文件?”默认应该是确定”,“是 否发射导弹?”默认应该是“取消还可以指定哪个按钮是默认按钮,猜一下这些选项的取值的特征是什么?#defineMB_DEFBUTTON10 x00000000L#defi
18、ne9/91口C语言也能孑之事。MB_DEFBUTTON20 x00000100L#defineMB_DEFBUTTON30 x00000200L#defineMB_DEFBUTTON40 x00000300L示例代码:MessageBox(NULL,TEXT(你是人吗?),TEXT(火星人)MB.YESNO|MB_ICONQUESTION|MB_DEFBUTTON2);(5)返回值MessageBox是有返回值的,返回值为用户点击的按钮:#define IDOK 1#define IDCANCEL2#define ID ABORT3#define IDRETRY4#define IDIGNO
19、RE5#define ID YES6#define IDNO7代码:int ret=MessageBox(NULL,TEXT(你是人吗?),TEXT(”火星人),MB_YESNO I MBJCONQUESTION);if(ret=IDYES)(MessageBox(NULL,TEXT(火星人你好),TEXT(问好),MB_OK);else(MessageBox(NULL,TEXT(欢迎回家来),TEXT(问好),MB_OK);10/91口C语言也能孑之事。7、课后作业:自己动手写恶搞程序。(1)运行以后弹出询问对话框(有【是】、【否】两个按钮,默认选择【否】按钮,以及 问号图标)“你是好人吗?
20、,如果点击【是】,则弹出对话框(只有一个【确定】按钮以及一个 警告图标)“你看你就不像好人,点击【确定】开始格式化C盘!”;如果点击【否】,则弹出 对话框(有【重试】、【取消】两个按钮)“尝试把你变成好人失败,是否重试?(2)自己发挥完善上边的恶搞程序。11/91口C语言也能孑之事,1、上节课作业点评:海豚天使作业:写的非常好,99分。唯一的改进点就是“if else中的代码哪怕只有一行也要 用大括号括起来”。VansOS:一个可取之处是TEXT。”的应用;把whilecontinue用的很好;符合了“if else中的 代码哪怕只有一行也要用大括号括起来的要求。100分。3、怎么打开VC6、
21、VC7、DevC+的工程?C-Free4.0用【工具】一【工程转换】。C-Free4.1的话,直接把工程文件拖进来就可以。大家以后从网上下载了别的写的C语言程序,有可能用VC写的,所以要转换一下。下了 VC的程序不用担心,C-Free是支持的。语言、IDE都是互通的,“一通百通”。4、为什么代码自动提示不出来?怎么增加自动提示的数量?【工具】一【编辑器选项】一【代码提示】。显示最大条数、输入几个字符后才激活。建 议改成10、15、怎么修改新建文件的默认文件名为co【工具】一【环境选项】、修改新建文件类型”6、每次都输入WinMain以及那些参数,很麻烦,有没有快速方式?添加自己的模板“。【工具
22、】一【编辑器选项】一【代码模板】,点击【添加】按钮,为模 板选一个名字,然后将代码模板粘贴到“代码”框中。使用方式:在编辑器中点击鼠标右键,选择【模板】,然后选择创建的代码模板。7、怎么生成exe程序。怎么把做好的exe程序发给别人?12/91打。语言也能孑大事主菜单【工具】一【定位到工程文件夹】跳转到工程的文件夹,也可以在我的电脑里直接 进入工程文件夹。mingw2.95目录下生成的exe文件就是生成好的可执行文件,发给别人就可以。8、播放声音文件(1)用途:游戏里播放音乐;自己动手给女友做音乐贺卡(图片、滚动的字母、温馨的 音乐)(2)可以使用PlaySound。函数播放声音文件,该函数原
23、型位于include 中,因 此要使用PlaySound,首先需要添加对这个头文件的引用。提示:mm就是MultiMedia的简写,多媒体(3)函数原型为:BOOL PlaySound(LPCSTR pszSound,HMODULE hmod.DWORD fdwSound);返回值表示是否播放成功。参数pszSound是要播放声音的文件名,只支持WAV等格式的文件;去用“wav”为关键词可以搜到很多wav音乐,也可以用工具将其他格式的转换为wav格式的。参数hmod是应用程序的实例句柄,一般传递NULL就可以;参数fdwSound是标志的组合掩码,可选值有SND_FILENAME、SND_AS
24、YNC、SND_SYNC等。SND_FILENAME表示pszSound参数指定的是文件名(pszSound还可以指定资源、内存音乐、系 统音乐等等);SND_ASYNC:用异步方式播放声音,PlaySound函数在开始播放后立即返回;SND_SYNC:同步播放声音,在播放完后PlaySound函数才返回;SND_LOOP 一遍遍的重复播放 声音,必须与SND_ASYNC标志一块使用。(4)使用举例:PlaySound(TEXT(C:WINDOWSMediaWindows XP 启J.wav),NULL,SND_FILENAME|SND_SYNC);13/91打。语言也能孑大事注意的问题:文件
25、名中的反斜线要用“,因为C语言中T默认是转义符,如果要表示,”则 需要使用“”,对这点不明白的请回去翻一下C语言的书;对中文字符串要使用TEXT宏。(5)为啥构建不通过?include 只是保证编译通过,还要设定linko解决方案:工程上点击右键,选工程设置”,连接,添加“winmm”库。解决此问题时参考的文章:http:/ 它虽然描述的是VC中解决此问题的方式,但是记住一通百通”这个道理,C-Free中添加Link 库的方式和VC非常相似,只是操作步骤不同而已。附录:VC中添力口 Link库的方式:project-setting-Link 下的 Object/library modules
26、里加入 winmm.lib 即可,他这里用的是英文 版,中文版应该是主菜单的【工程】7【设置】一【连接】,将“winmm.lib”加入到“对象/库模块”中。(6)接上面的问题:关于link库一个程序由源代码变成exe文件有两步:编译Compile;连接Linko编译是把c文件编译 成.0、.obj文件,而连接则是把这些.0、.明、ib等文件连接到一起成为exe文件。这点不清楚 的请回去查看C语言的教材。那什么是*ib文件呢?大家以前用TC开发程序的时候用的都是C语言内置的函数,所以 不存在使用非内置函数的情况。但是在开发大程序的时候要大量用到非内置的函数,比如 PlaySound、Messag
27、eBox等等。在使用这些函数的时候需要使用两部分,一部分是*.h头文件,它定义了函数的参数和返回值,另一部分是*如文件,是用来进行程序链接用的。C程序的构 建分为编译(Compile)和连接(Link)两个过程,Compile是把源代码编译成*.obj文件,每个源 14/91打。语言也能孑大事码文件都对应一个*Qbj文件,而连接则是把这些*.obj文件以及使用到的非内置函数的*ib文件 连接成一个*.exe文件。所以无论是忘了 include*.h文件,还是丢了*ib文件,都会构建出错。从 上面的报错信息可以看出来是Compile成功,但是Link失败。一定要记得C程序编译的这两个 过程,面试
28、、笔试的时候常考。(7)同步播放音乐PlaySound(C:WINDOWSMediaWindows XP 关机.wav”,NULL,SND_FILENAMEISND_SYNC);(8)体会同步播放和异步播放的差异:PlaySound(C:WINDOWSMediaWindows XP 关机.wav”,NULL,SND_FILENAMEISND_SYNC);MessageBox(NULL,同步播放完毕信息,MBJDK);PlaySound(C:WINDOWSMediaWindows XP 关机.wav”,NULL,SND_FILENAMEISND_ASYNC);MessageBox(NULL,”异
29、步播放立即返回,信息”,MBJDK);同步模式:音乐播放过程中函数不返回,播放完成才返回异步播放在做游戏等需要播放时间较长的音乐时使用,因为程序不会在音乐播放过 程中有假死的情况。有没有同学注意到第二个对话框如果快速关闭的话音乐会中途停止?这是因为程序退出 音乐就中断播放了。用户关了游戏,音乐也不能继续播放,应该停止,所以很合理(9)我可以做一个小程序,别人在我小程序运行的时候一直听播放的音乐,用异步方式 可以保证音乐在后台播放。可以只能播放一遍,能不能音乐来回来去的不断播放呢?答案是使 用SND_LOOP标志。Loop:循环PlaySound(C:WINDOWSMediaWindows XP
30、 关机.wav,NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);15/91打。语言也能孑大事(10)如果我做一个小游戏,那么希望向上边那样不断播放,可以到达一个关卡的时候希 望停止原来的音乐怎么办?PlaySound(TEXT(C:WINDOWSMediaWindows XP 启动.wav),NULL,SND_FILENAME|SND_ASYNC);MessageBox(NULL,TEXT(),TEXT(),MB_OK);PlaySound(TEXT(C:WINDOWSMediaWindows XP 关ta.wav),NULL,SND_FILENAME|SND_AS
31、YNC);MessageBox(NULL,TEXT(),TEXT(),MB_OK);只能同时播放一段音乐,启动新的、旧的就被停了(11)如果只是想停止目前的播放而不播放新音乐呢?只要给PlaySound的第一参数传递NULL就可以停止目前的播放了。PlaySound(C:WINDOWSMediaWindows XP 关机wav,NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);MessageBox(NULL,点确定终止音乐信息,MB_OK);PlaySound(NULL,NULL,SND_FILENAME);MessageBox(NULL,音乐被终止 T 信息,MB_
32、OK);(12)关于 PlaySound 函数更多的介绍见:http:/ Alication Interface的简称)?什么叫Win32 API?API就是操作 系统提供的一堆库函数,没啥稀奇的。prints scanf是C语言内置的函数,其他的非内置的库函 数都叫API0(2)我想找实现某个功能的API怎么办?以关闭显示器为例讲解自学过程。(3)怎么我查看MessageBox函数其实是MessageBoxW,MessageBoxA两个函数的宏定义?16/91口C语言也能孑之事。Win32API中还有大量这种风格的函数。W结尾的是把字符当成Unicode处理的,A结尾的是把 字符当成ASCI
33、I处理的。使用时不要直接调用W结尾的或者A结尾的。编译器会在编译时确定 调用哪个。(4)Win32API是语言无关的,这点是非常重要的。Win32API是操作系统提供的库函数,可以在C语言中调用,也可以在C+中调用,还可以在C#、Java、Delphi.Python、汇编等各 种语言中调用,因此学会了我们这里的C语言Windows程序开发以后只要熟悉一下其他语言 的语法就可以很快的用其他语言开发Windows程序,VC、C#、Delphi等语言中的程序界面、网 络操作、文件操作等功能都是对Win32Apl的简单包装而已。学了咱们如鹏网的C语言也能干 大事以后就掌握了编程开发的内功心法”,达到了
34、一切语言都是纸老虎的大侠状态,就可以 蔑视那些问学VC还是学C#?”的菜鸟,你怎能不心动?!10、课后作业:改进上节课那个恶搞程序,在问不同问题的时候播放不同的音乐。同学提 交作业的方式就是把代码以回帖的方式回复本帖。17/91口C语言也能孑之事。1、作业点评:CALF的程序满足了所有要求,而且对do.while、switch.case等C语言的语 法用的很好,注意了很多细节问题。因此给100分。2、同学问题:怎么给程序添加图标把一个ico图标放到工程下;使用ResEd在工程下新建一个资源文件(工程),然后点击【工 程】一【资源】,添加一个ICON类型的资源,文件名选择刚才的ico图标,然后保
35、存这个资源文件,保证这个资源的ID为最小(一般设 置为0就可以X在C-Free里的OtherFiles中点右键,选择添加文件到文件夹”,将rc文件加入,重新编译即可。注意:有的同学反应添加图标以后程序还是没有图标,有可能是操作不当,有可能是工具 的Bug。因此如果没有效果的话不要在这里浪费太多时间,因为这并不是关键点,不要在这浪 费太多时间。3、结构体及指针(这部分内容具体请参考C语言的教材)struct MyStruct(int fl;int f2;最常用的定义结构体的方式。typedef int MYInt;/使用 typedef 定义类型别名typedef MyStruct JSJ321
36、 Struct;结构体别名的声明typedef MyStruct*PMyStruct;/PMyStruct 是 MyStruct 指针的声明。typedef struct MyStruct(int fl;int f2;18/91打。语言也能孑大事 JSJ321 Struct;/把 MyStruct 的定义和定义 MyStruct 的别名为 JSJ321 Struct 结合到了一起。typedef struct MyStruct(int fl;int f2;*PMyStruct;把MyStruct的定义和定义MyStruct的指针别名PMyStruct的定义结合到了一起。typedef stru
37、ct MyStruct(int fl;int f2;JSJ321 Struct,*PMyStruct;/把 MyStruct 的定义和定义 MyStruct 的别名为 JSJ321 Struct 以及定义 MyStruct的指针别名PMyStruct的定义结合到了一起。4、最普通的结构体声明。MyStruct s1;5、给结构体所有字段置零复习一下C语言中memset以及结构体的应用。C语言中声明一个结构体变量之后,在使用这个变量之前要首先用memset来把各个位清零。使用C语言内置的函数memset来完成:memset(&s1,sizeof(s1),0);在这里我们使用ZeroMemory函
38、数,ZeroMemory其实并不是函数,看一下ZeroMemory的定 义:#define ZeroMemory RtIZeroMemory;ZeroMemory 其实编译的时候会宏展开为 RtlZeroMemory0#define RtlZeroMemory(dJ)RtlFillMemory(d),(I),0)/RtIZeroMemory又是RtIFillMemory的一个宏定义,而且是带参数的宏定义。#define RtlFillMemory(d,l,f)memset(d),(f),(I)II RtIFillMemory其实是memset的宏定义ZeroMemory其实就是memset,纸
39、老虎而已,不是一个全新的函数。6、打开文件对话框的使用OPENFILENAME ofn;char szFileMAX_PATH;19/91口C语言也能孑之事。ZeroMemory(&ofn,sizeof(ofn);ofn.lStructSize=sizeof(ofn);ofn.lpstrFile=szFile;ofn.lpstrFile0=TEXT(0);ofn.nMaxFile=sizeof(szFile);ofn.lpstrFilter=TEXT(ALL0*.*0Text0*.TXT0);ofn.nFilterlndex=1;ofn.lpstrFileTitle=NULL;ofn.nMax
40、FileTitle=0;ofn.lpstrlnitialDir=NULL;ofn.Flags=OFN_EXPLORER IOFN_PATHMUSTEXIST I OFN_FILEMUSTEXIST;if(GetOpenFileName(&ofn)(MessageBox(NULL,szFile,MB_OK);)下面将对这段代码作解释:(1 ZeroMemory的含义见上边(2)char szFileMAX_PATH;/定义一个长度为 MAX,PATH 的 char 数组。MAX一PATH是系统定义的一个宏,260o Windows操作系统文件路径的最大长度。(3)ofn.lpstrFile=sz
41、File;/szFile是一个字符数组,那么szFile这个名字就代表这个字符数组的首地址这是一个指针的应用,把接收选择文件名的数组的地址传递到GetOpenFileName函数中。(4)ofn.lpstrFile0=TEXT(0);效果等价于 ZeroMemory(szFile,sizeof(szFile)/sizeof(chaij);(5)文件类型过滤器一就表示所有文件*仅就表示所有文本文件abc*.*就表示所有以abc开头的文件abc*.txt就表示所有以abc开头的文本文件(txt)ofn.lpstrFilter=TEXT”山0*.*0Text0*.TXT0);用“0”分割出几个段,每
42、两段是一组过滤器,每组 20/91打。语言也能孑大事的第一个段代表过滤器的显示的值,而第二段表示真正的过滤器(6)ofn.nFilterlndex=2;默认选择第几个过滤器,是1开始的,不是0.这也是试验出来的。(7)windows的一个惯例:结构体的指针类型别名一般是LP+结构体的名字GetOpenFileName(&ofn)而不是 GetOpenFileName(ofn),因为 GetOpenFileName 函数要的是 OPENFILENAME 的指针(8)只要用户还没关闭对话框那么GetOpenFileName函数是停住的,同步模式的PlaySound 以及getchar、scant是
43、一样的。用户关闭对话框,GetOpenFileName函数返回,返回值是BOOL,等于TRUE表示用户选择 了文件,如果等于FALSE就表示用户选择了【取消】按钮21/91打。语言也能孑大事注意:有同学反应添加控件以后程序编译没报错,但是运行没有反应,请看此贴:【常见 问题】程序编译不报错,为什么点击运行无反应?http:/ 则就又变成“我教同学们学”的填鸭式教育了。课上练习:打开对话框,用户选择一个音乐文件,然后用PlaySound播放。(3)打开多个文件:增加OFN.ALLOWMULTISELECT选项后测试一下。发现如果选择一个文件后显示的还是这 个文件的路径,可是如果选择多个文件显示的
44、就只有目录的路径,怎么回事?调试一下,看看szFile在内存中的样子。调试的是发现内存中的样子是目录的路径然后加 上各个文件名,中间用“0”分割,现在明白为啥值显示目录的路径了吗?同学们举手回答。大家明白这一点就可以了,有兴趣的可以课后来做多文件选择的处理。做播放器的时候经 常需要这个功能,也就是播放列表。有一篇文章可以参考一下:http:/ 也跑来凑热闹,吼吼。如果需要保存文件覆盖提示怎么办呢?看看OFN有选项吗?OFN_OVERWRITEPROMPT3、对话框程序22/91打。语言也能孑大事(1)创建一个对话框程序并运行(2)先打开dig文件然后点击主菜单的【工具】一【资源编辑器】,也可以
45、在文件上点右 键选择【打开方式】一 ResourceEditor0外行看热闹、内行看门道,思考一下第一个打开方式的原理,很多软件都这么搞,支持外 接软件在资源编辑器中编辑对话框界面并且拖放控件上去(3)什么叫做“对话框程序”,和以前学的窗口程序有什么区别吗?“对话框程序是一种特殊的窗口程序”,与窗口程序”比起来学习难度比较小,最重要的是 可以使用可视化的对话框编辑器。对话框程序能够完成大部分功能,但是有小部分功能还是要 用窗口程序”,对话框程序能完成的功能是“窗口程序”的一介子集,学习“对话框程序”中的知 识点可以完全应用到“窗口程序”上去。让大家快乐学习,快速做出东西,所以咱们先学习对话 框
46、程序的开发。(4)常用控件介绍。RichEdit、UDC控件要是使用的话要加代码,后面会讲。4、嵌入式资源(1)资源的概念。word里边插入图片有:嵌入和链接两种方式。web 里边是连接方式。为什么要有资源。把图片和EXE文件放到一起,一个文件夹底下。我更喜欢的方式,只 要一个EXE文件,你把用到的所有图片、歌曲音乐、动画EXE里边去。这些东西就是资源。资源和代码区分开。EXE文件两部分:代码和资源。(2)惯例:所有资源的名字都是ID开头,并且大写,ID后边一般跟着一个资源类型的大 23/91打。语言也能孑大事写字母,对话框D、Bmp图片B、图标I。接着是下划线,最后是真正的名称。5、对话框中
47、图片、动画资源的应用(1)BitMap:在资源中加入BITMAP类型的资源,然后 拖一个IMAGE控件过来,并且修改IMAGE控件的Type属性为BitMap,并且给资源一个名字(一 般以IDB_开头,并且大写,这是规范,不是必须)并且在控件的Image属性中选择刚才添加的 BITMAP资源。虽然可以直接选择,但是还是建议直接把图片拷贝到工程目录下,因为。jpg 的格式怎么转换为bmp格式的呢?用画图工具(mspaintI(2)动画:在资源中加入AVI类型 的资源,然后拖一个Animation控件过来,在AVIClip属性中选择刚才添加的AVI资源,并且给资 源一个名字(一般以IDV_开头,并
48、且大写,这是规范,不是必须如果需要自动播放,则修 改AutoPlay属性为Trueo AVI动画资源非常少,但是GIF动画非常多,可以用工具将GIF转换为 AVI格式。注意很多电影的格式也是AVI后缀,但是那并不是咱们这里说的AVI动画。AVI格式 是一个大杂火会。GIF 转 AVI 的工具:http:/ 行却没反应”,请参考下面的文章:程序编译没错,但运行无反应?http:/ PlaySound 函数)6、菜单资源制作好菜单资源后,在对话框的Menu属性中选择刚才制作好的对话框。7、只有控件、菜单,可以点击控件、菜单以后的动作怎么做呢?就要写代码了。同学提问:24/91打。语言也能孑大事(1
49、)BMP的图片不是很大吗,这么插入资源会不会使得最后编译的程序体积很大答:对,确实会使得文件比较大,但是一般软件里嵌入的图片都是起到装饰作用,所以东 西不会太多。而且你生成的EXE文件还可以压缩。(2)IDB_TEST1 BITMAP DISCARDABLE D:/My Documents/OOI.BMP刚才讲的是链接式的还是嵌入式的啊,为什么dialogs的代码里面会有这个bmp文件的路 径啊 不是嵌入进去了吗?如果这个时候我吧001.bmp挪走还会显示吗?答:这个路径是编译时用到的,所以在编译的时候如果把图片挪走就会编译失败。但是一 旦编译成功就不需要001.bmp 了。建议把所有资源都放
50、到工程目录下,这样可以随便移动工程。25/91口C语言也能孑之事。1、在编写控制台程序的时候一切流程都是有先后关系、并行的,而且所有函数都是由我 们来调用的,比如下面的实例性代码:printf(确定请输入y,取消输入n);char c=getchar();if(c=y)(/)else if(c=n)(III)我们可以用getchar来等待用户输入一个值。但是到了 Windows编程中就不一样了,同一时 刻用户即可能点击0K按钮,又可能点击Cancel按钮,又可能在文本框中输入几个字,还可能在窗口上双击几下,这样就无法同时等待用户的这些动作。为了解决这个问题,Windows 引入了消息机制(也可