资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Windows,应用程序基础,程序调试工具包括源程序语法检查、可执行程序修改和运行监视等,应用程序,Help,和,Setup,开发工具包,系统函数库和系统函数开发工具,资源管理器,包括图形化窗口及组成元素的多种对象的编辑器,可选择并构成具体语句或源程序结构的例程库及,Help,源程序编辑器和编译器,可视化开发,系统集成了一系,列系统可用资源,和开发工具,一、,Windows,编程,基础,采用交互式方法时,可视化开发平台给出了许多选用的对象,程序员可选择所需对象并确定其属性,由此搭建起应用程序的“大框架”,并可根据需要进一步编写必要的细节代码段,最后构成完整的应用程序,Windows,的,程序设计语言,VC,VB,VJ,都是“面向对象”的程序设计语言,对象是,Windows,的规范部件,窗口,菜单,按钮,对话框,程序模块,编写,Windows,程序相当一部分工,作是在创建对象和,为对象属性赋值,对象特征:具有规范形态和操作模式,编程方法,传统编写法,-API,交互式方法,-MFC,API,API,函数,的功能,为应用程序提供,Windows,系统特殊函数及数据结构,Win,应用程序可以利用标准大量,API,函数调用系统功能,是,Win,系统与,Win,应用程序间的标准程序接口,窗口管理函数实现窗口的创建、移动和修改功能,系统服务函数:实现与操作系统有关的多种功能,图形设备,(GDI),函数:实现与设备无关的图形操作功能,利用,Windows API,函数编写,Windows,应用程序必须首先了解以下内容:,(1),窗口的概念,(2),事件驱动的概念,(3),句柄,(4),消息,其它概念,图形设备接口,GDI,基于资源的程序设计,动态链接库,KERNAL32.DLL,存储器 任务 资源管理等,windows,核心功能,GDI32.DLL,用户界面和图形绘制,包括位图 元文件 字体 设备描述表等,USER32.DLL,窗口管理,包括消息 菜单 光标 计时器 以及其它与控制窗口显示相关的一些功能,一个应用程序的窗口一般包含下列组成部分:,窗口边界,工作区,控制菜单框,下拉菜单,水平滚动条,垂直滚动条,最大化按钮,最小化按钮,标题栏,1.,窗口,编写一个,Windows,应用程序首先应创建一个或多个窗口,随后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。,应用程,序与用,户之间,交互的,接口环,境,系统管理,应用程序,的基本单位,Win,应用程序,基本的操作单元,Windows,程序设计是针对事件或,消息,的处理进行,。,消息是描述事,件发生的信息,(,如按下鼠标或键盘,),事件驱动编程方法对于编写交互式程序很有用处,它避免了死板的操作模式。,Windows,程序的执行顺序取决于事件发生的顺序,程序的执行顺序是由顺序产生的消息驱动的,但是消息的产生往往并不要求有次序之分。,2.,事件驱动,常用句柄类型及其说明,句柄是一个,4,字节长的数值,用于标识应用程序中不同的,对象,和,同类对象中不同的实例,窗口,按钮,图标,滚动条,输出设备,控制,文件,应用程序通过,句柄访问相应,的对象信息,HWND,窗口句柄,HDC,设备环境句柄,HBITMAP,位图句柄,HCURSOR,光标句柄,HICON,图标句柄,HFONT,字体句柄,HMENU,菜单句柄,HPEN,画笔句柄,HFILE,文件句柄,HBRUSH,画刷句柄,HINSTANCE,当前实例句柄,3.,句柄,Windows,应用程序利用,Windows,消息,(Message),与应用程序及系统进行信息交换。,typedef struct tagMSG,HWND hwnd;,窗口句柄,为,null,,则可检索所有驻留在消息队列中的消息,UINT message;,消息值,由,Windows.h,头文件中的宏定义来标识,WPARAM wParam;,包含有关消息的附加信息,不同消息其值有所不同,LPARAM lParam;,DWORD time;,指定消息送至队列的时间,POINT pt;,指定消息发送时屏幕光标的位置,其数据类型,POINT,也是一个结构体,MSG;,消息号:由事先定义好的消息名标识,字参数,(wParam),:用于提供消息的,附加信息,长字参数,(lParam),:用于提供消息的,附加信息,消息,附加信息,与具体,消息号的值有关,,在,Win,中消息用,结构体,MSG,表示,typedef struct tagPOINT,LONG x,;,LONG y;,POINT;,4.,消息,VC,中存在几种系统定义的消息分类,不同的前缀符号经常用于消息宏识别消息附属的分类,系统定义的消息宏前缀如下:,BM,表示按钮控制消息,CB,表示组合框控制消息,DM,表示默认下压式按钮控制消息,EM,表示编辑控制消息,LB,表示列表框控制消息,SBM,表示滚动条控制消息,WM,表示窗口消息,窗口管理消息,初始化消息,输入消息,系统消息,剪贴板消息,控制处理消息,控制通知消息,滚动条通知消息,非用户区消息,MDI,消息,DDE,消息,应用程序自定义的消息,Windows,编,程常用消息,windows,消息类型,在,Windows,中,消息有以下三种类型:,(1),标准,Windows,消息:指以,WM_,为前缀的那些消息(除了,WM_COMMAND,),如窗口移动消息,WM_MOVE,,窗口大小改变消息,WM_SIZE,,此外,如程序启动或退出,窗口创建和关闭等等。,(2),控件通知消息:由编辑框,列表框等控件或子窗口发给其父窗口的通知消息,以,WM_COMMAND,为消息名,在消息中包含有控件通知代码,以区分具体的控件通知消息。,(3),命令消息:命令消息也以,WM_COMMAND,为消息名,在消息中包含有命令的标识符(,ID,),以区分具体的命令。命令消息的来源是以下三种用户接口对象:菜单:用户选择某菜单项,要产生相应的命令消息。工具栏:用户按下某工具栏按钮产生相应的命令消息。加速键:用户在键盘上按下了定义的加速键也将产生相应的命令消息。,其它自定义消息,其它自定义消息,如网络消息,文件读写消息,其它外部设备状态消息等,Windows,的消息系统是由,3,个部分组成的:,消息队列。,Windows,能够为所有的应用程序维护一个消息队列。应用程序必须从消息队列中获取 消息,然后分派给某个窗口。,消息循环。,通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然 后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。,窗口过程。,每个窗口都有一个窗口过程来接收传递给窗口的消息,它的任务就是获取消息然后 响应它。窗口过程是一个回调函数;处理了一个消息后,它通常要返回一个值给,Windows,。,消息从产生响应的,5,个步骤,1),系统中发生了某个事件。,2)Windows,把这个事件翻译为消息,然后把它放到消息队列中。,3),应用程序从消息队列中接收到这个消息,把它存放在,TMsg,记录中。,4),应用程序把消息传递给一个适当的窗口的窗口过程。,5),窗口过程响应这个消息并进行处理。步骤,3,和,4,构成了应用程序的消息循环,Windows,消息控制中心一般是,三层结构,,其顶端就是,Windows,内核。,Windows,内核维护着一个消息队列,第二级控制中心从这个消息队列中获取属于自己管辖的消息,后做出处理,有些消息直接处理掉,有些还要发送给下一级窗体,(Window),或控件(,Control,)。第二级控制中心一般是各,Windows,应用程序的,Application,对象。第三级控制中心就是,Windows,窗体对象,每一个窗体都有一个默认的窗体过程,这个过程负责处理各种接收到的消息。,此外,相似的消息还有:,WM_LBUTTONUP,:放开鼠标左键时产生;,WM_RBUTTONDOWN,:单击鼠标右键时产生;,WM_RBUTTONUP,:放开鼠标右键时产生;,WM_LBUTTONDBLCLK,:双击鼠标左键时产生;,WM_RBUTTONDBLCLK,:双击鼠标右键时产生。,1Param,高字节包含当前光标的,Y,坐标值,低字节包含当前光标的,X,坐标值,wParam,包含一整数值以标识鼠标键的,按下状态,MK_LBUTTON,按下鼠标左键,MK_MBUTTON,按下鼠标中键,MK_RBUTTON,按下鼠标右键,二、,Windows,应用程序常用消息,1.WM_LBUTTONDOWN,:产生单击鼠标左键的消息,系统键是指实现系统操作的组合键,例如,Alt,与某个功能键的组合以实现系统菜单操作等。,wParam,为按键的,ASCII,码,1Param,与,WM_KEYDOWN,的相同,wParam,:按下键的,虚拟键码,,用以标识按下或释放的键,1Param,:记录了按键的重复次数、扫描码、转移代码、先前键的状态等信息。,相似的消息还有,WM_KEYUP,在放开非系统键时产生,如,F1,的虚拟键码,在,Windows.h,文,件中定义为,VK_F1,2.WM_KEYDOWN,:,按下一个非系统键时产生的消息,3.WM_ CHAR,:,按下一个非系统键时产生的消息,wParam,:未用,1Param,:包含一个指向,CREATESTRUCT,数据结构的指针,wParam,和,1Param,均未用。,wParam,和,1Param,均未用。,4.WM_CREATE,:由,CreateWindow,函数发出的消息,5.WM_CLOSE,:关闭窗口时产生的消息,6.WM_DESTROY:,由,DestroyWiodow,函数发出的消息,用户区移动或显示,用户窗口改变大小,程序通过滚动条滚动窗口,下拉式菜单关闭并需要恢复被覆盖的部分,Windows,清除对话框等对象,并需要恢复被覆盖的部分,均产生,WM_PAINT,消息,7.WM_QUIT,:由,PostQuitMessage,函数发出的消息退出应用程序时发出的消息,wParam,:含退出代码,标识程序退出运行时的有关信息,1Param,:未用,8.WM_PAINT,启动,输入姓名,输入第一次测试成绩,输入第二次测试成绩,输入第三次测试成绩,计算平均成绩,结束,过程驱动方法计算平均成绩,启动,消息处理,结束,输入姓名,输入第一次成绩,输入第二次成绩,输入第三次成绩,计算平均成绩,事件驱动方法计算平均成绩,三、,Windows,中的事件驱动程序设计,Windows,句柄,系统中对象的唯一标识,系统动态分配和维护,一个对象使用一个句柄,销毁后这个句柄值可能用来标识其它完全不同的一个句柄,句柄类型有很多,如,HWND,HBRUSH,HICON,等。,一个完整的,Windows,应用程序通常由,五种类型,的文件组成。,1.C,语言源程序文件,2.,头文件,3.,模块定义文件,4.,资源描述文件,5.,项目文件,四、,Windows,应用程序组成及编程步骤,1.,应用程序的组成,入口函数,WinMain,窗口函数,WndProc,Windows,应用程序,构成基,本框架,包含各种数据类型、数据结构与函数等,1.,所有应用程序的入口,类似,Main,函数,,2.,完成一系列的定义和初始化,并产生消息循环,WinMain,和,WndProc,是,Windows,应用程序的主体,2.,源程序组成结构,(1)WinMain,函数,三个基本的组成部分:,函数说明,、,初始化,和,消息循环,功能,注册窗口类,建立窗口及执行必要的初始化,进入消息循环,根据接受的消息调用相应的处理过程,当消息循环检索到,WM_QUIT,时终止程序运行,WinMain,函数,WinMain,函数说明,WinMain,函数的说明如下:,int WINAPI WinMain,(,HINSTANCE hThisInst,应用程序当前实例句柄,HINSTANCe hPrevInst,应用程序其他实例句柄,LPSTR lpszCmdLine,指向程序命令行参数的指针,Int nCmdShow,应用程序开始执行时窗口显示方式的整数值标识,),注意!,Win,是多任务管理的,同一应用程序的多个窗口可能会同时存,Win,系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识,(2),初始化,i.,窗口类定义,通过给窗口类数据结构,WNDCLASS,赋值完成,该数据结构中包含窗口类的各种属性。窗口类定义常用以下函数:,LoadIcon,的作用是在应用程序中加载一个窗口图标。其原型为:,HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName),图标资源名或系统预定义图标标识名,图标资源所在的模块句柄,,NULL,则使用系统预定义图标,初始化,显示窗口,创建窗口实例,窗口类的注册:窗口类必须先注册后使用,窗口类的定义:定义窗口的形式与功能,LoadIcon,LoadCursor,GetStockObject,RegisterClass,CreateWindow,ShowWindow,,,UpdateWindow,WNDCLASS,定义,typedef struct _WNDCLASS,UINT style;,WNDPROC lpfnWndProc;,int cbClsExtra;,int cbWndExtra;,HINSTANCE hInstance;,HICON hIcon;,HCURSOR hCursor;,HBRUSH hbrBackground;,LPCTSTR lpszMenuName;,LPCTSTR lpszClassName;,WNDCLASS,*LPWNDCLASS,WNDCLASS,结构,WNDCLASS,是一个由系统支持的结构,用来储存某一类窗口的信息,如,ClassStyle,消息处理函数,,Icon,Cursor,背景,Brush,等。也就是说,,CreateWindow,只是将某个,WNDCLASS,定义的,窗体,变成实例。,要得到某一窗口的,WNDCLASS,数据,可以用,GetClassLong();,RegisterClass(),就是在系统注册某一类型的窗体。也就是将你提供的,WNDCLASS,数据注册为一个窗口类,在,WNDCLASS.lpszClassName,中定义该,WNDCLASS,的标识,,无论,CreateWindow,或,CreateWindowEx,创建的窗口都必须对应一个,WNDCLASS,,但一个,WNDCLASS,可以有多个,窗口对象,。,WNDCLASS,有一些系统预定义的,窗口类,,如:,ClassName=_T(BUTTON or COMBOBOX or EDIT or LISTBOX or MDICLIENT or SCROLLBAR or STATIC,),要用这些窗体,直接用,CreateWindow,创建相应对象就是了。,要得到某一窗口的窗口类,可以用,GetClassName();,WNDCLASS,中的,回调函数,是窗体的消息处理函数:,LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM,lParam),分量解释,-,style,style,:,指定类风格。这些风格可通过按位或操作组合起来。风格如下,:,CS_BYTEALIGNCLIENT:,在字节边界上(在,x,方向上)定位窗口的用户区域的位置,CS_BYTEALIGNWINDOW:,在字节边界上(在,x,方向上)定位窗口的位置,CS_CLASSDC:,该,窗口类,的所有窗口实例都共享一个窗口类,DC,CS_DBLCLKS:,允许向窗口发送双击鼠标键的消息,CS_GLOBALCLASS:,当调用,CreateWindow,或,CreateWindowEx,函数来创建窗口时允许它的,hInstance,参数和注册窗口类时传递给,RegisterClass,的,hInstance,参数不同。如果不指定该风格,则这两个,hInstance,必须相同。,CS_HREDRAW:,当水平长度改变或移动窗口时,重画整个窗口,CS_NOCLOSE:,禁止系统菜单的关闭选项,CS_OWNDC:,给予每个窗口实例它本身的,DC,。注意,尽管这样是很方便,但它必须慎重使用,因为每个,DC,大约要占,800,个字节的内存。,CS_PARENTDC:,将子窗口的裁剪区域设置到父窗口的,DC,中去,这样子窗口便可以在父窗口上绘制自身。注意,这是子窗口还是从,系统缓存,中获取,DC,,而不是使用父窗口的,DC,。使用该风格可以提高系统性能。,CS_SAVEBITS:,以位图形式保存被该窗口遮挡的屏幕部分,这样当给窗口移动以后,系统便可以用该保存的位图恢复屏幕移动的相应部分,从而系统不用向被该窗口遮挡的窗口发送,WM_PAINT,消息。该特性对于菜单类型的窗口比较合适,因为它通常是简短的显示一下之后便消失。设置该特性将增加显示该窗口的时间,因为它通常要先分配保存位图的内存。,CS_VREDRAW:,当垂直长度改变或移动窗口时,重画整个窗口,分量解释,lpfnWndProc,:,指向窗口过程,cbClsExtra,:,指定紧随在,WNDCLASS,数据结构,后分配的字节数。系统将其初始化为零。,cbWndExtra,:,指定紧随在窗口实例之后分配的字节数,系统将其初始化为零。如果,应用程序,正在用,WNDCLASS,结构注册一个在,RC,资源描述文件中用,CLASS,指令创建的对话框时,它必须设置这个字段为,DLGWINDOWEXTRA,。,hInstance,:,标识了该窗口类的窗口过程所在的模块实例的句柄,不能为,NULL,。,hIcon,:,标识了该窗口类的图标。,hIcon,字段必须是一个图标的句柄;若,hIcon,字段为,NULL,,那么系统将提供一个默认的图标。,hCursor,:,标识该窗口类的光标,,hCursor,必须是一个光标资源的句柄。若,hCursor,字段为,NULL,,则无论何时鼠标移到应用程序窗口时,应用程序必须显式设置光标形状。,LoadCursor,的作用是在应用程序中加载一个窗口光标,HCURSOR LoadCursor(HINSTANCE hInstance,LPCTSTR lpCursorName),光标资源所在的模,块句柄,,NULL,则使,用系统预定义光标,光标资源名或系统,预定义光标标识名,应用程序调用函数,GetStockObject,获取系统提供的背景刷,HBRUSH GetStockObject(int nBrush);,hbrBackground,:,标识了该窗口类的背景画刷。,hbrBackground,字段必须是用于绘制背景的物理刷子的句柄,或者是一个颜色的值。如果给出一个颜色的值,它必须是下面列出的标准系统颜色之一(系统将对所选颜色加,1,)。如果给出了颜色值,它必须是转换成下列的,HBRUSH,类型之一的颜色,:,(备注),当,hbrBackground,字段为,NULL,时,每当需要绘制其用户区域时,应用程序必须自己来绘制其背景。应用程序可以通过处理,WM_ERASEBKGND,消息或检查由,BeginPaint,函数填写的,PAINTSTRUCT,结构的,fErase,字段来确定背景什么时候需要着色。,分量解释,lpszMenuName:,指向,NULL,结束的字符串,该字符串描述菜单的资源名,如同在,资源文件,里显示的名字一样。若使用一个整数标识菜单,可以使用,MAKEINTRESOURCE,宏。如果,lpszMenuName,为,NULL,,那么该窗口类的窗口将没有默认菜单。,lpszClassName:,指向,NULL,结束的字符串,或者是一个原型,(atom),。若该参数是一个原型,它必须是一个有先前调用,RegisterClass,或者,RegisterClassEx,函数产生的类原型。类原型必须作为,lpszClassName,的低字,高字必须为,0.,若,lpszClassName,是一个字符串,它描述了窗口类名。这个类名可以是由,RegisterClass,或,RegisterClassEx,注册的名字,或者是任何预定义的控件类名。,ii.,注册窗口类,Win,系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。窗口类的注册由函数,RegisterClass(),实现。,RegisterClass(/wndclass,为窗口类结构,RegisterClass,函数的返回为布尔值,注册成功则返回真,iii.,创建窗口实例,创建一个窗口类的实例由函数,CreateWindow,()实现,函数原型如下:,HWND Create Window,(LPCTSTR lpszClassName,窗口类名,LPCTSTR lpszTitle,窗口标题名,DWORD dwStyle,创建窗口的样式,int x,y,窗口左上角坐标,int nWidth,nHeight,窗口宽度和度高,HWND hwndParent,该窗口的父窗口句柄,HWENU hMenu,窗口主菜单句柄,HINSTANCE hInstance,创建窗口的应用程序当前句柄,LPVOID lpParam ,指向一个传递给窗口的参数值的指针,),iv,显示窗口,窗口类的显示由,ShowWindow,和,UpdateWindow,函数实现。应用程序调用,ShowWindow,函数在屏幕上显示窗口,ShowWindow(hwnd,nCmdshow),;,/,nCmdshow,为窗口显示形式标识,显示窗口后,应用程序调用,UpdateWindow,更新并绘制用户区,并发出,WM_PAINT,消息。,UpdateWindow(hwnd);,(3),消息循环,消息循环的常见格式如下:,MSG Msg;,while(GetMessage(&Msg,NULL,0,0),TranslateMessage(,DispatchMessage(,将消息的虚拟键,转换为字符信息,将消息传送到,指定窗口函数,从消息队列中读取,一条消息,并将消,息放在,MSG,结构中,其中函数,GetMessage,形式为:,GetMessage,(,lpMSG,/,指向,MSG,结构的指针,hwnd,nMsgFilteMin,/,用于消息过滤的最小消息号值,nMsgFilterMax/,用于消息过滤的最大消息号值,),返回零值,即检索,到,WM_QUIT,消息,程,序结束循环并退出,将消息传递给窗口函数的相应过程处理,消,息,队,列,Windows,将产生的消息,WinMain,函数,WndProc,函数由一个或多个,switch,语句组成。每一条,case,语句对应一种消息,当应用程序接收到一个消息时,相应的,case,语句被激活并执行相应的响应程序模块。,WndProc,包含了对各种可能接收到的消息的处理过程,定义,了应用程序对接收到的不同消息的响应,3,窗口函数,WndProc,窗口函数的一般形式如下:,LRESULT CALLBACK WndProc(HWND hwnd,UINT messgae,WPARAM wParam,LPARAM lParam),switch(message)message,为标识的消息,case,break;,case WM_DESTROY:,PostQuitMessage(0);,default:,return DefWindowProc(hwnd,message,wParam,lParam);,return(0);,在消息处理程序段中一般都有对,WM_DESTROY,的处理,该消息是关闭窗口时发出的。它向应用程序发出,WM_QUIT,消息,请求退出处理函数:,void PostQuitMessage(int nExitCode),/nExitCode,为应用程序的退出代码,为未定义处理过程的消息提供默认的处理,在,Windows.h,中,定义了,Windows,应用程序中包含种类繁多的数据类型,4,数据类型,MSG,:包含一个消息的全部信息,是消息发送的格式,WINDCLASS,:包含一个窗口类的全部信息及属性,POINT,:定义了屏幕上或窗口中的一个点的,X,和,Y,坐标,RECT,:定义了一个矩形区域及其左上角和右下角的坐标,几种重要的结构,5.,一些重要的数据结构,MSG,结构体,typedef struct tagMSG,HWND hwnd;,UINT message;,WPARAM wParam;,LPARAM lParam;,DWORD time;,POINT pt;,MSG;,成员说明,第一个成员变量,hwnd,表示消息所属的窗口。我们通常开发的程序都是窗口应用程序,一个消息一般都是与某个窗口相关联的。例如,在某个活动窗口中按下鼠标左键,产生的按键消息就是发给该窗口的。在,Windows,程序中,用,HWND,类型的,变量,来标识窗口。,第二个成员变量,message,指定了消息的标识符。在,Windows,中,消息是由一个数值来表示的,不同的消息对应不同的数值。但是由于数值不便于记忆,所以,Windows,将消息对应的数值定义为,WM_XXX,宏(,WM,是,Window Message,的缩写)的形式,,XXX,对应某种消息的英文拼写的大写形式。例如,鼠标左键按下消息是,WM_LBUTTONDOWN,,键盘按下消息是,WM_KEYDOWN,,字符消息是,WM_CHAR,,等等。在程序中我们通常都是以,WM_XXX,宏的形式来使用消息的。,分量说明,第三、第四个成员变量,wParam,和,lParam,,用于指定消息的附加信息。例如,当我们收到一个字符消息的时候,,message,成员变量的值就是,WM_CHAR,,但用户到底输入的是什么字符,那么就由,wParam,和,lParam,来说明。,wParam,、,lParam,表示的信息随消息的不同而不同。如果想知道这两个成员变量具体表示的信息,可以在,MSDN,中关于某个具体消息的说明文档查看到。读者可以在,VC+,的开发环境中通过,goto definition,查看一下,WPARAM,和,LPARAM,这两种类型的定义,可以发现这两种类型实际上就是,unsigned int,和,long,。,最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置。,模块定义,(.def),文件,模块定义,(.def),文件为链接器提供有关被链接程序的导出、属性及其他方面的信息。生成,DLL,时,,.def,文件最有用。由于存在可代替模块定义语句使用的链接器选项,通常不需要,.def,文件。也可以将,_declspec(dllexport),用作指定导出函数的手段。在链接器阶段可以使用,/DEF,(指定模块定义文件)链接器选项调用,.def,文件。如果生成的,.exe,文件没有导出,使用,.def,文件将使输出文件较大并降低加载速度。,/,包含应用程序中所需的数据类型和数据结构的定义,LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/,窗口函数说明,/-,以下初始化窗口类,-,int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow),HWND hwnd;,MSG Msg;,WNDCLASS wndclass;,char lpszClassName=,窗口,;/,窗口类名,char lpszTitle=My_Windows;/,窗口标题名,五、应用程序举例,/,窗口类的定义,wndclass.style=0;/,窗口类型为默认类型,wndclass.lpfnWndProc=WndProc;/,定义窗口处理函数,wndclass.cbClsExtra=0;/,窗口类无扩展,wndclass.cbWndExtra=0;/,窗口实例无扩展,wndclass.hInstance=hInstance;/,当前实例句柄,wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);,/,窗口的最小化图标为默认图标,wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);,/,窗口采用箭头光标,wndclass.hbrBackground=GetStockObject(WHITE_BRUSH);,/,窗口背景为白色,wndclass.lpszMenuName=NULL;/,窗口中无菜单,wndclass.lpszClassName=lpszClassName;,/,窗口类名为,窗口,/-,以下进行窗口类的注册,-,if(!RegisterClass(&wndclass),/,如果注册失败则发出警告,MessageBeep(0);,return FALSE;,/-,创建窗口,-,hwnd=CreateWindow,(,lpszClassName,/,窗口类名,lpszTitle,/,窗口实例的标题名,WS_OVERLAPPEDWINDOW,/,窗口的风格,CW_USEDEFAULT,CW_USEDEFAULT,/,窗口左上角坐标为默认值,CW_USEDEFAULT,CW_USEDEFAULT,/,窗口的高和宽为默认值,NULL,/,此窗口无父窗口,NULL,/,此窗口无主菜单,hInstance,/,创建此窗口的应用程序的当前句柄,NULL/,不使用该值,);,/-,显示窗口,-,ShowWindow(hwnd,nCmdShow);,/-,绘制用户区,-,UpdateWindow(hwnd);,/-,消 息 循 环,-,while(GetMessage(&Msg,NULL,0,0),TranslateMessage(,DispatchMessage(,return Msg.wParam;/,消息循环结束即程序终止时将信息返回系统,/,窗口函数,LRESULT CALLBACK WndProc,(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam,),switch(message),case WM_DESTROY:,PostQuitMessage(0);,default:/,默认时采用系统消息默认处理函数,return DefWindowProc(hwnd,message,wParam,lParam);,return(0);,调用,PostQuitMessage,发出,WM_QUIT,消息,补充,WM_DESTROY,是窗口函数必须处理的消息,客户端程序需求,界面:,创建输入编辑框,创建发送按钮,将结果内容在一个区域显示,更好的方法,可视化创建对话框资源,DialobBox,函数显示对话框,DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Main_Proc);/,显示,IDD_DIALOG1,对话框,参数:,hlnstance,:标识一个模块的事例该模块的可执行文件含有对话框模板。,IpTemplate,:标识对话框模板。此参数可以是指向一个以,NULL,结尾的字符串的指针,该字符串指定对话框模板名,或是指定对话框模板的资源标识符中的一个整型值。如果此参数指定了一个资源标识符则它的高位字一定为零,且低位字一定含有标识符。一定用,MAKEINTRESOURDE,宏指令创建此值。,hWndParent,:指定拥有对话框的窗口。,IpDialogFunc,:指向对话框过程的指针,(,类似于,WINPROC,一样,一个回调函数,用来处理各类消息的,),,,DialogBoxParam,实现,int DialogBoxParam(,HINSTANCE hInstance,/handle to application instance,LPCTSTR lpTemplateName,/identifies dialog box template,HWND hWndParent,/handle to owner window,DLGPROC lpDialogFunc,/pointer to dialog box procedure,LPARAM dwInitParam /initialization value,);,非模态对话框,HWND CreateDialog(,HINSTANCE hInstance,/handle to application instance,LPCTSTR lpTemplate,/identifies dialog box template name,HWND hWndParent,/handle to owner window,DLGPROC lpDialogFunc /pointer to dialog box procedure,);,CreateDialogParam,HWND CreateDialogParam(,HINSTANCE hInstance,/handle to application instance,LPCTSTR lpTemplateName,/identifies dialog box template,HWND hWndParent,/handle to owner window,DLGPROC lpDialogFunc,/pointer to dialog box procedure,LPARAM dwInitParam /initialization value,);,备注:,DialogBox,宏用,CreateWindowEx,函数创建对话框。,DialogBox,函数然后把一个,WM_INITDIALOG,消息,(,和一个,WM-SETFONT,消息,如果模板指定,DS_SETFONT,类型)传递到对话框过程。不管模板是否指定,WS_VISIBLE,类型,函数显示对话框,并且使拥有该对话框的窗口(也称属主窗口)失效,且为对话框启动它本身的消息循环来检索和传递消息。,当对话框应用程序调用,EndDialog,函数时,,DialogBox,函数清除对话框户止消息循环,使宿主窗口生效,且返回函数,EndDialog,调用中的,nReSult,参数。,BOOL WINAPI Main_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam),switch(uMsg),case WM_INITDIALOG:,return TRUE;/,消息已处理,不需要再调用真正的内部对话框消息处理函数,case WM_COMMAND:,switch(LOWORD(wParam),case IDOK:,EndDialog(hWnd,1);,return true;,return false;/,其他未处理过的消息,调用内部的消息处理函数,VC,资源脚本,资源脚本,它是一个简单的文本文件,可以手工编辑,也可以让,Visual C,自动编辑,或者你用其它的自动编辑器编辑。无论如何,资源脚本文件要有一个,.rc,的扩展名。大多数的脚本文件都从定义资源行开始,最简单的资源行通常要用到资源类型,就像这样:,identifier resource type filename,【,标识符,】【,资源类型,】【,文件名称,】,标识符可以用两种方式表示:一种是能表示资源意思的字符串,另一种是在资源相对应的头文件中用,#define,定义过的数字常量。如果你选择数字常量,这通常是一个好主意,别忘了把相应的头文件加入到你的资源
展开阅读全文