[原创]masm32学习2之Application和窗体以及TList的基本完善封装
上次基本学习之后,搭建环境之后,初步建立了一个基本的类似Delphi的程序框架模式,同志们都说用汇编封装没神马意义。呵呵,实际说来确实貌似意义不怎么大,不过自己学习罢了,边学边整理,可以加深印象,学习而言,学了不用,才没意义了。所以这个东西,我还是继续下去了,目前封装出了类似Delphi的TList的列表用来管理窗体的,同时增加了应用程序,增加了基本的消息流通方向,基本的控件结构架构定义出台。大致结构如下
;>>>>>>>>>>>>>>Control对象 DxControlInfo struct self dd ? ;控件自身的地址 Parent dd ? ;父类对象地址 Color dd ? WndProc dd ? MouseDown dd ? ;鼠标按下 MouseUp dd ? ;鼠标弹起 SetParent dd ? ;设置父 Free dd ? ;释放 DxControlInfo ends
;>>>>>>>>>>>>>>Wincontrol对象 DxWinControlInfo struct ControlInfo DxControlInfo <> Handle dd ? Controls dd ?;组件列表 DxWinControlInfo ends ;>>>>>>>>>>>>>>窗体对象 DxForm struct WInfo DxWinControlInfo <> ;WinControl组件信息 ModalResult dd ? ModelLevel dd ? ;上面的模态窗口层数 Caption dd ? ;窗体标题 ;函数 Create dd ? ;创建窗体 Show dd ? ShowModal dd ? Close dd ? DxForm ends
这样,如果要写一个新的控件,都可以类似DxForm这个窗体对象的模式定义为WinControl,如果定义GraphicControl就在第一个结构位置防止ControlInfo。这样,访问的时候,我们根据是GraphicControl还是WinControl都可以在结构体的第一个位置访问到对应的信息
目前的窗体函数就实现了创建,显示以及模态显示以及释放等。
程序的具体代码样式如下
.386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include DxApplication.inc includelib DxApplication.lib .data Application DxApp <> szcap db '消息',0 sztxt db '鼠标%s键按下的是位置x=%d,y=%d',0 sztitle db '不得闲测试窗体',0 szLeft db '左',0 szRight db '右',0 szout db 100 dup(0) .code _MouseDown proc uses esi MouseBtn:byte,xPos:dword,ypos:dword mov esi,eax .if MouseBtn==mbLeft invoke wsprintf,offset szout,offset sztxt,offset szLeft, xPos,ypos ;创建一个新窗体 call RegisterFormInfo mov esi,eax mov [esi].DxForm.WInfo.Handle,0 mov [esi].DxForm.WInfo.ControlInfo.Parent,0 mov [esi].DxForm.WInfo.ControlInfo.WndProc,0 RGB 0,255,24 mov [esi].DxForm.WInfo.ControlInfo.Color,eax push esi;传递空,表示创建主窗体 call Application.CreateForm mov eax,esi call [eax].DxForm.ShowModal; mov eax,esi call [eax].DxForm.WInfo.ControlInfo.Free invoke MessageBox,[esi].DxForm.WInfo.Handle,offset szout,offset szcap,64 .else invoke wsprintf,offset szout,offset sztxt,offset szRight, xPos,ypos .endif ret _MouseDown endp winmain proc call RegisterFormInfo mov edi,eax mov [edi].DxForm.WInfo.Handle,0 mov [edi].DxForm.Caption,offset sztitle mov [edi].DxForm.WInfo.ControlInfo.MouseDown,offset _MouseDown mov [edi].DxForm.WInfo.ControlInfo.Parent,0 mov [edi].DxForm.WInfo.ControlInfo.WndProc,0 RGB 223,255,0 mov [edi].DxForm.WInfo.ControlInfo.Color,eax mov Application.hInstance,0 mov Application.MainForm,edi invoke CreateApplication,offset Application push NULL;传递空,表示创建主窗体 call Application.CreateForm mov eax,esi call Application.Run winmain endp start: call winmain end start
本程序的效果就是创建一个窗体,然后指定了窗体的鼠标按下事件,在鼠标左键按下的时候会弹出一个模态窗体,然后弹出一个对话框显示鼠标点击的位置
具体程序下载地址
DxAsmVCL.zip
下一步继续封装,封装一些基础控件
