MFC利用Windows_API开发Win32程序实例.ppt_第1页
MFC利用Windows_API开发Win32程序实例.ppt_第2页
MFC利用Windows_API开发Win32程序实例.ppt_第3页
MFC利用Windows_API开发Win32程序实例.ppt_第4页
MFC利用Windows_API开发Win32程序实例.ppt_第5页
免费预览已结束,剩余108页可下载查看

下载本文档

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

文档简介

2/5/2019,windows程序开发 讲师:鲍钰,1,利用windows api开发win32程序实例,2/5/2019,windows程序开发 讲师:鲍钰,2,windows程序,windows程序分为“程序代码”和“ui资源”两大部分。ui即user interface,用户界面。 ui资源包括功能菜单、对话框外观、程序图标、光标形状等等。,2/5/2019,windows程序开发 讲师:鲍钰,3,.dlg,.bmp,.ico,.cur,.fon,.rc,.h,.c,.obj,.lib dll import,.def,rc compiler,text editor,dialog editor,image editor,font editor,c compiler,linker,.exe,.res,2/5/2019,windows程序开发 讲师:鲍钰,4,窗口,1不是黑底白字 2. 而是 框架菜单按钮滚动条 称为窗口要素 3. 窗口类型 console 文字类型 window 菜单+用户区域 dialog message box 4. 实现途径gdi(图形设备接口,gdi32.dll),2/5/2019,windows程序开发 讲师:鲍钰,5,创建一个空的win32 application工程,工程名为hello world。 下一步,在空的工程中加入c+语言的源程序文件。在visual c+ 6.0的file菜单中选择new选项;在弹出的file菜单中选择c source file;选中add to project 选框;选中加入到那个工程中,这里是hello world,就是刚才创建的工程;填写文件名,这里是helloworld,下面是工程的存放路径;最后,选择ok,2/5/2019,windows程序开发 讲师:鲍钰,6,目录hello world,#include int 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; ,2/5/2019,windows程序开发 讲师:鲍钰,7,#include 程序包含了一个头文件windows.h ,基本上所有的windows程序都会包含这个文件。它定义了windows的基本数据类型、数据结构、系统函数等。,2/5/2019,windows程序开发 讲师:鲍钰,8,windows api(application programming interface)是windows操作系统与应用程序之间的标准接口,它提供了上千个标准函数,宏和数据结构的定义.api函数定义在一些动态链接库中(.dll),其中,最主要的是user.dll,gdi.dll和kernel.dll3个dll文件. user.dll库中定义了窗口管理函数,包括窗口的创建,显示,移动等; gdi.dll中定义了许多图形,图像设备函数(gdi),提供了与设备无关的图形绘制功能; kernel.dll定义了系统服务函数,包括内存调度,进程管理等与操作系统有关的低层函数.,api函数,2/5/2019,windows程序开发 讲师:鲍钰,9,windows程序是以winmain函数为入口的,这个函数的定义如下: 函数原型 int winapi winmain ( hinstance hinstance , hinstance hprevinstance , lpstr lpcmdline , int ncmdshow); 第一个参数hinstance是当前实例句柄,为一个整数,用于标识窗口、程序等。 第二个参数hprevinstance 被置为null。 第三个参数lpcmdline是运行程序的命令行。 第四个参数ncmdshow用于指定程序窗口最初的显示模式,可以在初始是指定是正常还是最大化等。 winmain函数返回一个整数。winapi用于指定调用约定,具体在windeh.h中定义。,2/5/2019,windows程序开发 讲师:鲍钰,10,messagebox是一个windows api函数,用于弹出一个对话框,显示一些简短的信息。定义如下: 函数原型messagebox ( hwnd hwnd , lpctstr lptext , lpctstr lpcaption , uint utype ) ; 第一个参数hwnd是一个窗口句柄,表明对话框所属的窗口。 第二个参数lptext是一个字符串,表明需要显示的信息。text是一个宏。 第三个参数lpcaption是一个字符串,表明对话框的标题。 第四个参数utype用于指定对话框中的按钮和图标。各种按钮和图标类型可以同时使用,用“ | ”连接,如“mb_ok | mb_error” 。,2/5/2019,windows程序开发 讲师:鲍钰,11,类型 按钮 图标 mb_ok 确定 - mb_okcancel 确定和取消 - mb_yesno 是和否 - mb_yesnocancel 是和否和取消 - mb_iconinformation - 提示 mb_iconwarning - 警告 mb_iconerror - 出错 试试让系统弹出不同的对话框,2/5/2019,windows程序开发 讲师:鲍钰,12,#define mb_ok 0x00000000l #define mb_okcancel 0x00000001l #define mb_abortretryignore 0x00000002l #define mb_yesnocancel 0x00000003l #define mb_yesno 0x00000004l #define mb_retrycancel 0x00000005l #define mb_iconquestion 0x00000020l #define mb_iconexclamation 0x00000030l #define mb_iconasterisk 0x00000040l #define mb_iconwarning mb_iconexclamation #define mb_iconinformation mb_iconasterisk #define mb_defbutton1 0x00000000l #define mb_defbutton2 0x00000100l #define mb_defbutton3 0x00000200l,2/5/2019,windows程序开发 讲师:鲍钰,13,用messagebox()的返回值判断,返回值含意如下: idabort:abort 按钮被选中。 idcancel:cancel按钮被选中。 idignore:ignore按钮被选中。 idno:no按钮被选中。 idok:ok按钮被选中。 idretry:retry按钮被选中。 idyes:yes按钮被选中。,2/5/2019,windows程序开发 讲师:鲍钰,14,目录hello world,int result; result=messagebox ( null, text(“info: hello 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,“你点了忽略按钮“,“结果“,mb_iconinformation|mb_ok); break; ,2/5/2019,windows程序开发 讲师:鲍钰,15,目录hello world,result=messagebox(null,“你是男生吗?“,“性别调查“,mb_yesno); if(result=idyes)messagebox(null,“男生“,“结果“,mb_iconwarning|mb_ok); /*如果点击了“是”*/ else messagebox(null,“女生“,“结果“,mb_iconinformation|mb_ok);/*否则*/,2/5/2019,windows程序开发 讲师:鲍钰,16,text 宏的主要作用是当定义了 unicode/_unicode 预处理指令时,字符串被标志为双字节字符串。,unicode 是目前用来解决 ascii 码 256 个字符限制问题的一种比较流行的解决方案。大家知道,ascii 字符集只有256个字符,用 0-255 之间的数字来表示。包括大小写字母、数字以及少数特殊字符;如标点符号、货币符号等。对于大多数拉丁语言来说,这些字符已经够用。但是,许多亚洲和东方语言所用的字符远远不止256个字符。有些超过千个。人们为了突破 ascii 码字符数的限制,试图用一种简单的方法来针对超过256个字符的语言编写计算机程序。于是 unicode 应运而生。unicode 通过用双字节来表示一个字符,从而在更大范围内将数字代码映射到多种语言的字符集。,2/5/2019,windows程序开发 讲师:鲍钰,17,事件和事件驱动,windows程序为消息而“生”,因消息而“死” windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(events)产生的消息(message)。 事件通常以以下三种方式产生 通过输入设备,如键盘和鼠标 通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件 来自windows内部,2/5/2019,windows程序开发 讲师:鲍钰,18,基于事件驱动的程序模型,事件和事件驱动,2/5/2019,windows程序开发 讲师:鲍钰,19,消息的数据结构 消息的数据结构msg的定义如下: typedef struct tagmsg hwnd hwnd; /用以检索消息的窗口句柄 uint message;/消息值 wparam wparam;/包含有关消息的附加信息 lparam lparam; /随不同的消息而有所不同 dword time;/消息送到队列的时间 point pt; /消息发送时,屏幕光标的位置 msg;,消息的描述,2/5/2019,windows程序开发 讲师:鲍钰,20,支持队列特征的消息驱动模型,消息的描述,2/5/2019,windows程序开发 讲师:鲍钰,21,windows常用消息 wm_lbuttondown:单击鼠标左键时产生的消息; wm_lbuttonup:放开鼠标左键时产生的消息; wm_rbuttondown:单击鼠标右键时产生的消息; wm_rbuttonup:放开鼠标右键时产生的消息; wm_lbuttondblclk:双击鼠标左键时产生的消息; wm_rbuttondblclk:双击鼠标右键时产生的消息; wm_create:createwindows()函数产生的消息; wm_close:关闭窗口时产生的消息; wm_quit:退出应用程序时由postquitmessage()发出的消息; wm_paint:windows系统需要重绘时产生的消息。 ,消息的描述,2/5/2019,windows程序开发 讲师:鲍钰,22,winmain() 初始化; while(getmessage( ,系统 消息 队列,wndproc(msg) ,switch(msg) case msg1: case msg2: ,应用 程序 消息 队列,mouse driver,keyboard driver,sendmessage(),user module,message from other window,postmessage(),system,一个具体的窗口程序,2/5/2019,windows程序开发 讲师:鲍钰,23,winmain()程序入口点 注册窗口 registerclass() 生成并显示窗口 createwindow() showwindow() 消息循环 wndproc()窗口函数(功能实现) 区分消息 switch 根据消息触发相应处理 调用defwindowproc() 不处理的消息、和需要系统进一步处理的消息 如wm_close,使用者关闭了窗口。应用程序获得这个消息后,释放了自己的资源,然后让系统进一步执行关闭窗口的动作,windows程序组成,2/5/2019,windows程序开发 讲师:鲍钰,24,winmain() 初始化; 创建、显示、更新窗口; 建立基于消息的 事件驱动机制 ,winmain() registerclass( ); createwindow( ); showwindow( ); updatewindow( ); while(getmessage( ,winmain()程序入口点,详解入口,2/5/2019,windows程序开发 讲师:鲍钰,25,详解入口,winmain函数的原型如下: int winapi winmain ( hinstance hinstance, / 当前实例句柄 hinstance hprevinstance, / 以前的实例句柄 lpstr lpcmdline, / 指向命令行参数的指针 int ncmdshow ) / 窗口的显示状态,2/5/2019,windows程序开发 讲师:鲍钰,26,初始化包括 窗口类的定义 注册窗口类 创建窗口 显示窗口 需要注意的是,在显示窗口showwindow函数后,需调用updatewindow()函数更新并绘制用户区,并发出wm_paint消息。,详解窗口,2/5/2019,windows程序开发 讲师:鲍钰,27,注册窗口registerclass( ) 在注册之前可以设置窗口属性,系统会给出一些缺省值,我们重点关心其中的lpfnwndproc参数,wndclass wc; wc.stvle = ; wc.lpfnwndproc (wndproc)wndproc;,提示系统收到消息后,调该函数处理消息,wc.hicon = ,wc.cursor = ,wc.hbrbackground = ,registerclass(,详解窗口,2/5/2019,windows程序开发 讲师:鲍钰,28,createwindow(),详解窗口,hwnd createwindow( lpctstr lpclassname, / 已注册的窗口类名 lpctstr lpwindowname, / 窗口标题 dword dwstyle, / 窗口风格 int x, / 窗口的水平位置 int y, / 窗口的垂直位置 int nwidth, / 窗口宽度 int nheight, / 窗口高度 hwnd hwndparent, / 父窗口句柄 hmenu hmenu, / 菜单句柄或控件标识 hinstance hinstance, / 应用程序实例句柄 lpvoid lpparam ) / 其他窗口创建时的参数数据,2/5/2019,windows程序开发 讲师:鲍钰,29,消息 本身是一个unsigned int变量 类型有 wm_command: 系统命令类,菜单选择,按钮等 wm_paint: 对窗口作图 wm_destory: 关闭窗口 wm_user: 用户可自定义一些消息 在某个特定类型之下,更有许多事件,一般通过wparam通知,详解消息,2/5/2019,windows程序开发 讲师:鲍钰,30,while(getmessage( getmessage具有阻塞机制 当消息队列中没有消息时,程序非忙等,而是让权等待 当收到wm_quit时,getmessage返回false,循环停止,同时应用程序终止。 dispatchmessage 通过user模块协助,将消息传递到wndproc wndproc的调用指示在注册窗口类时,已向系统指明,详解消息采集,2/5/2019,windows程序开发 讲师:鲍钰,31,wndproc( hwnd hwnd, uint message, wparam wparam, lparam lparam),hwnd hwnd: 窗口句柄,在与窗口有关的控制中使用,uint message:消息(类型),wparam wparam:传递的参数,lparam lparam: 传递的参数,在基于消息的机制中,有时仅有消息是不够的 产生消息的同时,传递什么样的参数要视具体的消息而定,消息处理函数是用于处理特定消息的一些代码,一般包括一个多分支switch语句结构。,2/5/2019,windows程序开发 讲师:鲍钰,32,wndproc( hwnd, message, wparam, lparam),switch(message),case wm_command:,id = loword(wparam);,switch(id) ,case idm_open:,break;,菜单中的open选项,case wm_paint:,在视窗作图;,break;,default:,defwindowproc();,详解消息处理,2/5/2019,windows程序开发 讲师:鲍钰,33,windows数据类型,2/5/2019,windows程序开发 讲师:鲍钰,34,windows将使用的所有类型定义在windows.h文件和其相关的文件中。 一些常用的类型有句柄(handle)、窗口句柄(hwnd)、字符(byte)、短整数(word)、布尔型(bool)、字符串指针(lpstr)以及常量字符串指针(lpcstr)等。 handle是一个用作句柄的32位整数,句柄是代表某些资源的简单的数值,所有的句柄类型以h开头。 凡是数据类型的前缀是p或lp,则表示该类型是一个指针或长指针数据类型。若前缀是u,则表示无符号数据类型,等等。,windows数据类型,2/5/2019,windows程序开发 讲师:鲍钰,35,程序初始化过程中调用createwindow,为程序创建了一个窗口,createwindow送出wm_create直接给窗口函数,后者可以在此时做些初始化操作; 在程序运行过程中,不断以getmessage从消息队列中取得消息。如果这个消息是wm_quit,getmessage会得到false的返回值而结束循环,进而结束整个程序; dispatchmessage通过系统user模块的协助与监督,把消息分派至窗口函数,消息将被处理; 程序不断循环; 当使用者按下系统菜单中的close命令时,系统送出wm_close,通常窗口程序不处理它,由defwindowproc处理; defwindowproc处理wm_close,调用destorywindow把窗口清除,送出wm_destory; 窗口程序对wm_destory的处理是调用postquitmessage; postquitmessage送出wm_quit,于是winmain的循环结束了,整个应用程序也结束了。,windows程序的“生生死死”,2/5/2019,windows程序开发 讲师:鲍钰,36,createwindow(),wm_create,getmessage(),dispatchmessage(wm_create),wndproc(wm_create),用户程序初始化,启动,windows程序的“生”,winmain() 初始化; createwindow(); while(getmessage( ,wndproc(msg) ,switch(msg) case wm_create: 用户程序初始化 case wm_destory: postquitmessage() default: defwindowproc() ,2/5/2019,windows程序开发 讲师:鲍钰,37,使用者按下关闭按钮,wm_close,getmessage(),dispatchmessage( wm_close),wndproc(wm_close),defwindowproc(wm_close),关闭,winmain() 初始化; createwindow(); while(getmessage( ,wndproc(msg) ,switch(msg) case wm_create: 用户程序初始化 case wm_destory: postquitmessage() default: defwindowproc() ,destorywindow( ),wm_destory,getmessage(),dispatchmessage( wm_destory),wndproc(wm_destory),postquitmessage(),wm_qiut,getmessage()返回为0,while结束 winmain结束,整个程序结束,windows程序的“死”,2/5/2019,windows程序开发 讲师:鲍钰,38,下面介绍建立基于api的应用程序框架的步骤。 (1) 在file下拉菜单中选择new选项,以建立项目文件。 (2) 在弹出的new对话框中,选择projects选项卡,并选择其中的win32 application项,在project name编辑框中填人所要创建的项目文件名myapi,然后单击ok按钮。 (3) 此时弹出如后图所示的界面,选择其中的an empty project选项,说明是创建一个空的项目文件。,利用api开发win32程序实例,2/5/2019,windows程序开发 讲师:鲍钰,39,win32 application step 1 of 1对话框,利用api开发win32程序实例,2/5/2019,windows程序开发 讲师:鲍钰,40,空的win32应用程序框架界面,利用api开发win32程序实例,2/5/2019,windows程序开发 讲师:鲍钰,41,insert files into project对话框,利用api开发win32程序实例,2/5/2019,windows程序开发 讲师:鲍钰,42,windows窗口程序的运行结果,目录apiwindows,2/5/2019,windows程序开发 讲师:鲍钰,43,源程序代码如下: #include /窗口函数说明 lresult callback wndproc(hwnd,uint,wparam,lparam); /初始化窗口类 /winmain函数说明 int winapi winmain(hinstance hinstance,hinstance hprevinst, lpstr lpszcmdline, int ncmdshow) hwnd hwnd ; msg msg ; wndclass wndclass ; char lpszclassname = “窗口”; /窗口类名 char lpsztitle= “my_windows“; /窗口标题名,目录apiwindows,2/5/2019,windows程序开发 讲师:鲍钰,44,wndclass.style = 0; /窗口类型为缺省类型 wndclass.lpfnwndproc = wndproc ; /窗口处理函数为wndproc wndclass.cbclsextra= 0 ; /窗口类无扩展 wndclass.cbwndextra= 0 ; /窗口实例无扩展 wndclass.hinstance = hinstance ; /当前实例句柄 wndclass.hicon = loadicon( null, idi_application) ; /窗口的最小化图标为缺省 wndclass.hcursor = loadcursor( null, idc_arrow) ; /窗口采用箭头光标 wndclass.hbrbackground= (hbrush)getstockobject( white_brush) ; /窗口背景为白色 wndclass.lpszmenuname = null ; /窗口中无菜单 wndclass.lpszclassname = lpszclassname;/窗口类名为“窗口示例” /窗口类注册 if( !registerclass( ,目录apiwindows,2/5/2019,windows程序开发 讲师:鲍钰,45,/创建窗口 hwnd=createwindow(lpszclassname,/窗口类名 lpsztitle, /窗口实例的标题名 ws_overlappedwindow, /窗口的风格 cw_usedefault, cw_usedefault, /窗口左上角坐标为缺省值 cw_usedefault, cw_usedefault, /窗口的高和宽为缺省值 null, /此窗口无父窗口 null, /此窗口无主菜单 hinstance, /创建此窗口的应用程序的当前句柄 null) ; /不使用该值 /显示窗口 showwindow( hwnd, ncmdshow) ;,目录apiwindows,2/5/2019,windows程序开发 讲师:鲍钰,46,/绘制用户区 updatewindow(hwnd); /消息循环 while( getmessage( /消息循环结束即程序终止时将信息返回系统 ,目录apiwindows,2/5/2019,windows程序开发 讲师:鲍钰,47,/窗口函数 lresult callback wndproc(hwnd hwnd,uint message,wparam wparam, lparam lparam) switch(message) case wm_create: messagebox( null , “鼠标左键,右键,按下发不同的声音“ , “my first api win“ , mb_ok) ; return 0; case wm_rbuttondown: messagebeep (16); break; case wm_lbuttondown: messagebeep (32); break; case wm_destroy: postquitmessage(0); messagebeep (16); break; /调用postquitmessage发出wm_quit消息 default: /默认时采用系统消息默认处理函数 return defwindowproc(hwnd,message,wparam,lparam); return (0); ,目录apiwindows,2/5/2019,windows程序开发 讲师:鲍钰,48,messagebeep( utype uint) 参数是个常数; 根据不同的常数发出不同的声音, 也就是调用了不同的 wav 参数 utype 可选值: mb_ok = 0; mb_iconhand = 16; /警告 mb_iconquestion = 32; mb_iconexclamation = 48; mb_iconasterisk = 64;,2/5/2019,windows程序开发 讲师:鲍钰,49,wndclass.hicon = loadicon( null, idi_application) ; /窗口的最小化图标为缺省 #define idi_application makeintresource(32512) #define idi_hand makeintresource(32513) #define idi_question makeintresource(32514) #define idi_exclamation makeintresource(32515) #define idi_asterisk makeintresource(32516) makeintresource宏把一个整型值转化成和资源管理函数相兼容的资源类型。,2/5/2019,windows程序开发 讲师:鲍钰,50,wndclass.hcursor = loadcursor( null, idc_arrow) ; /窗口采用箭头光标 #define idc_arrow makeintresource(32512) #define idc_ibeam makeintresource(32513) #define idc_wait makeintresource(32514) #define idc_cross makeintresource(32515) #define idc_uparrow makeintresource(32516) #define idc_size makeintresource(32640) #define idc_icon makeintresource(32641) #define idc_sizenwse makeintresource(32642) #define idc_sizenesw makeintresource(32643) #define idc_sizewe makeintresource(32644) #define idc_sizens makeintresource(32645) #define idc_sizeall makeintresource(32646) makeintresource宏把一个整型值转化成和资源管理函数相兼容的资源类型。,2/5/2019,windows程序开发 讲师:鲍钰,51,wndclass.hbrbackground= (hbrush)getstockobject( white_brush) ; /窗口背景为白色 #define white_brush 0 #define ltgray_brush 1 #define gray_brush 2 #define dkgray_brush 3 #define black_brush 4 #define null_brush 5 #define hollow_brush null_brush,2/5/2019,windows程序开发 讲师:鲍钰,52,wndclass. style = cs_hredraw | cs_vredraw ; 表示当窗口的水平方向或垂直方向的大小发生变化时,完全刷新窗口 wndclass. lpfnwndproc = wndproc ; 设置窗口函数为wndproc。这个函数处理窗口里的所有消息。,2/5/2019,windows程序开发 讲师:鲍钰,53,createwindow函数 ws_overlappedwindow ws_overlappedwindow是标准窗口风格,包括一个标题栏、窗口图标、窗口标题、最小化按钮、最大化按钮、关闭按钮、可调边框。下面是ws_overlappedwindow的定义。 define ws_overlappedwindow(ws_opverlapped | ws_caption | ws_sysmenu | ws_thickframe | ws_minimizebox | ws_maximizebox ),2/5/2019,windows程序开发 讲师:鲍钰,54,showwindow (hwnd , ncmdshow ) ; sw_shownormal按常规显示窗口并激 sw_showmaximized最大化显示窗口并激活 sw_ showminimized最小化显示窗口并激活 sw_showmininoactive最小化显示窗口,不激活,2/5/2019,windows程序开发 讲师:鲍钰,55,目录apiwindowsext,通过file菜单的new选项,创建一个资源文件,就是在弹出的对话框中选中resource script,选中add to project 选框,这里将这个resource script文件命名为resource,点击ok按钮,2/5/2019,windows程序开发 讲师:鲍钰,56,目录apiwindowsext,这样,在工程中加入了一个后缀名为 .rc的文件,系统同时为他创建了一个 .h 文件,我们可以暂时不去理会它,一切交与系统处理。 下一步,点中在左边的窗口中resource.rc ,右边将出现一个文件夹样的图标,点中它,然后点鼠标右键,就会弹出一个选项窗口,选取insert选项,2/5/2019,windows程序开发 讲师:鲍钰,57,2/5/2019,windows程序开发 讲师:鲍钰,58,然后,又会弹出一个窗口,选择icon,也就是图标文件,再点击new按钮,新建一个图标文件,2/5/2019,windows程序开发 讲师:鲍钰,59,这时,就可以利用microsoft visual c+ 6.0来绘制想要的图标了,2/5/2019,windows程序开发 讲师:鲍钰,60,目录apiwindowsext,wndclass.hicon = loadicon(hinstance , makeintresource(idi_myicon1) ; #include “resource.h“,2/5/2019,windows程序开发 讲师:鲍钰,61,通过图示按钮,可以修改现有图标的大小,2/5/2019,windows程序开发 讲师:鲍钰,62,2/5/2019,windows程序开发 讲师:鲍钰,63,目录apiwindowsext,wndclass.hcursor = loadcursor( hinstance, makeintresource(idc_mycursor1) ) ;,2/5/2019,windows程序开发 讲师:鲍钰,64,然后,又会弹出一个窗口,选择menu,也就是菜单文件,再点击new按钮,新建一个菜单文件,2/5/2019,windows程序开发 讲师:鲍钰,65,2/5/2019,windows程序开发 讲师:鲍钰,66,2/5/2019,windows程序开发 讲师:鲍钰,67,目录apiwindowsext,wndclass.lpszmenuname = makeintresource(idr_menu /窗口中有菜单 int wmid = loword(wparam); switch(message) case wm_command: / parse the menu selections: switch (wmid) case id_menuitem1: messagebox( null , “菜单1.1“ , “my first api win“ , mb_ok) ; break; case id_menuitem2: messagebox( null , “菜单1.2“ , “my first api win“ , mb_ok) ; break; case id_menuexit: destroywindow(hwnd); break; default: return defwindowproc(hwnd, message, wparam, lparam); break;,2/5/2019,windows程序开发 讲师:鲍钰,68,win下console程序设计,通过一个life game,介绍了一些好的编程原则,同时也介绍了面向对象和至顶向下的程序设计方法。,2/5/2019,windows程序开发 讲师:鲍钰,69,the game of life,游戏规则 a)8个方向为邻居 b)活格 0,1邻居下代死; =4邻居下代死; 2,3邻居下代活; c)死格 3邻居下代活; 此外,下代死; 下一代,全部死亡,2/5/2019,windows程序开发 讲师:鲍钰,70,稳定的初始配置,2/5/2019,windows程序开发 讲师:鲍钰,71,交替的初始配置,2/5/2019,windows程序开发 讲师:鲍钰,72,第一代,2/5/2019,windows程序开发 讲师:鲍钰,73,第二代,2/5/2019,windows程序开发 讲师:鲍钰,74,第三代,2/5/2019,windows程序开发 讲师:鲍钰,75,第四代,2/5/2019,windows程序开发 讲师:鲍钰,76,vc life_game 实现,目录life_game下例程 参考图,2/5/2019,windows程序开发 讲师:鲍钰,77,vc life_gameapi 实现,目录life_gameapi下例程 参考图,2/5/2019,windows程序开发 讲师:鲍钰,78,life game implement,set up a life configuration as an initial arrangement of living and dead cells. print the life configuration. while the user wants to see further generations: update the configuration by applying the rules of the life game. print the current configuration.,2/5/2019,windows程序开发 讲师:鲍钰,79,the solution:,classes objects methods eg: life configuration; configuration.initialize( ); configuration.update(); configuration.print();,2/5/2019,windows程序开发 讲师:鲍钰,80,life coding: the main program,void main() / program to play conways game of life. life configuration; instructions(); configuration.initialize(); configuration.print(); cout “continue viewing new generations? “ endl; while (user_says_yes() configuration.update(); configuration.print(); cout “continue viewing new generations? “ endl; ,2/5/2019,windows程序开发 讲师:鲍钰,81,life coding: the life class declaration,const int maxrow = 20, maxcol = 60; / grid dimensions class life public: void initialize(); void print(); void update(); private: int gridmaxrow + 2maxcol + 2; / allows for two extra rows and columns int neighbor_count(int row, int col); ;,2/5/2019,windows程序开发 讲师:鲍钰,82,life coding: the life:initialize,void life:initialize() int row, col; for (row = 0; row row col; while (row != -1 | col != -1) if (row = 1 ,2/5/2019,windows程序开发 讲师:鲍钰,83,life coding: the life:neighbor_count method,int life:neighbor_count(int row, int col) int i, j; int count = 0; for (i

温馨提示

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

评论

0/150

提交评论