当前位置: 首页 > article >正文

win32汇编环境,对话框中状态栏的应用示例

;运行效果

;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
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


http://www.kler.cn/a/564411.html

相关文章:

  • Django模板系统深入
  • 当AI搜索撕开传统搜索的裂缝,警惕AI搜索的“信息茧房”
  • V-HOP:结合视觉和触觉多模态融合数据集,助力机器人实现鲁棒的6D物体姿态跟踪
  • MySQL进阶04-MVCC实现原理
  • 《以太坊账户模型与数据结构:探秘区块链世界的架构密码》
  • Unity:背景图像的旋转和按钮的缩放动画
  • 2025最新智能优化算法:人工旅鼠算法(Artificial Lemming Algorithm, ALA)求解23个经典函数测试集,MATLAB
  • 神经网络中的Adam
  • 西电大数据安全与隐私Lab4(数据安全检索)
  • x64汇编下过程参数解析
  • 卡 bug 了?
  • SpringBoot集成easy-captcha图片验证码框架
  • Exoplayer(MediaX)实现音频变调和变速播放
  • mysql服务层介绍,NOSQL+SQL接口(nosql介绍),语法分析器,预处理器,优化器(优化的必要性,基于成本的优化器),缓存(弊端)
  • 【地图视界-Leaflet1】快速搭建你的第一个地图
  • IP-----动态路由OSPF
  • 【小白数学】为什么可以用拉格朗日乘子法求函数的极值【二】
  • 鸿蒙HarmonyOS NEXT开发:组件-样式-基础 2
  • 火绒终端安全管理系统V2.0网络防御功能介绍
  • undo log、redo log、bin log是什么