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

📄 coolbar.asm

📁 一个使用coolbar的例子
💻 ASM
字号:
;类名:"ReBarWindow32",中文名称:“工具带”(暂定,由于一时找不到有权威的中名称)
;希望得到更多关于rebar的资料
;作者:狂编,hg-soft@263.net
.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
include comctl32.inc

IncludeLib user32.lib
IncludeLib kernel32.lib
IncludeLib gdi32.lib
includelib comctl32.lib

.const
REBAR_ICON	equ	1000
IDB_BACK	equ	1001
IDB_TOOLBAR	equ	1002

IDM_NEW		equ	2001
IDM_OPEN	equ	2002
IDM_SAVE	equ	2003
IDM_EXIT	equ	1106
IDM_CUT		equ	2004
IDM_COPY	equ	2005
IDM_PASTE	equ	2006
IDM_PRINT	equ	2007
IDM_ABOUT	equ	2008
IDM_HELP	equ	2009

.data?
hInstance		dd	?
hWndRebar		dd	?
hWndToolBar		dd	?
hWndCombo		dd	?
msg			MSG	<>
.code
start:
			invoke	GetModuleHandle,NULL
			mov	hInstance,eax
			call	InitApplication
			or	eax,eax
			jz	@F
			call	InitInstance
			or	eax,eax
			jz	@F
StartLoop:		invoke	GetMessage,addr msg,NULL,0,0
			or	eax,eax
			je	ExitLoop
			invoke	TranslateMessage,addr msg
			invoke	DispatchMessage,addr msg
			jmp	StartLoop
ExitLoop:		mov	eax,msg.wParam
@@:			invoke	ExitProcess,eax
;=================================================
sRebarMenu		db	"RebarMenu",0
sREBARWClass		db	"REBARWClass",0
InitApplication	proc
	local	wcREBAR:WNDCLASS
			mov	wcREBAR.style,0
			mov	wcREBAR.lpfnWndProc,offset MainWndProc
			mov	wcREBAR.cbClsExtra,0
			mov	wcREBAR.cbWndExtra,0
			mov	eax,hInstance
			mov	wcREBAR.hInstance,eax
			invoke	LoadIcon,hInstance,REBAR_ICON
			mov	wcREBAR.hIcon,eax
			invoke	LoadCursor,NULL,IDC_ARROW
			mov	wcREBAR.hCursor,eax
			invoke	GetStockObject,WHITE_BRUSH
			mov	wcREBAR.hbrBackground,eax
			mov	wcREBAR.lpszMenuName,offset sRebarMenu
			mov	wcREBAR.lpszClassName,offset sREBARWClass
			invoke	RegisterClass,addr wcREBAR
			ret
InitApplication	endp
;=================================================
REBARWClass		db	"REBARWClass",0
REBAR_Sample		db	"REBAR Sample",0
InitInstance	proc
	local	@hWnd
			invoke CreateWindowEx,0,addr REBARWClass,addr REBAR_Sample,\
			WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,\
			CW_USEDEFAULT,NULL,NULL,hInstance,NULL
			mov	@hWnd,eax
			or	eax,eax
			jz	Ret1
			invoke	ShowWindow,@hWnd,SW_SHOW
			invoke	UpdateWindow,@hWnd
			mov	eax,1
Ret1:			ret
InitInstance	endp
;=================================================
Could_not_create_rebar	db	"Could not create rebar.",0
MainWndProc	proc	hWnd,uMsg,wParam,lParam
		local	szBuf[MAX_PATH]:byte
uMsg_case1:		cmp	uMsg,WM_CREATE
			jnz	uMsg_case2
			push	hWnd
			call	CreateRebar
			or	eax,eax
			jnz	Ret1
			invoke	MessageBox,NULL,addr Could_not_create_rebar,NULL,MB_OK
			invoke	ShowWindow,hWnd,SW_SHOW
			jmp	_break
uMsg_case2:		cmp	uMsg,WM_SIZE
			jnz	uMsg_case3
			mov	edx,lParam
			movzx	eax,dx
			shr	edx,16
			invoke	MoveWindow,hWndRebar,0,0,eax,edx,TRUE
			jmp	_break
uMsg_case3:		cmp	uMsg,WM_NOTIFY
			jnz	uMsg_case4
			mov	edx,lParam
			cmp	[edx.NMHDR].code,TTN_NEEDTEXT					;显示工具提示控件文本
			jnz	_break
			mov	edx,lParam
			invoke	LoadString,hInstance,[edx.TOOLTIPTEXT].hdr.idFrom,addr szBuf,sizeof szBuf	;字串 ID == 命令 ID 
			lea	ecx,szBuf
			mov	edx,lParam
			mov	[edx.TOOLTIPTEXT].lpszText,ecx
			jmp	_break
