;运行效果
;win32汇编环境,窗口程序中自定义工具栏的使用示例
;工具栏一般放在菜单下面,相当于一个个小的对话框,当然你放在其它地方也可以。
;原理是,创建一张BMP位图,比如下例用一张168*24的图,平均分成7部分,每部分相当于1个按钮的功能。图像可以用PS之类的创建。然后创建工具栏控件,之后类似于把图贴上去。
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include windows.inc
include user32.inc
include kernel32.inc
include Comctl32.inc
includelib user32.lib
includelib kernel32.lib
includelib Comctl32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data
DlgName db "MyDialog",0
sz db "提示",0
sz01 db "点了第1个按钮",0
sz02 db "点了第2个按钮",0
sz03 db "点了第3个按钮",0
.data?
hInstance HINSTANCE ?
hWinToolbar dd ?
.const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000 ;图标
ID_TOOLBAR equ 1
BMP_BIG equ 5000
IDM_OPEN equ 2001
IDM_EXIT equ 2002
IDM_MSG equ 2003
IDM_DAORU equ 2004
IDM_DAOCHU equ 2005
IDM_ZIYUAN equ 2006
IDM_CHONGDIWEI equ 2007
;TBBUTTON 结构,可设置工具栏中各项信息,各项包含参数可以上网查询
stToolbar equ this byte
TBBUTTON <0,IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <1,IDM_MSG,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <2,IDM_DAORU,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <3,IDM_DAOCHU,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <4,IDM_ZIYUAN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <5,IDM_CHONGDIWEI,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
TBBUTTON <6,IDM_EXIT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
NUM_BUTTONS EQU 7
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @szBuffer[256]:byte
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke CreateToolbarEx,hWnd,WS_VISIBLE or WS_CHILD or TBSTYLE_FLAT or TBSTYLE_TOOLTIPS,ID_TOOLBAR,7,hInstance,BMP_BIG,offset stToolbar,7,24,24,168,24,sizeof TBBUTTON ;用CreateToolbarEx函数直接生成工具栏控件
mov hWinToolbar,eax
.elseif uMsg == WM_COMMAND
mov eax,wParam
.if eax == IDM_OPEN
invoke MessageBox,NULL,addr sz01,addr sz,MB_OK
.elseif eax == IDM_MSG
invoke MessageBox,NULL,addr sz02,addr sz,MB_OK
.elseif eax == IDM_DAORU
invoke MessageBox,NULL,addr sz03,addr sz,MB_OK
.endif
.elseif uMsg == WM_NOTIFY ;处理工具栏信息
mov ebx,lParam
.if [ebx + NMHDR.code] == TTN_NEEDTEXT
assume ebx:ptr TOOLTIPTEXT
mov eax,[ebx].hdr.idFrom
mov [ebx].lpszText,eax
push hInstance
pop [ebx].hinst
assume ebx:nothing
.elseif ([ebx + NMHDR.code] == TBN_QUERYINSERT) || ([ebx + NMHDR.code] == TBN_QUERYDELETE)
mov eax,TRUE
ret
.elseif [ebx + NMHDR.code] == TBN_GETBUTTONINFO ;当鼠标停留时,显示该按钮的功能信息
assume ebx:ptr TBNOTIFY
mov eax,[ebx].iItem
.if eax < NUM_BUTTONS
mov ecx,sizeof TBBUTTON
mul ecx
add eax,offset stToolbar
invoke RtlMoveMemory,addr [ebx].tbButton,eax,sizeof TBBUTTON
invoke LoadString,hInstance,[ebx].tbButton.idCommand,addr @szBuffer,sizeof @szBuffer
lea eax,@szBuffer
mov [ebx].pszText,eax
invoke lstrlen,addr @szBuffer
mov [ebx].cchText,eax
assume ebx:nothing
mov eax,TRUE
ret
.endif
.endif
.elseif uMsg == WM_CLOSE
invoke EndDialog, hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
;下面为rc文件内容
#include "resource.h" //提示缺少该文件,可以在资源里下载
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 1000 //图标
#define BMP_BIG 5000
#define IDM_OPEN 2001
#define IDM_EXIT 2002
#define IDM_MSG 2003
#define IDM_DAORU 2004
#define IDM_DAOCHU 2005
#define IDM_ZIYUAN 2006
#define IDM_CHONGDIWEI 2007
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
BMP_BIG BITMAP "Barbmp.bmp"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MyDialog DIALOG 10, 10, 170, 100
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "对话框程序模版"
FONT 12, "宋体"
BEGIN
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
stringtable discardable
BEGIN
IDM_OPEN "打开文件"
IDM_EXIT "退出程序"
IDM_MSG "基本信息"
IDM_DAORU "导入表信息"
IDM_DAOCHU "导出表信息"
IDM_ZIYUAN "资源信息"
IDM_CHONGDIWEI "重定位信息"
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>