;运行效果
;win32汇编环境,状态栏的应用示例
;一般放在窗口最下面的栏目,可用来显示一些状态
;直接抄进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
szMsg db "提示",0
szFrm db "%d",0
szFu01 db "帮助主题(&H)",0
szFu02 db "关于本程序(&A)...",0
;Equ 等值定义
ICO_MAIN equ 1000 ;图标
IDM_MAIN equ 1001
IDM_011 equ 11
IDM_012 equ 12
IDM_021 equ 21
IDM_022 equ 22
IDM_023 equ 23
IDM_024 equ 24
IDM_025 equ 25
IDM_026 equ 26
IDM_031 equ 31
IDM_032 equ 32
IDM_MENUHELP equ 1300
ID_STATUSBAR equ 1
.data?
hInstance HINSTANCE ?
hRootMenu HMENU ?
hWinStatus dd ? ;状态栏的句柄
lpsz1 dd ?
lpsz2 dd ?
.const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
sz1 db '我在左边',0
sz2 db '我在中间',0
sz3 db '点一下我试试',0
sz4 db '我被点击了',0
dwStatusWidth dd 100,250,-1 ;这是整数数组的定义,数值是像素值,最后的-1是把剩下的像素长度都给第3个栏,在定义常量或变量时,紧挨着的值在内存里的分布也是紧挨着的,而 dwStatusWidth 则是指针
dwMenuHelp dd 0,IDM_MENUHELP,0,0
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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 @hSysMenu
LOCAL @stPoint:POINT,@stRect:RECT
LOCAL @szBuffer[256]:byte
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke GetMenu,hWnd
mov hRootMenu,eax
invoke GetSystemMenu,hWnd,FALSE ;在系统菜单中添加菜单项,就是左上角的图标那儿
mov @hSysMenu,eax
invoke AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
invoke AppendMenu,@hSysMenu,0,IDM_031,offset szFu01
invoke AppendMenu,@hSysMenu,0,IDM_032,offset szFu02
invoke CreateStatusWindow,WS_CHILD + WS_VISIBLE + SBS_SIZEGRIP,NULL,hWnd,ID_STATUSBAR ;创建状态栏
mov hWinStatus,eax
invoke SendMessage,hWinStatus,SB_SETPARTS,3,offset dwStatusWidth ;根据 dwStatusWidth 的值把状态栏分成3块,dwStatusWidth是个整数数组
mov lpsz1,offset sz3 ;把字符串的地址值保存下来,后面交换字符串时需要地址值
mov lpsz2,offset sz4
invoke SendMessage,hWinStatus,SB_SETTEXT,0,addr sz1 ;显示在第1栏的字符串。也可以显示其它内容,比如想放个当前时间,则设个定时器,取得本地时间,然后每秒更新显示。
invoke SendMessage,hWinStatus,SB_SETTEXT,1,addr sz2
invoke SendMessage,hWinStatus,SB_SETTEXT,2,addr sz3
.elseif uMsg == WM_MENUSELECT ;WM_MENUSELECT 消息是当选项菜单的某项时产生的
invoke MenuHelp,WM_MENUSELECT,wParam,lParam,lParam,hInstance,hWinStatus,offset dwMenuHelp
.elseif uMsg == WM_NOTIFY ;WM_NOTIFY消息为扩展后的控件消息,早期的WINDOWS没那么多功能,后来版本升级了,有更多的功能了,这些功能就在WM_NOTIFY消息里
.if wParam == ID_STATUSBAR ;如果是状态栏的消息,则
mov eax,lParam ;lParam指向消息结构,即当你点击状态栏时,系统把这个消息放在一个结构里,但只能把指向这个结构的指针发送过来,就是lParam
mov eax,[eax + NMHDR.code] ;所以我们需要取得lParam指针所指向的结构中的NMHDR结构的成员 code 的值,注意,这时指的是结构中的结构的成员,
.if eax == NM_CLICK ;如果是这个点击的通知码,则下面判断点的坐标,通过坐标判断是点了状态栏中的哪部分
invoke GetCursorPos,addr @stPoint ;得到你的鼠标点的坐标
invoke GetWindowRect,hWinStatus,addr @stRect ;得到状态栏的坐标
mov eax,@stRect.left
mov ecx,eax
add eax,250 ;250是dwStatusWidth整数数组的第2个值
mov ebx,@stRect.right
.if (@stPoint.x >= eax) && (@stPoint.x <= ebx)
mov eax,lpsz1
xchg eax,lpsz2
mov lpsz1,eax
invoke SendMessage,hWinStatus,SB_SETTEXT,2,lpsz1
.endif
.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 IDM_MAIN 1001
#define IDM_011 11
#define IDM_012 12
#define IDM_021 21
#define IDM_022 22
#define IDM_023 23
#define IDM_024 24
#define IDM_025 25
#define IDM_026 26
#define IDM_031 31
#define IDM_032 32
#define IDM_MENUHELP 1300
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MyDialog DIALOG 10, 10, 205, 100
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "对话框程序模版"
FONT 12, "方正姚体"
MENU IDM_MAIN //将菜单条加入对话框
BEGIN
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDM_MAIN menu discardable //discardable是当系统不需要时会自动释放资源
BEGIN
popup "文件(&F)"
BEGIN
menuitem "开始", IDM_011
menuitem separator //沉底分隔条,主要是为了好看
menuitem "退出", IDM_012
END
popup "命令(&C)"
BEGIN
menuitem "功能01",IDM_021
menuitem "被禁用的菜单项",IDM_022,INACTIVE //加 INACTIVE 为禁用状态
menuitem "被灰化的菜单项",IDM_023,GRAYED //加 GRAYED 为灰化状态
menuitem "使上面的禁用有效",IDM_023
menuitem "使上面的灰化有效",IDM_024
popup "工具栏" //加子菜单
BEGIN
menuitem "功能05",IDM_025
menuitem "功能06",IDM_026
END
END
popup "帮助(&H)",HELP //加 HELP 将本菜单移到最右边
BEGIN
menuitem "帮助主题(&H)",IDM_031
menuitem "关于本程序(&A)...",IDM_032
END
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
stringtable discardable
BEGIN
IDM_MENUHELP "包含文件操作的命令"
IDM_MENUHELP+1 "包含操作视图的命令"
IDM_011 "指向开始菜单项"
IDM_012 "指向退出菜单项"
IDM_031 "指向帮助主题"
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>