欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

win32汇编 第一个窗口程序(二)

程序员文章站 2022-03-03 19:44:37
上一篇,我们已经知道了,一个窗口程序是以事件作为驱动的,其中事件是由消息循环进行处理,首先用GetMessage得到信息,然后TranslateMessage来对信息进行预处理,最后用DispatchMessage调用窗口对应的窗口过程。补充:应用程序之间也可以进行通信,PostMessage是把消息放到程序的消息队列,用SendMessage是把消息放到应用程序的窗口过程函数里面。这......

上一篇,我们已经知道了,一个窗口程序是以事件作为驱动的,其中事件是由消息循环进行处理,首先用GetMessage得到信息,然后TranslateMessage来对信息进行预处理,最后用DispatchMessage调用窗口对应的窗口过程。

 补充:应用程序之间也可以进行通信,PostMessage是把消息放到程序的消息队列,用SendMessage是把消息放到应用程序的窗口过程函数里面。


 这一篇,我们来学习一下如何去创建一个窗口,从代码上,我们可以看到,程序从start:开始,然后调用了_WinMain函数。

   这就是相当于入口函数。

   然后我们做了三大步:

  1.   注册窗口类
  2.   建立和显示窗口
  3.   消息循环(已经分析)

现在我们就从注册窗口类去进行学习。

_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