uMsg_case4:		cmp	uMsg,WM_DESTROY
			jnz	uMsg_case5
			mov	eax,hWndRebar
			or	eax,eax
			jz	@F
			invoke	DestroyWindow,eax
@@:			mov	eax,hWndToolBar
			or	eax,eax
			jz	@F
			invoke	DestroyWindow,eax
@@:			mov	eax,hWndCombo
			or	eax,eax
			jz	@F
			invoke	DestroyWindow,eax
@@:			invoke	PostQuitMessage,0
			jmp	_break
uMsg_case5:		cmp	uMsg,WM_COMMAND
			jnz	uMsg_case6
			cmp	word ptr wParam,IDM_EXIT
			jnz	_break
			invoke	SendMessage,hWnd,WM_SYSCOMMAND,SC_CLOSE,0
			jmp	_break
uMsg_case6:		invoke	DefWindowProc,hWnd,uMsg,wParam,lParam
			jmp	Ret1
_break:			sub	eax,eax
Ret1:			ret
MainWndProc	endp
;****************************************************************************
Could_not_create_the_combo_box	db	"Could not create the combo box",0
Could_not_create_the_toolbar	db	"Could not create the toolbar",0
rebar				db	"ReBarWindow32",0
CreateRebar	proc	hWndParent
		local	icex:INITCOMMONCONTROLSEX
			mov	icex.dwSize,sizeof INITCOMMONCONTROLSEX
			mov	icex.dwICC,ICC_COOL_CLASSES or ICC_USEREX_CLASSES		;让"comctl32.dll"注册工具带
			invoke	InitCommonControlsEx,addr icex					;被始化"comctl32.dll"的扩展功能
			invoke	CreateWindowEx,0,addr rebar,NULL,\
				WS_VISIBLE or WS_BORDER or WS_CHILD or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or \
				CCS_NODIVIDER or CCS_NOPARENTALIGN or RBS_VARHEIGHT or RBS_BANDBORDERS,\
				0, 0, 0, 0,hWndParent,1000h,hInstance,NULL			;建立工具带
			mov	hWndRebar,eax
			or	eax,eax
			jz	result
			push	hWndParent
			push	hWndRebar
			call	CreateComboBox							;建立并加入组合框
			mov	hWndCombo,eax
			or	eax,eax
			jnz	@F
			invoke	MessageBox,NULL,addr Could_not_create_the_combo_box,NULL,MB_OK
@@: 			push	hWndRebar
			call	CreateTheToolBar						;建立并加入工具条
			mov	hWndToolBar,eax
			or	eax,eax
			jnz	@F
			invoke	MessageBox,NULL,addr Could_not_create_the_toolbar,NULL,MB_OK 
@@:			mov	eax,1
result:			ret
CreateRebar	endp
;**************************************************************************** 
ComboBox	db	"ComboBox",0
ItemFmt		db	"Item %d",0
Combo_Box	db	"组合框",0
CreateComboBox	proc	uses esi hWndParent,hWndMain
		local	szString[64]:byte
		local	rbBand:REBARBANDINFO
		local	rect:RECT

			invoke CreateWindowEx,0,addr ComboBox,NULL,\
				WS_VISIBLE or WS_CHILD or WS_TABSTOP or \
				WS_VSCROLL or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or CCS_NORESIZE or \
				CBS_AUTOHSCROLL or CBS_DROPDOWNLIST,0,0,100,200,\
				hWndParent,2001h,hInstance,NULL					;建立组合框
			mov	hWndCombo,eax
			or	eax,eax
			jz	result
			invoke	GetStockObject,DEFAULT_GUI_FONT
			invoke	SendMessage,hWndCombo,WM_SETFONT,eax,0				;组合框字体
			sub	esi,esi
