上一篇,我们已经知道了,一个窗口程序是以事件作为驱动的,其中事件是由消息循环进行处理,首先用GetMessage得到信息,然后TranslateMessage来对信息进行预处理,最后用DispatchMessage调用窗口对应的窗口过程。
补充:应用程序之间也可以进行通信,PostMessage是把消息放到程序的消息队列,用SendMessage是把消息放到应用程序的窗口过程函数里面。
这一篇,我们来学习一下如何去创建一个窗口,从代码上,我们可以看到,程序从start:开始,然后调用了_WinMain函数。
这就是相当于入口函数。
然后我们做了三大步:
- 注册窗口类
- 建立和显示窗口
- 消息循环(已经分析)
现在我们就从注册窗口类去进行学习。
_WinMain proc
LOCAL @stWndClass:WNDCLASSEX
LOCAL @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
;注册窗口类
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW+1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
首先了解一下什么是句柄, 简单的说句柄就是一个用来识别的编号,他对应用程序不会造成任何影响。Windows利用这个编号来识别各种资源。就类似取快递,说尾号123,快递员就能拿到对应的快递。
然后再了解一下什么是模块,模块就是运行中的EXE或者DLL文件,句柄就用来区分这些模块。
invoke GetModuleHandle,NULL
mov hInstance,eax
这里调用GetModuleHandle就是得到本模块的句柄,NULL的意思就是指本模块句柄
然后返回值返回到变量hInstance,这里为什么要这样做,GetModuleHandle还可以怎样用,个人感觉一开始不用深究,先了解大概的情况,后面再去深入了解,现在我们知道我们已经得到了本程序的句柄。
现在我们正式开始注册窗口类:
首先用local来定义一个类对象:
LOCAL @stWndClass:WNDCLASSEX
........
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
然后把对象内存空间全部清零。
有点累了,休息一下
本文地址:https://blog.csdn.net/qq_29263207/article/details/85834718
您可能感兴趣的文章:
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!
网友评论