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

devtools/2025/2/28 13:48:06/

;运行效果

;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.ppmy.cn/devtools/163366.html

相关文章

网络安全与等保2.0

等保等级标准 信息系统按照重要性和受破坏后的危害性进行分级 第一级自主安全防护级&#xff1a;信息系统受到破坏后&#xff0c;会对公民、法人和其他组织权益造成损害&#xff0c;但不损害国家安全、社会秩序和公共利益。 第二级审计安全保护级&#xff1a;信息系统受到破坏…

【Linux文件IO】系统IO和标准IO介绍

在 Linux 系统中&#xff0c;文件操作主要分为两种&#xff1a;系统 IO 和 标准 IO。这两种 IO 方式各有特点&#xff0c;适用于不同的场景。 一、系统IO 系统 IO 是指操作系统提供给用户程序调用的一组“特殊”接口&#xff0c;通过这些接口&#xff0c;用户程序可以获得操作…

蓝桥杯单片机组第十二届省赛第二批次

前言 第十二届省赛涉及知识点&#xff1a;NE555频率数据读取&#xff0c;NE555频率转换周期&#xff0c;PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。 本试题涉及模块较少&#xff0c;题目不难&#xff0c;基本上准备充分的都能完整的实现每一个功能&#xff0c;并…

additional-spring-configuration-metadata.json实现springboot自定义提示

在配置additional-spring-configuration-metadata.json文件后&#xff0c;在开发人员的IDE工具使用个人编写的配置读取很有效的在application.properties或application.yml文件下完成提示。 配置元数据文件位于jar下面。 META-INF/spring-configuration-metadata.json它们使用简…

【洛谷贪心算法题】P2240部分背包问题

【解题思路】 贪心策略选择 对于部分背包问题&#xff0c;关键在于如何选择物品放入背包以达到最大价值。由于物品可以分割&#xff0c;遍历排序后的物品数组&#xff0c;根据物品重量和背包剩余容量的关系&#xff0c;决定是将整个物品放入背包还是分割物品放入背包&#xff…

第六章:性能优化与部署 - 第五节 - Tailwind CSS 性能监控和优化

性能监控和优化是确保 Tailwind CSS 项目高效运行的关键。本节将详细介绍如何实施性能监控和进行相应的优化。 性能指标监控 Web Vitals 监控 // utils/vitals.ts import { getCLS, getFID, getLCP, getTTFB, getFCP } from web-vitals;const reportWebVitals (onPerfEntry…

使用 tcpdump 和 Wireshark 进行网络抓包与分析

在网络故障排除、性能优化和安全审计中&#xff0c;网络抓包是一项非常重要的技能。本文将介绍如何使用 tcpdump 工具捕获网络数据包&#xff0c;并通过 Wireshark 对这些数据包进行详细分析。 1. 使用 tcpdump 捕获网络数据包 安装 tcpdump 大多数 Linux 发行版默认已经安装…

Go Web 项目实战:构建 RESTful API、命令行工具及应用部署

Go Web 项目实战&#xff1a;构建 RESTful API、命令行工具及应用部署 Go 语言因其简洁高效、并发支持强大等特点&#xff0c;已经成为了后端开发的热门选择之一。本篇文章将通过实战案例带领你学习如何使用 Go 构建一个简单的 RESTful API&#xff0c;开发命令行工具&#xf…