@@:			inc	esi
			invoke	wsprintf,addr szString,addr ItemFmt,esi
			invoke	SendMessage,hWndCombo,CB_ADDSTRING,0,addr szString		;加入组合框各表项
			cmp	esi,10
			jbe	@B
			invoke	GetWindowRect,hWndCombo,addr rect
												;以下初始化 REBARBANDINFO 各成员
			mov	rbBand.cbSize,sizeof REBARBANDINFO
			mov	rbBand.fMask,RBBIM_COLORS or RBBIM_CHILD or RBBIM_CHILDSIZE or \
					RBBIM_STYLE or RBBIM_ID or RBBIM_TEXT or RBBIM_BACKGROUND
			invoke	GetSysColor,COLOR_BTNTEXT
			mov	rbBand.clrFore,eax
			invoke	GetSysColor,COLOR_BTNFACE
			mov	rbBand.clrBack,eax
			mov	rbBand.fStyle,RBBS_NOVERT or RBBS_CHILDEDGE or RBBS_FIXEDBMP
			invoke	LoadBitmap,hInstance,IDB_BACK
			mov	rbBand.hbmBack,eax
			lea	eax,Combo_Box
			mov	rbBand.lpText,eax					;该文本将被显示在左边
			mov	eax,hWndCombo
			mov	rbBand.hwndChild,eax
			mov	eax,rect.right
			sub	eax,rect.left
 			mov	rbBand.cxMinChild,eax
			mov	eax,rect.bottom
			sub	eax,rect.top
			mov	rbBand.cyMinChild,eax

			invoke	SendMessage,hWndRebar,RB_INSERTBAND,-1,addr rbBand		;加入到工具带
			invoke	SendMessage,hWndCombo,CB_SETCURSEL,0,0				;选择一个默认表项
			mov	eax,hWndCombo
result:			ret
CreateComboBox	endp 
;**************************************************************************** 
tbButtons	label	TBBUTTON
TBBUTTON <0, IDM_NEW,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, IDM_NEW>
TBBUTTON <1, IDM_OPEN,  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, IDM_OPEN>
TBBUTTON <2, IDM_SAVE,  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, IDM_SAVE>
TBBUTTON <3, IDM_CUT,   TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, IDM_CUT>
TBBUTTON <4, IDM_COPY,  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, IDM_COPY>
TBBUTTON <5, IDM_PASTE, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, IDM_PASTE>
TBBUTTON <6, IDM_PRINT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, IDM_PRINT>
TBBUTTON <7, IDM_ABOUT, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, IDM_ABOUT>
TBBUTTON <8, IDM_HELP,  TBSTATE_ENABLED, TBSTYLE_BUTTON, 0, IDM_HELP>
Toolbar_not_created	db	"Toolbar not created!",0
CreateTheToolBar proc hWndParent
		local	rbBand:REBARBANDINFO
			invoke	CreateToolbarEx,hWndParent,\
				WS_CHILD or TBSTYLE_FLAT or TBSTYLE_TOOLTIPS or WS_CLIPCHILDREN or \
				WS_CLIPSIBLINGS or CCS_NODIVIDER or CCS_NORESIZE or WS_VISIBLE, \
				2001h,9,hInstance,IDB_TOOLBAR,addr tbButtons,9,16,15,16,15,sizeof TBBUTTON
			mov	hWndToolBar,eax
			or	eax,eax
			jnz	@F
			invoke	MessageBox,NULL,addr Toolbar_not_created,NULL,MB_OK
			xor	eax,eax
			jmp	result
@@:
												;以下初始化 REBARBANDINFO 各成员
			mov	rbBand.cbSize,sizeof REBARBANDINFO
			mov	rbBand.fMask,RBBIM_COLORS or RBBIM_CHILD or RBBIM_CHILDSIZE or \
				RBBIM_STYLE or RBBIM_ID or RBBIM_BACKGROUND
			invoke	GetSysColor,COLOR_BTNTEXT
			mov	rbBand.clrFore,eax
			invoke	GetSysColor,COLOR_BTNFACE
			mov	rbBand.clrBack,eax
			mov	rbBand.fStyle,RBBS_NOVERT or RBBS_CHILDEDGE or RBBS_FIXEDBMP
			invoke	LoadBitmap,hInstance,IDB_BACK
			mov	rbBand.hbmBack,eax
			mov	eax,hWndToolBar
			mov	rbBand.hwndChild,eax
			mov	rbBand.wID,2001h
			mov	rbBand.cxMinChild,9*23				;由于工具条还没有被显示 "GetWindowRect"并不能得到准确的工具条尺寸。
			mov	rbBand.cyMinChild,23				;这里的尺寸是通过测试来的。

			invoke	SendMessage,hWndRebar,RB_INSERTBAND,-1,addr rbBand	;加入到工具带
			mov	eax,hWndToolBar
result:			ret
CreateTheToolBar endp
;========================
		end	start

⌨️ 快捷键说明

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