MFC利用WindowsAPI开发Win32程序实例_第1页
MFC利用WindowsAPI开发Win32程序实例_第2页
MFC利用WindowsAPI开发Win32程序实例_第3页
MFC利用WindowsAPI开发Win32程序实例_第4页
MFC利用WindowsAPI开发Win32程序实例_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、10/20/2021windows程序开发 讲师:鲍钰1利用windows api开发win32程序实例 10/20/2021windows程序开发 讲师:鲍钰2windows程序nwindows程序分为“程序代码”和“ui资源”两大部分。ui即user interface,用户界面。nui资源包括功能菜单、对话框外观、程序图标、光标形状等等。10/20/2021windows程序开发 讲师:鲍钰310/20/2021windows程序开发 讲师:鲍钰4窗口n1不是黑底白字不是黑底白字n2. 而是而是 n框架菜单按钮滚动条框架菜单按钮滚动条n称为窗口要素称为窗口要素n3. 窗口类型窗口类型 n

2、console 文字类型文字类型nwindow 菜单菜单+用户区域用户区域ndialognmessage boxn4. 实现途径实现途径gdi(图形设备接口,(图形设备接口,gdi32.dll)10/20/2021windows程序开发 讲师:鲍钰5n创建一个空的win32 application工程,工程名为hello world。n下一步,在空的工程中加入c+语言的源程序文件。在visual c+ 6.0的file菜单中选择new选项;在弹出的file菜单中选择c source file;选中add to project 选框;选中加入到那个工程中,这里是hello world,就是刚才创

3、建的工程;填写文件名,这里是helloworld,下面是工程的存放路径;最后,选择ok10/20/2021windows程序开发 讲师:鲍钰6目录hello world#includeint winapi winmain( hinstance hinstance, hinstance hprevinstance, lpstr lpcmdline, int ncmdshow) messagebox ( null, text(info: hello world!), text(title: my 1st program), mb_ok); return 0;10/20/2021windows程序开

4、发 讲师:鲍钰7n#includen程序包含了一个头文件windows.h ,基本上所有的windows程序都会包含这个文件。它定义了windows的基本数据类型、数据结构、系统函数等。10/20/2021windows程序开发 讲师:鲍钰8nwindows api(application programming interface)是windows操作系统与应用程序之间的标准接口,它提供了上千个标准函数,宏和数据结构的定义.api函数定义在一些动态链接库中(.dll),其中,最主要的是user.dll,gdi.dll和kernel.dll3个dll文件.nuser.dll库中定义了窗口管理函

5、数,包括窗口的创建,显示,移动等;ngdi.dll中定义了许多图形,图像设备函数(gdi),提供了与设备无关的图形绘制功能;nkernel.dll定义了系统服务函数,包括内存调度,进程管理等与操作系统有关的低层函数.api函数10/20/2021windows程序开发 讲师:鲍钰9nwindows程序是以winmain函数为入口的,这个函数的定义如下:n函数原型函数原型 int winapi winmain ( nhinstance hinstance ,nhinstance hprevinstance ,nlpstr lpcmdline ,nint ncmdshow);n第一个参数hinst

6、ance是当前实例句柄,为一个整数,用于标识窗口、程序等。n第二个参数hprevinstance 被置为null。n第三个参数lpcmdline是运行程序的命令行。n第四个参数ncmdshow用于指定程序窗口最初的显示模式,可以在初始是指定是正常还是最大化等。nwinmain函数返回一个整数。winapi用于指定调用约定,具体在windeh.h中定义。10/20/2021windows程序开发 讲师:鲍钰10nmessagebox是一个windows api函数,用于弹出一个对话框,显示一些简短的信息。定义如下:n函数原型函数原型messagebox ( hwnd hwnd , nlpctst

7、r lptext ,nlpctstr lpcaption ,nuint utype ) ; n第一个参数hwnd是一个窗口句柄,表明对话框所属的窗口。n第二个参数lptext是一个字符串,表明需要显示的信息。text是一个宏。n第三个参数lpcaption是一个字符串,表明对话框的标题。n第四个参数utype用于指定对话框中的按钮和图标。各种按钮和图标类型可以同时使用,用“ | ”连接,如“mb_ok | mb_error” 。10/20/2021windows程序开发 讲师:鲍钰11n类型按钮图标nmb_ok确定-nmb_okcancel确定和取消-nmb_yesno是和否-nmb_yesn

8、ocancel是和否和取消-nmb_iconinformation-提示nmb_iconwarning-警告nmb_iconerror-出错n试试让系统弹出不同的对话框10/20/2021windows程序开发 讲师:鲍钰12n#define mb_ok 0 x00000000ln#define mb_okcancel 0 x00000001ln#define mb_abortretryignore 0 x00000002ln#define mb_yesnocancel 0 x00000003ln#define mb_yesno 0 x00000004ln#define mb_retrycan

9、cel 0 x00000005ln#define mb_iconquestion 0 x00000020ln#define mb_iconexclamation 0 x00000030ln#define mb_iconasterisk 0 x00000040ln#define mb_iconwarning mb_iconexclamationn#define mb_iconinformation mb_iconasteriskn#define mb_defbutton1 0 x00000000ln#define mb_defbutton2 0 x00000100ln#define mb_def

10、button3 0 x00000200l10/20/2021windows程序开发 讲师:鲍钰13n用messagebox()的返回值判断,返回值含意如下: idabort:abort 按钮被选中。 idcancel:cancel按钮被选中。 idignore:ignore按钮被选中。 idno:no按钮被选中。 idok:ok按钮被选中。 idretry:retry按钮被选中。 idyes:yes按钮被选中。 10/20/2021windows程序开发 讲师:鲍钰14目录hello worldint result; result=messagebox ( null, text(info: h

11、ello world!), text(title: my 1st program), mb_abortretryignore|mb_iconquestion+mb_defbutton2);switch (result)case idabort:messagebox(null,你点了终止按钮你点了终止按钮,结果结果,mb_iconinformation|mb_ok);break;case idretry:messagebox(null,你点了重试按钮你点了重试按钮,结果结果,mb_iconinformation+mb_ok);break;case idignore:messagebox(null

12、,你点了忽略按钮你点了忽略按钮,结果结果,mb_iconinformation|mb_ok);break;10/20/2021windows程序开发 讲师:鲍钰15目录hello worldresult=messagebox(null,你是男生吗?,性别调查,mb_yesno); if(result=idyes)messagebox(null,男生,结果,mb_iconwarning|mb_ok);/*如果点击了“是”*/ else messagebox(null,女生,结果,mb_iconinformation|mb_ok);/*否则*/ 10/20/2021windows程序开发 讲师:鲍

13、钰16text 宏的主要作用是当定义了 unicode/_unicode 预处理指令时,字符串被标志为双字节字符串。nunicode 是目前用来解决 ascii 码 256 个字符限制问题的一种比较流行的解决方案。大家知道,ascii 字符集只有256个字符,用 0-255 之间的数字来表示。包括大小写字母、数字以及少数特殊字符;如标点符号、货币符号等。对于大多数拉丁语言来说,这些字符已经够用。但是,许多亚洲和东方语言所用的字符远远不止256个字符。有些超过千个。人们为了突破 ascii 码字符数的限制,试图用一种简单的方法来针对超过256个字符的语言编写计算机程序。于是 unicode 应运

14、而生。unicode 通过用双字节来表示一个字符,从而在更大范围内将数字代码映射到多种语言的字符集。10/20/2021windows程序开发 讲师:鲍钰17事件和事件驱动nwindows程序为消息而“生”,因消息而“死” windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(events)产生的消息(message)。 n事件通常以以下三种方式产生n通过输入设备,如键盘和鼠标n通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件n来自windows内部10/20/2021windows程序开发 讲师:鲍钰18基于事件驱动的程序模型事件和事件驱动开始

15、执行初始化从消息队列取得一个消息终止执行当前消息是否“退出”消息?是否本程序要处理的消息?默认处理处理消息ynyn10/20/2021windows程序开发 讲师:鲍钰19消息的数据结构消息的数据结构消息的数据结构msg的定义如下:typedef struct tagmsg hwnd hwnd; /用以检索消息的窗口句柄 uint message;/消息值 wparam wparam;/包含有关消息的附加信息lparam lparam; /随不同的消息而有所不同dword time;/消息送到队列的时间point pt; /消息发送时,屏幕光标的位置msg;消息的描述10/20/2021win

16、dows程序开发 讲师:鲍钰20用户交互内核user窗口1窗口函数wndproc消息队列窗口2窗口函数wndproc消息队列支持队列特征的消息驱动模型 消息的描述10/20/2021windows程序开发 讲师:鲍钰21 windows常用消息常用消息wm_lbuttondown:单击鼠标左键时产生的消息;wm_lbuttonup:放开鼠标左键时产生的消息;wm_rbuttondown:单击鼠标右键时产生的消息;wm_rbuttonup:放开鼠标右键时产生的消息;wm_lbuttondblclk:双击鼠标左键时产生的消息;wm_rbuttondblclk:双击鼠标右键时产生的消息;wm_cre

17、ate:createwindows()函数产生的消息;wm_close:关闭窗口时产生的消息;wm_quit:退出应用程序时由postquitmessage()发出的消息;wm_paint:windows系统需要重绘时产生的消息。 消息的描述10/20/2021windows程序开发 讲师:鲍钰22system一个具体的窗口程序10/20/2021windows程序开发 讲师:鲍钰23nwinmain()程序入口点n注册窗口 registerclass()n生成并显示窗口 createwindow() showwindow()n消息循环nwndproc()窗口函数(功能实现)n区分消息 swi

18、tchn根据消息触发相应处理n调用defwindowproc()不处理的消息、和需要系统进一步处理的消息如wm_close,使用者关闭了窗口。应用程序获得这个消息后,释放了自己的资源,然后让系统进一步执行关闭窗口的动作windows程序组成 10/20/2021windows程序开发 讲师:鲍钰24详解入口 10/20/2021windows程序开发 讲师:鲍钰25详解入口 winmain函数的原型如下:int winapi winmain (hinstance hinstance, / 当前实例句柄当前实例句柄hinstance hprevinstance, / 以前的实例句柄以前的实例句柄

19、lpstr lpcmdline, / 指向命令行参数的指针指向命令行参数的指针int ncmdshow ) / 窗口的显示状态窗口的显示状态10/20/2021windows程序开发 讲师:鲍钰26初始化包括初始化包括n窗口类的定义n注册窗口类n创建窗口n显示窗口 需要注意的是,在显示窗口showwindow函数后,需调用updatewindow()函数更新并绘制用户区,并发出wm_paint消息。详解窗口 10/20/2021windows程序开发 讲师:鲍钰27n注册窗口registerclass( )在注册之前可以设置窗口属性,系统会给出一些缺省值,我们重点关心其中的lpfnwndpro

20、c参数详解窗口 10/20/2021windows程序开发 讲师:鲍钰28ncreatewindow()详解窗口 hwnd createwindow( lpctstr lpclassname, / 已注册的窗口类名 lpctstr lpwindowname, / 窗口标题 dword dwstyle, / 窗口风格 int x, / 窗口的水平位置 int y, / 窗口的垂直位置 int nwidth, / 窗口宽度 int nheight, / 窗口高度 hwnd hwndparent, / 父窗口句柄 hmenu hmenu, / 菜单句柄或控件标识 hinstance hinstanc

21、e, / 应用程序实例句柄 lpvoid lpparam ) / 其他窗口创建时的参数数据10/20/2021windows程序开发 讲师:鲍钰29n消息n本身是一个unsigned int变量n类型有nwm_command: 系统命令类,菜单选择,按钮等nwm_paint: 对窗口作图nwm_destory: 关闭窗口nwm_user: 用户可自定义一些消息n在某个特定类型之下,更有许多事件,一般通过wparam通知详解消息10/20/2021windows程序开发 讲师:鲍钰30while(getmessage(&msg) translatemessage(&msg);/消

22、息转换 dispatchmessage(&msg); ngetmessage具有阻塞机制n当消息队列中没有消息时,程序非忙等,而是让权等待n当收到wm_quit时,getmessage返回false,循环停止,同时应用程序终止。ndispatchmessagen通过user模块协助,将消息传递到wndprocnwndproc的调用指示在注册窗口类时,已向系统指明详解消息采集 10/20/2021windows程序开发 讲师:鲍钰31n消息处理函数是用于处理特定消息的一些代码,一般包括一个多分支switch语句结构。10/20/2021windows程序开发 讲师:鲍钰32详解消息处理

23、10/20/2021windows程序开发 讲师:鲍钰33windows数据类型 windows数据类型数据类型对应的基本对应的基本数据类型数据类型说明说明boolbool布尔值bstrunsigned short *32位字符指针byteunsigned char8位无符号整数colorrefunsigned long用作颜色值的32位值dwordunsigned long32位无符号整数,段地址和相关的偏移地址longlong32位带符号整数lparamlong作为参数传递给窗口过程或回调函数的32位值lpcstrconst char *指向字符串常量的32位指针lpstrchar *指向

24、字符串的32位指针lpvoidvoid *指向未定义类型的32位指针lresultlong来自窗口过程或回调函数的32位返回值uintunsigned int32位无符号整数wordunsigned short16位无符号整数wparamunsigned int当作参数传递给窗口过程或回调函数的32位值10/20/2021windows程序开发 讲师:鲍钰34n windows将使用的所有类型定义在windows.h文件和其相关的文件中。n一些常用的类型有句柄(handle)、窗口句柄(hwnd)、字符(byte)、短整数(word)、布尔型(bool)、字符串指针(lpstr)以及常量字符串

25、指针(lpcstr)等。nhandle是一个用作句柄的32位整数,句柄是代表某些资源的简单的数值,所有的句柄类型以h开头。 n凡是数据类型的前缀是前缀是p或或lp,则表示该类型是一个指针或长指针数据类型指针或长指针数据类型。若前缀是u,则表示无符号数据类型,等等。windows数据类型 10/20/2021windows程序开发 讲师:鲍钰35n程序初始化过程中调用createwindow,为程序创建了一个窗口,createwindow送出wm_create直接给窗口函数,后者可以在此时做些初始化初始化操作;n在程序运行过程中,不断以getmessage从消息队列中取得消息。如果如果这个消息是

26、这个消息是wm_quit,getmessage会得到会得到false的返回值而结束的返回值而结束循环,进而结束整个程序;循环,进而结束整个程序;ndispatchmessage通过系统user模块的协助与监督,把消息分派至窗口函数,消息将被处理;n程序不断循环;n当使用者按下系统菜单中的close命令时,系统送出wm_close,通常窗口程序不处理它,由defwindowproc处理;ndefwindowproc处理wm_close,调用destorywindow把窗口清除,送出wm_destory;n窗口程序对wm_destory的处理是调用postquitmessage;npostquit

27、message送出wm_quit,于是winmain的循环结束了,整个应用程序也结束了。windows程序的“生生死死” 10/20/2021windows程序开发 讲师:鲍钰36windows程序的“生” 10/20/2021windows程序开发 讲师:鲍钰37windows程序的“死” 10/20/2021windows程序开发 讲师:鲍钰38下面介绍建立基于api的应用程序框架的步骤。(1) 在file下拉菜单中选择new选项,以建立项目文件。(2) 在弹出的new对话框中,选择projects选项卡,并选择其中的win32 application项,在project name编辑框中

28、填人所要创建的项目文件名myapi,然后单击ok按钮。(3) 此时弹出如后图所示的界面,选择其中的an empty project选项,说明是创建一个空的项目文件。利用api开发win32程序实例10/20/2021windows程序开发 讲师:鲍钰39win32 application step 1 of 1对话框利用api开发win32程序实例10/20/2021windows程序开发 讲师:鲍钰40空的win32应用程序框架界面 利用api开发win32程序实例10/20/2021windows程序开发 讲师:鲍钰41insert files into project对话框 利用api开

29、发win32程序实例10/20/2021windows程序开发 讲师:鲍钰42windows窗口程序的运行结果 目录apiwindows10/20/2021windows程序开发 讲师:鲍钰43源程序代码如下:#include /窗口函数说明lresult callback wndproc(hwnd,uint,wparam,lparam);/初始化窗口类/winmain函数说明int winapi winmain(hinstance hinstance,hinstance hprevinst, lpstr lpszcmdline, int ncmdshow) hwnd hwnd ;msg ms

30、g ;wndclass wndclass ;char lpszclassname = “窗口”;/窗口类名char lpsztitle= my_windows; /窗口标题名目录apiwindows10/20/2021windows程序开发 讲师:鲍钰44wndclass.style = 0; /窗口类型为缺省类型wndclass.lpfnwndproc = wndproc ;/窗口处理函数为wndprocwndclass.cbclsextra= 0 ; /窗口类无扩展wndclass.cbwndextra= 0 ;/窗口实例无扩展wndclass.hinstance = hinstance

31、; /当前实例句柄wndclass.hicon = loadicon( null, idi_application) ; /窗口的最小化图标为缺省wndclass.hcursor = loadcursor( null, idc_arrow) ; /窗口采用箭头光标 wndclass.hbrbackground= (hbrush)getstockobject( white_brush) ; /窗口背景为白色 wndclass.lpszmenuname = null ; /窗口中无菜单 wndclass.lpszclassname = lpszclassname;/窗口类名为“窗口示例” /窗口类

32、注册 if( !registerclass( &wndclass) /如果注册失败,则发出警告声音messagebeep(0) ;return false ;目录apiwindows10/20/2021windows程序开发 讲师:鲍钰45/创建窗口hwnd=createwindow(lpszclassname,/窗口类名lpsztitle, /窗口实例的标题名ws_overlappedwindow, /窗口的风格cw_usedefault,cw_usedefault, /窗口左上角坐标为缺省值cw_usedefault, cw_usedefault, /窗口的高和宽为缺省值null,

33、 /此窗口无父窗口null, /此窗口无主菜单hinstance, /创建此窗口的应用程序的当前句柄null) ; /不使用该值/显示窗口showwindow( hwnd, ncmdshow) ;目录apiwindows10/20/2021windows程序开发 讲师:鲍钰46/绘制用户区updatewindow(hwnd); /消息循环 while( getmessage(&msg, null, 0, 0) translatemessage( &msg) ; /将消息的虚拟键转换为字符信息 dispatchmessage( &msg) ;/将消息传送到指定窗口retu

34、rn msg.wparam;/消息循环结束即程序终止时将信息返回系统 目录apiwindows10/20/2021windows程序开发 讲师:鲍钰47/窗口函数窗口函数nlresult callback wndproc(hwnd hwnd,uint message,wparam wparam, lparam lparam)nn switch(message)n n case wm_create:n messagebox( null , 鼠标左键,右键,按下发不同的声音鼠标左键,右键,按下发不同的声音 , my first api win , mb_ok) ;n return 0;n case

35、 wm_rbuttondown:n messagebeep (16);n break;n case wm_lbuttondown:n messagebeep (32);n break;n case wm_destroy:n postquitmessage(0);n messagebeep (16);n break;n /调用调用postquitmessage发出发出wm_quit消息消息n default:n /默认时采用系统消息默认处理函数默认时采用系统消息默认处理函数n return defwindowproc(hwnd,message,wparam,lparam); n n return

36、 (0);n目录apiwindows10/20/2021windows程序开发 讲师:鲍钰48 messagebeep( utype uint) 参数是个常数参数是个常数; 根据不同的常数发出不同的声音根据不同的常数发出不同的声音, 也就也就是调用了不同的是调用了不同的 wav参数参数 utype 可选值可选值: mb_ok = 0; mb_iconhand = 16; /警告警告 mb_iconquestion = 32; mb_iconexclamation = 48; mb_iconasterisk = 64; 10/20/2021windows程序开发 讲师:鲍钰49wndclass.

37、hicon = loadicon( null, idi_application) ; /窗口的最小化图标为缺省n#define idi_application makeintresource(32512)n#define idi_hand makeintresource(32513)n#define idi_question makeintresource(32514)n#define idi_exclamation makeintresource(32515)n#define idi_asterisk makeintresource(32516)nmakeintresource宏把一个整型值

38、转化成和资源管理函数相兼容的宏把一个整型值转化成和资源管理函数相兼容的资源类型。资源类型。 10/20/2021windows程序开发 讲师:鲍钰50wndclass.hcursor = loadcursor( null, idc_arrow) ; /窗口采用箭头光标窗口采用箭头光标n#define idc_arrow makeintresource(32512)n#define idc_ibeam makeintresource(32513)n#define idc_wait makeintresource(32514)n#define idc_cross makeintresource(3

39、2515)n#define idc_uparrow makeintresource(32516)n#define idc_size makeintresource(32640)n#define idc_icon makeintresource(32641)n#define idc_sizenwse makeintresource(32642)n#define idc_sizenesw makeintresource(32643)n#define idc_sizewe makeintresource(32644)n#define idc_sizens makeintresource(32645)

40、n#define idc_sizeall makeintresource(32646)nmakeintresource宏把一个整型值转化成和资源管理函数相兼容的资源类型。宏把一个整型值转化成和资源管理函数相兼容的资源类型。 10/20/2021windows程序开发 讲师:鲍钰51 wndclass.hbrbackground= (hbrush)getstockobject( white_brush) ;/窗口背景为白色n#define white_brush 0n#define ltgray_brush 1n#define gray_brush 2n#define dkgray_brush

41、3n#define black_brush 4n#define null_brush 5n#define hollow_brush null_brush10/20/2021windows程序开发 讲师:鲍钰52nwndclass. style = cs_hredraw | cs_vredraw ;n表示当窗口的水平方向或垂直方向的大小发生变化时,完全刷新窗口nwndclass. lpfnwndproc = wndproc ;n设置窗口函数为wndproc。这个函数处理窗口里的所有消息。10/20/2021windows程序开发 讲师:鲍钰53createwindow函数 ws_overlapp

42、edwindow ws_overlappedwindow是标准窗口风格,包括一个标题栏、窗口图标、窗口标题、最小化按钮、最大化按钮、关闭按钮、可调边框。下面是ws_overlappedwindow的定义。define ws_overlappedwindow(ws_opverlapped |ws_caption |ws_sysmenu |ws_thickframe |ws_minimizebox |ws_maximizebox )10/20/2021windows程序开发 讲师:鲍钰54showwindow (hwnd , ncmdshow ) ; sw_shownormal按常规显示窗口并激s

43、w_showmaximized最大化显示窗口并激活sw_ showminimized最小化显示窗口并激活sw_showmininoactive最小化显示窗口,不激活10/20/2021windows程序开发 讲师:鲍钰55目录apiwindowsextn通过file菜单的new选项,创建一个资源文件,就是在弹出的对话框中选中resource script,选中add to project 选框,这里将这个resource script文件命名为resource,点击ok按钮 10/20/2021windows程序开发 讲师:鲍钰56目录apiwindowsextn这样,在工程中加入了一个后缀名

44、为 .rc的文件,系统同时为他创建了一个 .h 文件,我们可以暂时不去理会它,一切交与系统处理。n下一步,点中在左边的窗口中resource.rc ,右边将出现一个文件夹样的图标,点中它,然后点鼠标右键,就会弹出一个选项窗口,选取insert选项10/20/2021windows程序开发 讲师:鲍钰5710/20/2021windows程序开发 讲师:鲍钰58然后,又会弹出一个窗口,选择icon,也就是图标文件,再点击new按钮,新建一个图标文件 10/20/2021windows程序开发 讲师:鲍钰59这时,就可以利用microsoft visual c+ 6.0来绘制想要的图标了10/20

45、/2021windows程序开发 讲师:鲍钰60目录apiwindowsextnwndclass.hicon = loadicon(hinstance , makeintresource(idi_myicon1) ;n#include resource.h10/20/2021windows程序开发 讲师:鲍钰61通过图示按钮,可以修改现有图标的大小10/20/2021windows程序开发 讲师:鲍钰6210/20/2021windows程序开发 讲师:鲍钰63目录apiwindowsextnwndclass.hcursor = loadcursor( hinstance, makeintre

46、source(idc_mycursor1) ) ; 10/20/2021windows程序开发 讲师:鲍钰64然后,又会弹出一个窗口,选择menu,也就是菜单文件,再点击new按钮,新建一个菜单文件 10/20/2021windows程序开发 讲师:鲍钰6510/20/2021windows程序开发 讲师:鲍钰6610/20/2021windows程序开发 讲师:鲍钰67目录apiwindowsextnwndclass.lpszmenuname = makeintresource(idr_menu /窗口中有菜单n int wmid = loword(wparam); n switch(mes

47、sage)n n case wm_command:n/ parse the menu selections:nswitch (wmid)nncase id_menuitem1:n messagebox( null , 菜单1.1 , my first api win , mb_ok) ;n break;ncase id_menuitem2:n messagebox( null , 菜单1.2 , my first api win , mb_ok) ;n break;ncase id_menuexit:n destroywindow(hwnd);n break;ndefault:n return

48、 defwindowproc(hwnd, message, wparam, lparam);nnbreak;10/20/2021windows程序开发 讲师:鲍钰68win下console程序设计n通过一个life game,介绍了一些好的编程原则,同时也介绍了面向对象和至顶向下的程序设计方法。10/20/2021windows程序开发 讲师:鲍钰69the game of lifen游戏规则 na)8个方向为邻居nb)活格 n0,1邻居下代死; n=4邻居下代死;n2,3邻居下代活;nc)死格 n3邻居下代活; n此外,下代死;n下一代,全部死亡10/20/2021windows程序开发 讲

49、师:鲍钰70稳定的初始配置10/20/2021windows程序开发 讲师:鲍钰71交替的初始配置10/20/2021windows程序开发 讲师:鲍钰72第一代1 1 2 2 3 3 3 3 2 2 1 1 1 1 x x 1 1 x x 2 2 x x 2 2 x x 1 1 1 1 1 1 2 2 3 3 3 3 2 2 1 1 10/20/2021windows程序开发 讲师:鲍钰73第二代 1 1 2 2 2 2 1 1 2 2 x 3 x 3 x 3x 3 2 2 3 3 x 5x 5 x 5x 5 3 3 2 2 x 3x 3 x 3x 3 2 2 1 1 2 2 2 2 1 1

50、 10/20/2021windows程序开发 讲师:鲍钰74第三代0 0 1 1 2 2 2 2 1 1 0 0 1 1 2 2 x 2 x 2 x 2x 2 2 2 1 1 1 1 x 2x 2 5 5 5 5 x 2x 2 1 1 1 1 2 2 x 2x 2 x 2x 2 2 2 1 1 0 0 1 1 2 2 2 2 1 1 0 0 10/20/2021windows程序开发 讲师:鲍钰75第四代0 0 1 1 2 2 2 2 1 1 0 0 1 1 2 2 x 2 x 2 x 2x 2 2 2 1 1 1 1 x 2x 2 5 5 5 5 x 2x 2 1 1 1 1 2 2 x 2

51、x 2 x 2x 2 2 2 1 1 0 0 1 1 2 2 2 2 1 1 0 0 10/20/2021windows程序开发 讲师:鲍钰76vc life_game 实现n目录life_game下例程n参考图10/20/2021windows程序开发 讲师:鲍钰77vc life_gameapi 实现n目录life_gameapi下例程n参考图10/20/2021windows程序开发 讲师:鲍钰78life game implementnset up a life configuration as an initial arrangement of living and dead cel

52、ls.nprint the life configuration.nwhile the user wants to see further generations:nupdate the configuration by applying the rules of the life game.nprint the current configuration.10/20/2021windows程序开发 讲师:鲍钰79the solution: nclassesnobjectsnmethodsneg:nlife configuration;nconfiguration.initialize( );

53、nconfiguration.update();nconfiguration.print();10/20/2021windows程序开发 讲师:鲍钰80life coding: the main programvoid main() / program to play conways game of life. life configuration; instructions(); configuration.initialize(); configuration.print(); cout continue viewing new generations? endl; while (user

54、_says_yes() configuration.update(); configuration.print(); cout continue viewing new generations? endl; 10/20/2021windows程序开发 讲师:鲍钰81life coding: the life class declarationnconst int maxrow = 20, maxcol = 60; / grid dimensionsnclass life npublic:n void initialize();n void print();n void update();npr

55、ivate:n int gridmaxrow + 2maxcol + 2; n/ allows for two extra rows and columnsn int neighbor_count(int row, int col);n;10/20/2021windows程序开发 讲师:鲍钰82life coding: the life:initializenvoid life:initialize()nn int row, col;n for (row = 0; row = maxrow+1; row+)n for (col = 0; col = maxcol+1; col+)n gridr

56、owcol = 0;n cout list the coordinates for living cells. endl;n cout terminate the list with the special pair -1 -1 row col;n while (row != -1 | col != -1) n if (row = 1 & row = 1 & col = maxcol)n gridrowcol = 1;n elsen cout column col is out of range. endl;n elsen cout row row is out of rang

57、e. row col;n n10/20/2021windows程序开发 讲师:鲍钰83life coding: the life:neighbor_count methodnint life:neighbor_count(int row, int col)nn int i, j;n int count = 0;n for (i = row - 1; i = row + 1; i+)n for (j = col - 1; j = col + 1; j+)n count += gridij; n / increase the count if neighbor is alive.n count -

58、= gridrowcol; n / reduce count, since cell is not its own neighbor.n return count;n10/20/2021windows程序开发 讲师:鲍钰84life coding: the life:update method nvoid life:update()nn int row, col;n int new_gridmaxrow + 2maxcol + 2; n /prevent next generation from affecting this generationn for (row = 1; row = ma

59、xrow; row+)n for (col = 1; col = maxcol; col+)n switch (neighbor_count(row, col) n case 2:n new_gridrowcol = gridrowcol; / status stays the same.n break;n case 3:n new_gridrowcol = 1; / cell is now alive.n break;n default:n new_gridrowcol = 0; / cell is now dead.n n for (row = 1; row = maxrow; row+)

60、n for (col = 1; col = maxcol; col+)n gridrowcol = new_gridrowcol;n10/20/2021windows程序开发 讲师:鲍钰85life coding: the life:print method nvoid life:print()nn int row, col;n cout nthe current life configuration is: endl;n for (row = 1; row = maxrow; row+) n for (col = 1; col = maxcol; col+)n if (gridrowcol = 1) cout *;n else cout ;n cout endl;n n cou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论