第一节:安装帮助文档
使用C语言进行Windows开发,必然使用到WindowsSDK。Windows SDK指Windows开发人员工具包,是为使用C语言开发Windows程序所提供的工具集。里面提供的工具异常全面丰富,很少有人能全部了解,在开发Windows应用程序时,应同时使用MSDN,即俗称Windows开发帮助。安装好MSDN后,在程序设计过程中,不记得函数调用方式时,可以在VC中将光标移动到函数名上按下F1帮助键,即可以获得这个函数的所有信息,非常方便;在遇到难解的编译出错信息时,也可在输出栏出错的行上按下F1获得详细的错误说明。由于MSDN有1.2G,无需全部安装,在课程设计阶段,只需要安装全文索引、VC++文档和Platform SDK即可,在开始安装时可选择自定义安装。
图1 MSDN的自定义安装
图2 选择索引,VC,下面还有SDK
第二节:简单的Windows程序(一)
纯粹的Windows编程代码量较大,但是不少代码系统已经帮我们生成,所以初学者快速掌握windows编程的方法就是利用现成的框架,找到需要修改的地方,然后实现设计意图。
类似C语言的学习,Windows编程也应为课程设计建立一个工作空间:
图 3 创建空白工作区
然后向空白工作区中添加我们第一个Windows程序:
图 4 第一步,创建合适的应用程序
图 5 选择典型的HelloWorld程序
直接按下Finish可创建第一个程序。不用去看具体代码,直接编译执行,选择调试执行,可以看到这个程序执行的结果。(注:程序开发阶段应使用调试执行观察程序行为)
图 6 框架程序
程序运行的结果是一个窗口,可以放大缩小或者调整大小,还具有菜单。这些内容在将来都可以由程序员来自己定义。
打开代码WinStep1.cpp,首先观察到得就是一个特殊的main函数——WinMain
程序片段 1 主函数和消息循环
类似C语言下的main, WinMain是程序的入口,具有固定的格式。函数前段有两个LoadString函数调用。其意义是从资源中加载一些字符串。所谓资源,初步的理解可以是这样的:程序员打算发布(编写程序后销售)的应用程序中有一些字符串常量,对话框表现等素材,随着发布地点不同(例如在美国销售和中国销售),所使用的语言提示,对话框布局等均有所不同,但是程序核心的逻辑是不变的。将这些素材统一提取出来专门放在叫做资源文件的文件中,这样若是变更发布地点,只需要将这些资源文件交给专门的翻译和美工去完成,不必涉及到复杂的程序逻辑。这样将程序逻辑与资源分开,使应用程序适应性和灵活性更强了。
第一个LoadString是加载窗口的标题。在图4中就是WinStep1。第二个是窗口的类别名称。关于窗口类,因为我们实际上一行代码都没有改变,所以WinStep实现的功能很有限,但是在将来完善后会逐渐变得功能强大些,从代码而言,是同一个工程的源代码不停地修改,从系统角度来看,也许多个可执行的程序都在磁盘上,为了区分这些程序,可以分类叫做"张三的窗口V1.0",“张三的窗口V1.1”,为了区分不同目的的程序,还可以叫做“斗地主V2.1 by 张三”和“电脑播音员V1.1 by李四”这样的名字。这些由程序员定义的,用来区别计算机中不同窗口目的的字符串,就是窗口类。尝试用下面代码替换掉这两行程序:
程序片段 2 小小地修改
初学者对WinMain中其他代码先不要动。下面观察第二个重要函数WndProc。
WndProc是消息处理函数,当用户动动鼠标或者按下键盘,或者切换窗口等任何由Windows系统预定义的动作,或者是定时器,系统电力不足,有聊天网络消息到来等由程序定义的事件,都会调用这个函数。可以想象这个函数有多么地“忙”。所以任何写在这个函数里的代码都要求非常地“快”。一旦这里某段代码“慢”了,甚至“死循环”了,那么后来的消息就会堆积起来无法处理,从用户角度看,就是这个程序停止响应了。为明确起见,将程序中的WndProc改名为MainWndProc,意即处理主窗口的消息的程序。在修改时,请注意原始代码中有三处WndProc都需要修改——文件最前的位置函数声明,在MyRegisterClass函数调用,以及WndProc函数定义。
前文提到,WndProc主要功能就是处理各种各样的消息,显然考虑这么多大量的消息对程序员是个沉重的负担,幸好Windows本身已经提供了默认的消息处理代码,程序员只需要处理好自己关心的消息就可以了。下面是消息处理函数的模板。
程序片段3 消息处理函数
观察这个MainWndProc函数,hWnd参数表示处理这个消息的窗口,Message表示处理什么类型的消息,wParam和lParam是消息的两个参数,不同的消息,其参数含义不同。如果程序员想要处理某个消息,则一定要去翻阅对应的消息参数的含义。
在程序片段中,程序员处理3个消息,一个是WM_COMMAND,这个消息来自于用户选择某项菜单或者触发了某个按钮。一个是WM_PAINT,这个消息表示用户在窗口里显示些什么。过去学习程序设计都是用printf函数输出的,但是在窗口环境下,有更强大的输出功能——你可以指定输出位置,颜色,甚至可以输出各种图形,真正做到图文并茂。绘图消息处理一定是由BeginPaint开始并由EndPaint结束的。最后是WM_DESTORY。表示将要关闭这个窗口,程序可以在这里增加一些收尾工作。当然也可以什么都不做,只留那个ostQuitMessage函数在那里。
注意到这个大switch~case中,最后的default分句,DefWindowProc调用表示其余剩下的所有消息均由系统默认处理。
我们从菜单处理项开始进入windows编程。
程序片段4 处理菜单入口