⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toolbox.asm

📁 汇编资源编辑器
💻 ASM
字号:
NoOfButtons		equ	33
ButtonSize		equ	26

.data

nButtons			dd NoOfButtons
szToolBoxTlt		db 'Pointer,EditText,Static,GroupBox,Button,CheckBox,RadioButton,ComboBox,ListBox,HScroll,VScroll,TabStrip,ProgressBar,TreeView,'
					db 'ListView,TrackBar,UpDown,Image,ToolBar,StatusBar,DatePicker,MonthView,RichEdit,UserDefinedControl,ImageCombo,Shape,IPAddress,Animate,HotKey,HPager,VPager,ReBar,Header',0
					db 512 dup(?)
.data?

hButtons			dd NoOfButtons+32 dup(?)
OldToolBoxBtnProc	dd ?
hToolTip			dd ?
hBoxIml				dd ?
ToolBoxID			dd ?

.code

ToolBoxReset proc uses ecx edi

	mov		ecx,nButtons
	dec		ecx
	mov		edi,offset hButtons+4
  @@:
	push	ecx
	push	edi
	mov		eax,[edi]
	invoke SendMessage,eax,BM_SETCHECK,BST_UNCHECKED,0
	pop		edi
	add		edi,4
	pop		ecx
	loop	@b
	invoke SendMessage,hButtons[0],BM_SETCHECK,BST_CHECKED,0
	mov		ToolBoxID,0
	ret

ToolBoxReset endp

ToolBoxSize	proc uses ecx esi,lParam:LPARAM
	LOCAL	wt:DWORD
	LOCAL	xP:DWORD
	LOCAL	yP:DWORD
	LOCAL	hBtn:DWORD

	mov		eax,lParam
	and		eax,0FFFFh
	mov		wt,eax
	mov		xP,0
	mov		yP,0
	mov		ecx,nButtons
	mov		esi,offset hButtons
  @@:
	push	ecx
	push	esi
	mov		eax,dword ptr [esi]
	mov		hBtn,eax
	invoke MoveWindow,hBtn,xP,yP,ButtonSize,ButtonSize,TRUE
	add		xP,ButtonSize
	mov		eax,xP
	add		eax,ButtonSize
	.if	eax>wt
		mov		xP,0
		add		yP,ButtonSize
	.endif
	pop		esi
	pop		ecx
	add		esi,4
	loop	@b
	ret

ToolBoxSize	endp

ToolBoxBtnProc proc	uses ebx,hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

	mov		eax,uMsg
	.if	eax==WM_LBUTTONDOWN
		mov		eax,ToolBoxID
		shl		eax,2
		mov		ebx,offset hButtons
		add		ebx,eax
		invoke SendMessage,[ebx],BM_SETCHECK,BST_UNCHECKED,0
		invoke SendMessage,hWin,BM_SETCHECK,BST_CHECKED,0
		invoke GetWindowLong,hWin,GWL_ID
		mov		ToolBoxID,eax
		invoke GetParent,hWin
		invoke SetFocus,eax
		xor		eax,eax
		ret
	.elseif eax==WM_MOUSEMOVE
		.if hStatus
			invoke SendMessage,hStatus,SB_SETTEXT,nStatus,offset szNULL
		.endif
	.endif
	invoke CallWindowProc,OldToolBoxBtnProc,hWin,uMsg,wParam,lParam
	ret

ToolBoxBtnProc endp

Do_ToolBoxButton proc hWin:HWND,CtlID:DWORD,hIml:DWORD
	LOCAL	hBtn:DWORD
	LOCAL	ti:TOOLINFO
	LOCAL	buffer[64]:BYTE

	invoke CreateWindowEx,0,addr szButtonClass,0,
			WS_VISIBLE or WS_CHILD or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or	BS_PUSHLIKE	or BS_AUTORADIOBUTTON or BS_ICON,
			0,0,0,0,hWin,CtlID,hInstance,NULL
	mov		hBtn,eax
	mov		ecx,CtlID
	mov		hButtons[ecx*4],eax
	invoke ImageList_GetIcon,hIml,CtlID,ILD_NORMAL
	invoke SendMessage,hBtn,BM_SETIMAGE,IMAGE_ICON,eax
	invoke SetWindowLong,hBtn,GWL_WNDPROC,offset ToolBoxBtnProc
	mov		OldToolBoxBtnProc,eax
	invoke GetStrItem,addr szToolBoxTlt,addr buffer
	mov		ti.cbSize,sizeof TOOLINFO
	mov		ti.uFlags,TTF_IDISHWND or TTF_SUBCLASS
	mov		ti.hWnd,0
	mov		eax,hBtn
	mov		ti.uId,eax
	mov		ti.hInst,0
	lea		eax,buffer
	mov		ti.lpszText,eax
	invoke SendMessage,hToolTip,TTM_ADDTOOL,NULL,addr ti
	mov		eax,hBtn
	ret

Do_ToolBoxButton endp

