MFC利用WindowsAPI开发Win32程序实例.ppt
《MFC利用WindowsAPI开发Win32程序实例.ppt》由会员分享,可在线阅读,更多相关《MFC利用WindowsAPI开发Win32程序实例.ppt(113页珍藏版)》请在三一办公上搜索。
1、2/10/2023,WINDOWS程序开发 讲师:鲍钰,1,利用Windows API开发Win32程序实例,2/10/2023,WINDOWS程序开发 讲师:鲍钰,2,WINDOWS程序,WINDOWS程序分为“程序代码”和“UI资源”两大部分。UI即USER INTERFACE,用户界面。UI资源包括功能菜单、对话框外观、程序图标、光标形状等等。,2/10/2023,WINDOWS程序开发 讲师:鲍钰,3,.DLG,.BMP,.ICO,.CUR,.FON,.RC,.H,.C,.OBJ,.LIBDLL Import,.DEF,RC compiler,Text Editor,Dialog Ed
2、itor,Image Editor,Font Editor,C Compiler,LINKER,.EXE,.RES,2/10/2023,WINDOWS程序开发 讲师:鲍钰,4,窗口,1不是黑底白字2.而是 框架菜单按钮滚动条称为窗口要素3.窗口类型 Console 文字类型Window 菜单+用户区域DialogMessage Box4.实现途径GDI(图形设备接口,GDI32.DLL),2/10/2023,WINDOWS程序开发 讲师:鲍钰,5,创建一个空的WIN32 APPLICATION工程,工程名为Hello World。下一步,在空的工程中加入C+语言的源程序文件。在Visual C
3、+6.0的File菜单中选择new选项;在弹出的File菜单中选择C Source File;选中Add to project 选框;选中加入到那个工程中,这里是Hello World,就是刚才创建的工程;填写文件名,这里是HelloWorld,下面是工程的存放路径;最后,选择OK,2/10/2023,WINDOWS程序开发 讲师:鲍钰,6,目录Hello World,#includeint WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpcmdLine,int nCmdShow)MessageBox(NUL
4、L,TEXT(Info:Hello World!),TEXT(Title:My 1st Program),MB_OK);return 0;,2/10/2023,WINDOWS程序开发 讲师:鲍钰,7,#include程序包含了一个头文件windows.h,基本上所有的Windows程序都会包含这个文件。它定义了Windows的基本数据类型、数据结构、系统函数等。,2/10/2023,WINDOWS程序开发 讲师:鲍钰,8,Windows API(Application Programming Interface)是Windows操作系统与应用程序之间的标准接口,它提供了上千个标准函数,宏和数据
5、结构的定义.API函数定义在一些动态链接库中(.DLL),其中,最主要的是User.dll,Gdi.dll和Kernel.dll3个DLL文件.User.dll库中定义了窗口管理函数,包括窗口的创建,显示,移动等;Gdi.dll中定义了许多图形,图像设备函数(GDI),提供了与设备无关的图形绘制功能;Kernel.dll定义了系统服务函数,包括内存调度,进程管理等与操作系统有关的低层函数.,API函数,2/10/2023,WINDOWS程序开发 讲师:鲍钰,9,Windows程序是以WinMain函数为入口的,这个函数的定义如下:函数原型 int WINAPI WinMain(HINSTANC
6、E hInstance,HINSTANCE hPrevInstance,LPSTR lpcmdLine,int nCmdShow);第一个参数hInstance是当前实例句柄,为一个整数,用于标识窗口、程序等。第二个参数hPrevInstance 被置为NULL。第三个参数lpcmdLine是运行程序的命令行。第四个参数nCmdShow用于指定程序窗口最初的显示模式,可以在初始是指定是正常还是最大化等。WinMain函数返回一个整数。WINAPI用于指定调用约定,具体在WINDEH.H中定义。,2/10/2023,WINDOWS程序开发 讲师:鲍钰,10,MessageBox是一个Window
7、s API函数,用于弹出一个对话框,显示一些简短的信息。定义如下:函数原型MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);第一个参数hWnd是一个窗口句柄,表明对话框所属的窗口。第二个参数lpText是一个字符串,表明需要显示的信息。TEXT是一个宏。第三个参数lpCaption是一个字符串,表明对话框的标题。第四个参数uType用于指定对话框中的按钮和图标。各种按钮和图标类型可以同时使用,用“|”连接,如“MB_OK|MB_ERROR”。,2/10/2023,WINDOWS程序开发 讲师:鲍钰,11,类型按钮
8、图标MB_OK确定-MB_OKCANCEL确定和取消-MB_YESNO是和否-MB_YESNOCANCEL是和否和取消-MB_ICONINFORMATION-提示MB_ICONWARNING-警告MB_ICONERROR-出错试试让系统弹出不同的对话框,2/10/2023,WINDOWS程序开发 讲师:鲍钰,12,#define MB_OK 0 x00000000L#define MB_OKCANCEL 0 x00000001L#define MB_ABORTRETRYIGNORE 0 x00000002L#define MB_YESNOCANCEL 0 x00000003L#define M
9、B_YESNO 0 x00000004L#define MB_RETRYCANCEL 0 x00000005L#define MB_ICONQUESTION 0 x00000020L#define MB_ICONEXCLAMATION 0 x00000030L#define MB_ICONASTERISK 0 x00000040L#define MB_ICONWARNING MB_ICONEXCLAMATION#define MB_ICONINFORMATION MB_ICONASTERISK#define MB_DEFBUTTON1 0 x00000000L#define MB_DEFBUT
10、TON2 0 x00000100L#define MB_DEFBUTTON3 0 x00000200L,2/10/2023,WINDOWS程序开发 讲师:鲍钰,13,用MessageBox()的返回值判断,返回值含意如下:IDABORT:Abort 按钮被选中。IDCANCEL:Cancel按钮被选中。IDIGNORE:Ignore按钮被选中。IDNO:NO按钮被选中。IDOK:OK按钮被选中。IDRETRY:RETRY按钮被选中。IDYES:YES按钮被选中。,2/10/2023,WINDOWS程序开发 讲师:鲍钰,14,目录Hello World,int result;result=Mes
11、sageBox(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(NU
12、LL,你点了忽略按钮,结果,MB_ICONINFORMATION|MB_OK);break;,2/10/2023,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/10/2023,WINDOWS程序开发 讲师:鲍钰,16,
13、TEXT 宏的主要作用是当定义了 UNICODE/_UNICODE 预处理指令时,字符串被标志为双字节字符串。,UNICODE 是目前用来解决 ASCII 码 256 个字符限制问题的一种比较流行的解决方案。大家知道,ASCII 字符集只有256个字符,用 0-255 之间的数字来表示。包括大小写字母、数字以及少数特殊字符;如标点符号、货币符号等。对于大多数拉丁语言来说,这些字符已经够用。但是,许多亚洲和东方语言所用的字符远远不止256个字符。有些超过千个。人们为了突破 ASCII 码字符数的限制,试图用一种简单的方法来针对超过256个字符的语言编写计算机程序。于是 UNICODE 应运而生。
14、UNICODE 通过用双字节来表示一个字符,从而在更大范围内将数字代码映射到多种语言的字符集。,2/10/2023,WINDOWS程序开发 讲师:鲍钰,17,事件和事件驱动,Windows程序为消息而“生”,因消息而“死”Windows操作环境中,无论是系统产生的动作或用户运行应用程序产生的动作,称为事件(Events)产生的消息(Message)。事件通常以以下三种方式产生通过输入设备,如键盘和鼠标通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件来自Windows内部,2/10/2023,WINDOWS程序开发 讲师:鲍钰,18,基于事件驱动的程序模型,事件和事件驱动,2/1
15、0/2023,WINDOWS程序开发 讲师:鲍钰,19,消息的数据结构消息的数据结构MSG的定义如下:typedef struct tagMSG HWND hwnd;/用以检索消息的窗口句柄 UINT message;/消息值 WPARAM wParam;/包含有关消息的附加信息LPARAM lParam;/随不同的消息而有所不同DWORD time;/消息送到队列的时间POINT pt;/消息发送时,屏幕光标的位置MSG;,消息的描述,2/10/2023,WINDOWS程序开发 讲师:鲍钰,20,支持队列特征的消息驱动模型,消息的描述,2/10/2023,WINDOWS程序开发 讲师:鲍钰,
16、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系统需要重绘时产生的
17、消息。,消息的描述,2/10/2023,WINDOWS程序开发 讲师:鲍钰,22,WinMain()初始化;while(GetMessage(,系统消息队列,WndProc(msg),switch(msg)case MSG1:case MSG2:,应用程序消息队列,mousedriver,keyboarddriver,SendMessage(),USERModule,message fromOther window,PostMessage(),system,一个具体的窗口程序,2/10/2023,WINDOWS程序开发 讲师:鲍钰,23,WinMain()程序入口点注册窗口 RegisterC
18、lass()生成并显示窗口 CreateWindow()ShowWindow()消息循环WndProc()窗口函数(功能实现)区分消息 switch根据消息触发相应处理调用DefWindowProc()不处理的消息、和需要系统进一步处理的消息如WM_CLOSE,使用者关闭了窗口。应用程序获得这个消息后,释放了自己的资源,然后让系统进一步执行关闭窗口的动作,Windows程序组成,2/10/2023,WINDOWS程序开发 讲师:鲍钰,24,WinMain()初始化;创建、显示、更新窗口;建立基于消息的 事件驱动机制,WinMain()RegisterClass();CreateWindow()
19、;ShowWindow();UpdateWindow();while(GetMessage(,WinMain()程序入口点,详解入口,2/10/2023,WINDOWS程序开发 讲师:鲍钰,25,详解入口,WinMain函数的原型如下:int WINAPI WinMain(HINSTANCE hInstance,/当前实例句柄HINSTANCE hPrevInstance,/以前的实例句柄LPSTR lpCmdLine,/指向命令行参数的指针int nCmdShow)/窗口的显示状态,2/10/2023,WINDOWS程序开发 讲师:鲍钰,26,初始化包括窗口类的定义注册窗口类创建窗口显示窗口
20、 需要注意的是,在显示窗口ShowWindow函数后,需调用UpdateWindow()函数更新并绘制用户区,并发出WM_PAINT消息。,详解窗口,2/10/2023,WINDOWS程序开发 讲师:鲍钰,27,注册窗口RegisterClass()在注册之前可以设置窗口属性,系统会给出一些缺省值,我们重点关心其中的lpfnWndProc参数,WNDCLASS wc;wc.stvle=;wc.lpfnWndProc(WNDPROC)WndProc;,提示系统收到消息后,调该函数处理消息,wc.hIcon=,wc.Cursor=,wc.hbrBackground=,RegisterClass(,
21、详解窗口,2/10/2023,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 l
22、pParam)/其他窗口创建时的参数数据,2/10/2023,WINDOWS程序开发 讲师:鲍钰,29,消息本身是一个unsigned int变量类型有WM_COMMAND:系统命令类,菜单选择,按钮等WM_PAINT:对窗口作图WM_DESTORY:关闭窗口WM_USER:用户可自定义一些消息在某个特定类型之下,更有许多事件,一般通过wParam通知,详解消息,2/10/2023,WINDOWS程序开发 讲师:鲍钰,30,while(GetMessage(GetMessage具有阻塞机制当消息队列中没有消息时,程序非忙等,而是让权等待当收到WM_QUIT时,GetMessage返回false
23、,循环停止,同时应用程序终止。DispatchMessage通过USER模块协助,将消息传递到WndProcWndProc的调用指示在注册窗口类时,已向系统指明,详解消息采集,2/10/2023,WINDOWS程序开发 讲师:鲍钰,31,WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam),HWND hWnd:窗口句柄,在与窗口有关的控制中使用,UINT message:消息(类型),WPARAM wParam:传递的参数,LPARAM lParam:传递的参数,在基于消息的机制中,有时仅有消息是不够的产生消息的同时,传递什么样
24、的参数要视具体的消息而定,消息处理函数是用于处理特定消息的一些代码,一般包括一个多分支switch语句结构。,2/10/2023,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/10/2023,WINDOWS程序开
25、发 讲师:鲍钰,33,Windows数据类型,2/10/2023,WINDOWS程序开发 讲师:鲍钰,34,Windows将使用的所有类型定义在Windows.h文件和其相关的文件中。一些常用的类型有句柄(HANDLE)、窗口句柄(HWND)、字符(BYTE)、短整数(WORD)、布尔型(BOOL)、字符串指针(LPSTR)以及常量字符串指针(LPCSTR)等。HANDLE是一个用作句柄的32位整数,句柄是代表某些资源的简单的数值,所有的句柄类型以H开头。凡是数据类型的前缀是P或LP,则表示该类型是一个指针或长指针数据类型。若前缀是U,则表示无符号数据类型,等等。,Windows数据类型,2/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 利用 WindowsAPI 开发 Win32 程序 实例
链接地址:https://www.31ppt.com/p-2311338.html