首页
社区
课程
招聘
[原创]masm32学习2之Application和窗体以及TList的基本完善封装
发表于: 2013-9-5 00:16 4781

[原创]masm32学习2之Application和窗体以及TList的基本完善封装

2013-9-5 00:16
4781
上次基本学习之后,搭建环境之后,初步建立了一个基本的类似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

下一步继续封装,封装一些基础控件

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (1)
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我觉得看雪需要有一个教程区
另外除非有特殊需求,还是别用汇编比较省心
2013-9-5 04:31
0
游客
登录 | 注册 方可回帖
返回
//