AddCustomControl proc uses ebx esi edi,lpszDLL:DWORD
	LOCAL	mDC:HDC
	LOCAL	nColor:DWORD
	LOCAL	rect:RECT
	LOCAL	fEx:DWORD
	LOCAL	buffer[64]:BYTE

	invoke LoadLibrary,lpszDLL
	.if eax
		push	eax
		mov		ebx,eax
		invoke GetProcAddress,ebx,offset szGetDefEx
		mov		fEx,eax
		.if !eax
			invoke GetProcAddress,ebx,offset szGetDef
		.endif
		.if eax
			mov		ebx,eax
			xor		esi,esi
			.while eax
				push	esi
				call	ebx
				.if eax
					call	InstallDLL
					xor		eax,eax
					inc		eax
				.endif
				inc		esi
			.endw
		.endif
		invoke GetClientRect,hTlb,addr rect
		mov		eax,rect.bottom
		shl		eax,16
		add		eax,rect.right
		invoke ToolBoxSize,eax
		pop		eax
	.endif
	ret

InstallDLL:
	push	ebx
	mov		edi,eax
	mov		ebx,offset ctltypes
	mov		eax,nButtons
	mov		ecx,sizeof TYPES
	mul		ecx
	lea		ebx,[ebx+eax]
	mov		eax,[edi].CCDEF.ID
	mov		[ebx].TYPES.ID,eax
	mov		eax,[edi].CCDEF.lpcaption
	mov		[ebx].TYPES.lpcaption,eax
	mov		eax,[edi].CCDEF.lpname
	mov		[ebx].TYPES.lpidname,eax
	mov		eax,[edi].CCDEF.lpclass
	mov		[ebx].TYPES.lpclass,eax
	mov		eax,[edi].CCDEF.style
	mov		[ebx].TYPES.style,eax
	mov		eax,[edi].CCDEF.exstyle
	mov		[ebx].TYPES.exstyle,eax
	mov		eax,[edi].CCDEF.flist1
	mov		[ebx].TYPES.flist,eax
	mov		eax,[edi].CCDEF.flist2
	mov		[ebx].TYPES.flist[4],eax
	.if fEx
		mov		eax,[edi].CCDEFEX.flist3
		mov		[ebx].TYPES.flist[8],eax
		mov		eax,[edi].CCDEFEX.flist4
		mov		[ebx].TYPES.flist[12],eax
		mov		eax,[edi].CCDEFEX.lpmethod
		.if eax
			mov		edx,nPr
			mov		[ebx].TYPES.nmethod,edx
			mov		[ebx].TYPES.methods,eax
		.endif
		mov		edx,[edi].CCDEFEX.lpproperty
		.while byte ptr [edx]
			push	edx
			mov		buffer,','
			invoke GetStrItem,edx,addr buffer[1]
			invoke lstrcat,offset PrAll,addr buffer
			mov		ecx,nPr
			inc		nPr
			mov		eax,80000000h
			.if ecx>=128
			.elseif ecx>=96
				sub		ecx,96
				shr		eax,cl
				or		[ebx].TYPES.flist[12],eax
			.elseif ecx>=64
				sub		ecx,64
				shr		eax,cl
				or		[ebx].TYPES.flist[8],eax
			.elseif ecx>=32
				sub		ecx,32
				shr		eax,cl
				or		[ebx].TYPES.flist[4],eax
			.else
				shr		eax,cl
				or		[ebx].TYPES.flist[0],eax
			.endif
			pop		edx
		.endw
	.endif
	mov		[ebx].TYPES.lprc,offset szCONTROL
	mov		ebx,[edi].CCDEF.hbmp
	.if !ebx
		invoke LoadBitmap,hInstance,IDB_CUSTCTL
	.endif
	invoke CreateCompatibleDC,NULL
	mov		mDC,eax
	invoke SelectObject,mDC,ebx
	push	eax
	invoke GetPixel,mDC,0,0
	mov		nColor,eax
	pop		eax
	invoke SelectObject,mDC,eax
	invoke DeleteDC,mDC
	invoke ImageList_AddMasked,hBoxIml,ebx,nColor  ; background colour
	invoke DeleteObject,ebx
	invoke lstrcat,offset szCtlText,offset szComma
	invoke lstrcat,offset szCtlText,[edi].CCDEF.lptooltip
	invoke lstrcpy,offset szToolBoxTlt,[edi].CCDEF.lptooltip
	invoke Do_ToolBoxButton,hTlb,nButtons,hBoxIml
	inc		nButtons
	pop		ebx
	retn

AddCustomControl endp

Do_ToolBox proc	hWin:HWND

	invoke ResEdDo_ImageList,hInstance,IDB_TOOLBOX,20,32,0,0C0C0C0h,0
	mov		hBoxIml,eax
	invoke CreateWindowEx,NULL,addr	szToolTipsClass,NULL,\
		   TTS_ALWAYSTIP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		   NULL,NULL,hInstance,NULL
	mov		hToolTip,eax
	xor		ecx,ecx
	.while ecx<nButtons
		push	ecx
		invoke Do_ToolBoxButton,hWin,ecx,hBoxIml
		pop		ecx
		inc		ecx
	.endw
	invoke ToolBoxReset
	ret

Do_ToolBox endp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -