win32汇编第一个窗口程序
来源:互联网 发布:软件的demo片 编辑:程序博客网 时间:2024/05/22 11:38
窗口程序的运行过程
(1)得到应用程序的句柄(GetModuleHandle)。
(2)注册窗口类(RegisterClassEx),在注册之前,要填写RegisterClassEx的参数WNDCLASSEX结构。
(3)建立窗口(CreateWindowEx)。
(4)显示窗口(ShowWindow)。
(5)刷新窗口客户区(UpdateWindow)。
(6)进入无限的消息获取和处理的循环。首先获取消息(GetMessage),如果有消息到达,则将消息分派到窗口过程(窗口过程就是我们自己编写的处理消息的一个子程序)去处理,如果消息是退出消息(WM_QUIT代表退出,WM是Windows Message的缩写),则退出循环。
Ex是指扩展,在win16中是RegisterClass。
那么程序的结构就很清晰了。按着前5个步骤,依次执行,然后进入循环,根据不同消息的到来(如点击某个按钮),调用窗口过程来处理。在窗口过程中,要根据消息的不同进行不同的处理。
关于Windows对消息的处理。Windows在内部有个系统消息队列,当输入设备有所动作时,如点击鼠标,按键盘等,Windows会产生相应的记录放在系统消息队列里。每个记录包含消息的类型,发生的位置和时间等信息。
同时Windows为每个窗口进程(线程)维护一个消息队列。Windows检测系统消息队列里的消息的发生位置(可以认为是在显示器上的二维坐标),如果它在某个窗口进程范围内,就把它放到该进程的消息队列里。因此在编写的代码中,设置了获取和处理消息的循环,每次取出一个消息,并通过调用窗口过程作处相应的处理。
注释解释很清楚了,看代码的时候先看_WinMain子程序,在看_ProcWinMain子程序。
.386.model flat,stdcalloption casemap:noneinclude windows.incinclude gdi32.incincludelib gdi32.libinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.lib.datahInstance dd ? ;存放应用程序的句柄hWinMain dd ? ;存放窗口的句柄.constszClassName db 'MyClass',0szCaptionMain db 'My first Window!',0szText db 'Win32 Assembly,Simple and powerful!',0.code_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam ;窗口过程local @stPs:PAINTSTRUCTlocal @stRect:RECTlocal @hDcmov eax,uMsg ;uMsg是消息类型,如下面的WM_PAINT,WM_CREATE.if eax==WM_PAINT ;如果想自己绘制客户区,在这里些代码,即第一次打开窗口会显示什么信息invoke BeginPaint,hWnd,addr @stPsmov @hDc,eaxinvoke GetClientRect,hWnd,addr @stRectinvoke DrawText,@hDc,addr szText,-1,addr @stRect,DT_SINGLELINE or DT_CENTER or DT_VCENTER ;这里将显示szText里的字符串invoke EndPaint,hWnd,addr @stPs.elseif eax==WM_CLOSE ;窗口关闭消息invoke DestroyWindow,hWinMaininvoke PostQuitMessage,NULL;----------------------;显然这这部分是自己添加的相应处理事件的代码,如添加某个按钮,点击该按钮会发生什么事等。;还有其他的消息类型如WM_CREATE,代表窗口创建时,WM_COMMAND表示点击按钮时,在这里添加分支,编写相应的处理事件的代码;----------------------.else ;否则按默认处理方法处理消息invoke DefWindowProc,hWnd,uMsg,wParam,lParamret.endifxor eax,eaxret_ProcWinMain endp_WinMain proc ;窗口程序local @stWndClass:WNDCLASSEX ;定义了一个结构变量,它的类型是WNDCLASSEX,一个窗口类定义了窗口的一些主要属性,图标,光标,背景色等,这些参数不是单个传递,而是封装在WNDCLASSEX中传递的。local @stMsg:MSG;还定义了stMsg,类型是MSG,用来作消息传递的invoke GetModuleHandle,NULL ;得到应用程序的句柄,把该句柄的值放在hInstance中,句柄是什么?简单点理解就是某个事物的标识,有文件句柄,窗口句柄,可以通过句柄找到对应的事物mov hInstance,eaxinvoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass ;将stWndClass初始化全0invoke LoadCursor,0,IDC_ARROWmov @stWndClass.hCursor,eax;---------------------------------------push hInstance;pop @stWndClass.hInstance;mov @stWndClass.cbSize,sizeof WNDCLASSEX;这部分是初始化stWndClass结构中各字段的值,即窗口的各种属性mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW;入门的话,这部分直接copy- -。。。为了赶汇编作业,没时间钻研mov @stWndClass.lpfnWndProc,offset _ProcWinMain;;上面这条语句其实就是指定了该窗口程序的窗口过程是_ProcWinMain;mov @stWndClass.hbrBackground,COLOR_WINDOW+1;mov @stWndClass.lpszClassName,offset szClassName;---------------------------------------invoke RegisterClassEx,addr @stWndClass ;注册窗口类,注册前先填写参数WNDCLASSEX结构invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ ;建立窗口offset szClassName,offset szCaptionMain,\ ;szClassName和szCaptionMain是在常量段中定义的字符串常量WS_OVERLAPPEDWINDOW,100,100,600,400,\;szClassName是建立窗口使用的类名字符串指针,这里是'MyClass',表示用'MyClass'类来建立这个窗口,这个窗口拥有'MyClass'的所有属性NULL,NULL,hInstance,NULL;如果改成'button'那么建立的将是一个按钮,szCaptionMain代表的则是窗口的名称,该名称会显示在标题栏中mov hWinMain,eax ;建立窗口后句柄会放在eax中,现在把句柄放在hWinMain中。invoke ShowWindow,hWinMain,SW_SHOWNORMAL ;显示窗口,注意到这个函数传递的参数是窗口的句柄,正如前面所说的,通过句柄可以找到它所标识的事物invoke UpdateWindow,hWinMain ;刷新窗口客户区.while TRUE ;进入无限的消息获取和处理的循环invoke GetMessage,addr @stMsg,NULL,0,0 ;从消息队列中取出第一个消息,放在stMsg结构中.break .if eax==0 ;如果是退出消息,eax将会置成0,退出循环invoke TranslateMessage,addr @stMsg ;这是把基于键盘扫描码的按键信息转换成对应的ASCII码,如果消息不是通过键盘输入的,这步将跳过invoke DispatchMessage,addr @stMsg ;这条语句的作用是找到该窗口程序的窗口过程,通过该窗口过程来处理消息.endwret_WinMain endpmain proccall _WinMain ;主程序就调用了窗口程序和结束程序两个函数invoke ExitProcess,NULLretmain endpend main
这就是一个简单窗口程序的模板。
阅读全文
0 0
- WIN32汇编-第一个窗口程序
- win32汇编第一个窗口程序
- Win32汇编——第一个窗口程序
- 第一个Win32窗口程序
- 第一个Win32窗口程序
- win32 002 第一个窗口程序
- 第一个Win32汇编
- 第一个WIN32程序
- 第一个Win32程序
- 第一个win32程序
- 第一个Win32程序
- MASM写的第一个Win32 窗口程序
- 第一个窗口程序
- 第一个窗口程序
- 第一个窗口程序
- WIN32汇编下的窗口程序
- Win32汇编--开始了解窗口程序
- win32汇编--创建窗口程序(RadAsm)
- java匿名内部类
- (三)TensorFlow实现神经网络
- python模块之re与正则
- CSS3 calc()属性的使用
- EmEditor Professional (文本编辑器) 官方破解版64位V17.3.1下载 | 含emeditor注册码
- win32汇编第一个窗口程序
- [DP] Luogu1681 最大正方形II
- 拦截器
- [LeetCode]740. Delete and Earn
- 搜索页面跳转到商品列表的方法
- fastclick的使用
- CUDA学习笔记(5) 原子操作
- Git 实际操作之一
- 【ReactJS 初体验】Module build failed: TypeError: fileSystem.statSync is not a function