?? 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 + -