Download presentation
Presentation is loading. Please wait.
1
跟我一起学编程系列课程: 第一篇汇编语言 32位汇编
2
第十二章MS-Windows程序设计 第二节 ●Win32控制台编程 ●编写Windows图形界面应用程序 ●动态内存分配 ●IA-32内存管理 ●本章小结
3
编写Windows图形界面应用程序 在本节中,我们来演示如何写出一个简单的Windows下的图形界面应用程序,WinApp.asm程序将创建并显示一个主窗口,显示一些消息框,而且可以响应鼠标动作。下面的内容仅仅试一个简要介绍,因为即使试要描述清楚一个最简单的Windows应用程序中的事件,也需要至少一整章的篇幅。如果读者需要更详尽的信息,请参阅Platform SDK的文档。另一份很好的文献资料是Charles Petzold所著的Programming in Windows:The Definitive Guide to the win32 API一书。 表11.10列出了构建该程序时使用的各种库和包含文件,可以使用本书附带代码Examples\Ch11\WinApp目录下的Visual Studio项目文件构建和运行该程序。 编译时应使用选项/SUBSYSTEM:WINDOWS代替我们在前面章节中使用的/SUBSYSTEM:CONSOLE选项。回到控制台程序时,注意更改回来。 windows系统下,可以设置一个程序对应的console运行于前台还是后台。/SUBSYSTEM:WINDOWS隐藏控制台窗口。 连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 调用 main 函数; 对图形用户界面(GUI)程序设置的入口函数是 WinMainCRTStartup,WinMainCRTStartup 调用 WinMain 函数。 过设置连接器的选项来设置程序是一个Window程序或者是Console程序。
4
编写Windows图形界面应用程序
5
编写Windows图形界面应用程序 把入口点main清空
6
编写Windows图形界面应用程序 程序调用了两个标准Windows库文件:kernel32.lib和user32.lib文件。
主窗口:程序将显示一个填满整个屏幕的主窗口。
7
一、必须了解的数据结构 POINT结构定义了以像素为单位的屏幕上某个点的X和Y坐标,它可以用来定位屏幕上某个对象的坐标,如图形对象、窗口、鼠标单击时的位置等: POINT STRUCT ptX DWORD ? ptY DWORD ? POINT ENDS RECT结构定义了一个矩形的边界,left字段为矩形左边界的X坐标,top字段矩形顶边的Y坐标。类似地,right和bottom字段地值定义了矩形右下角地坐标: RECT STRUCT left DWORD ? top DWORD ? right DWORD ? bottom DWORD ? RECT ENDS MSGStruct结构定义了Windows消息需要的相关数据: MSGStruct STRUCT msgWnd DWORD ? msgMessage DWORD ? msgWparam DWORD ? msgLparam DWORD ? msgTime DWORD ? msgPt POINT <> MSGStruct ENDS
8
一、必须了解的数据结构 WNDCLASS结构定义了一个窗口类,程序中的每个窗口必须属于一个窗口类,所以每个程序必须为它的主窗口创建窗口类。在能够显示主窗口之前,窗口类必须首先在系统里面注册: WNDCLASS STRUC style DWORD ? ; 窗口风格 lpfnWndProc DWORD ? ; 窗口过程地址 cbClsExtra DWORD ? ; 共享内存 cbWndExtra DWORD ? ; 额外定义的数据 hInstance DWORD ? ; 当前程序的句柄 hIcon DWORD ? ; 图标句柄 hCursor DWORD ? ; 光标句柄 hbrBackground DWORD ? ; 背景画刷句柄 lpszMenuName DWORD ? ; 菜单名称的指针 lpszClassName DWORD ? ; 类名称的指针 WNDCLASS ENDS
9
一、必须了解的数据结构 以下是这些字段的简要介绍:
•style是一些不同风格选项的组合,如WS_CAPTION和WS_BORDER,这个字段影响窗口的外观和行为。 •lpfnWndProc是指向一个子程序的指针,这个子程序在我们自己的程序中,用来接收由用户触发的事件消息。 •cbClsExtra定义了这个窗口类所属的所有窗口都可以共享的内存,这个参数可以指定为NULL。 •cbWndExtra参数为每个窗口实例分配一些额外的内存。 •hInstance参数用来保存当前运行程序的句柄。 •hIcon和hCursor参数为当前程序使用的图标和光标句柄。 •hbrBackground参数为背景颜色画刷的句柄。 •lpszMenuName指向一个菜单名称字符串。 •lpszClassName指向一个以0结尾的窗口类名称字符串。
10
二、MessageBox函数 程序显示文本的最简单方法是把文本放到一个消息框中,消息框会弹出并直到用户按下了上面某个按钮为止。Win32 API中的MessageBox函数显示一个简单的消息框,它的函数原型如下所示: MessageBox PROTO, hWnd:DWORD, lpText:PTR BYTE, lpCaption:PTR BYTE, uType:DWORD hWnd是当前窗口的句柄;lpText指向要在消息框中显示的以0结尾的字符串;lpCaption指向要显示在消息框标题栏上的以0结尾的字符串;utyle参数是一个整数,用来描述消息框中的图标(可选)和按钮(必选)的样式。按钮由MB_OK或MB_YESNO等常量定义,图标由MB_ICONQUESTION等常量定义。当想要显示一个消息框的时候,可以把这些常量加一切以便同时显示图标和按钮: INVOKE MessageBox, hWnd, ADDR QuestionText, ADDR QuestionTitle, MB_OK + MB_ICONQUESTION
11
三、WinMain过程 每个Windows应用程序都需要一个启动过程,通常名为WinMain,它负责以下的工作: •获取当前程序的句柄
•装载程序使用的图标和鼠标光标 •注册窗口使用的窗口类,并且指定用来接收窗口事件消息的过程 •创建主窗口 •显示并更新主窗口 •开始一个消息循环来接收和分派处理消息,循环会一直持续到用户关闭了应用程序窗口。 WinMain中包含了一个消息循环,使用GetMessage从程序的消息队列中返回下一个可用的消息。如果GetMessage取到WM_QUIT消息,那么函数返回0,通知WinMain终止程序。对于其他消息,WinMain会把它们传递给DispatchMessage函数,由该函数把消息分发给程序的WinProc过程。要了解更多关于消息方面的知识,可在Platform SDK文档中搜索“Windows Messages”。
12
四、WinProc过程 WinProc过程接收并处理所有和窗口相关的事件消息,大部分的事件是由用户单击,拖动鼠标或按下了一个键盘按键等动作而引起的。该过程的任务是解译每个消息。如果某个消息是可以辨认的,那么运行和该消息对应的任务,下面是过程的声明: WinProc PROC, hWnd:DWORD, ; handle to the window localMsg:DWORD, ; message ID wParam:DWORD, ; parameter 1 (varies) lParam:DWORD ; parameter 2 (varies) 根据不同的消息ID,第3个参数和第4个参数的含义是不同的。如当鼠标被按下的时候,IParam参数里面包含的是鼠标按下点的X和Y坐标。在下面马上要看到的例子中,WinProc过程处理了三种消息: •WM_LBUTTONDOWN,用户按下鼠标左键的时候产生 •WM_CREATE,表明主窗口刚刚被创建 •WM-CLOSE,表明主窗口即将被关闭 举例来说,过程的下面几行代码处理WM_LBUTTONDOWN消息,处理方法是调用MessageBox函数向用户显示一条提示信息: .IF eax == WM_LBUTTONDOWN INVOKE MessageBox, hWnd, ADDR PopupText, ADDR PopupTitle, MB_OK jmp WinProcExit 用户看到的结果如图11.5所示。任何我们不想处理的消息都应该传递给Windows的默认消息处理函数DefWindowsProc。
13
五、ErrorHandler过程 ErrorHandler过程是可选的,如果程序的主窗口在注册和创建的过程中发生错误,就会调用这个过程。举例来说,调用RegisterClass函数时,如果窗口类成功注册,那么函数会返回一个非0值。若函数返回0,则可调用ErroHandler来显示错误信息并退出程序的执行: INVOKE RegisterClass, ADDR MainWin .IF eax == 0 call ErrorHandler jmp Exit_Program .ENDIF ErrorHandler过程完成了下面几件重要的事情: •调用GetLastError函数获取系统错误代码 •调用FormatMessage函数获取操作系统格式化的出错信息字符串 •调用MessageBox显示包含出错信息的消息框 •调用LocalFree函数释放为出错信息字符串分配的内存。
14
六、程序清单 winAPP.asm 略 需要查阅几个API的具体细节信息:
WNDCLASS,GetModuleHandle,LoadIcon,LoadCursor,RegisterClass,CreateWindowEx,ShowWindow,GetMessage,DispatchMessage
15
本节视频的课后练习 1、请描述POINT结构 2、WNDCLASS结构时怎样使用的?
3、WNDCLASS结构的lpfnWndProc字段的含义是什么? 4、WNDCLASS结构的style字段的含义是什么? 5、WNDCLASS结构的hInstance字段的含义是什么? 6、调用CreateWindowsEx函数的时候,是如何把窗口的外观信息传递给函数的? 7、试举一个调用MessageBox函数的例子。 8、说出两个定义MessageBox函数显示的消息框上的按钮的常量。 9、说出两个定义MessageBox函数显示的消息框上的图标常量。 10、说出至少三个由WinMain过程所做的工作。 11、描述WinProc过程在例子程序中扮演的角色。 12、例子程序中的WinProc过程处理了哪些消息? 13、描述ErrorHandle过程在例子程序中扮演的角色。 14、例子程序中,调用CreateWindow函数后,消息框是在主窗口显示前还是显示后出现的? 15、例子程序中,由WM_CLOSE消息激活的消息框是在主窗口关闭前还是关闭后出现的? 课后练习请务必完成后,再继续学习后面的课程。官网视频播放页面有参考答案。
16
0512-57882866 www.bcdaren.com 昆山爱达人 1250121864 昆山爱达人信息技术有限公司 视频录制:编程达人
视频提供 视频录制:编程达人 联系电话: 官网地址: 联系公众号: 昆山爱达人 联系QQ: 编程达人APP:
Similar presentations