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

win32汇编环境,窗口程序中自定义工具栏的使用示例

;运行效果

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

相关文章:

win32汇编环境,窗口程序中自定义工具栏的使用示例

;运行效果 ;win32汇编环境,窗口程序中自定义工具栏的使用示例 ;工具栏一般放在菜单下面&#xff0c;相当于一个个小的对话框&#xff0c;当然你放在其它地方也可以。 ;原理是&#xff0c;创建一张BMP位图&#xff0c;比如下例用一张168*24的图&#xff0c;平均分成7部分&#x…...

【PyQt】pyqt小案例实现简易文本编辑器

pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器&#xff0c;使用PyQt5框架构建。以下是代码的主要功能和特点&#xff1a; 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…...

2024最新版Node.js详细安装教程(含npm配置淘宝最新镜像地址)

一&#xff1a;Node.js安装 浏览器中搜索Nodejs&#xff0c;或直接用网址:Node.js — 在任何地方运行 JavaScript 建议此处下载长期支持版本&#xff08;红框内&#xff09;: 开始下载&#xff0c;完成后打开文件: 进入安装界面&#xff0c;在此处勾选&#xff0c;再点击n…...

DeepSeek R1的隐藏提问技巧?

deepseek属于推理模型&#xff0c;而不是指令模型&#xff0c;R1对提示词非常敏感。 1、需要更加真诚地与deepseek进行对话。 在用r1时&#xff0c;需要将此前的问答方式改变。 例如&#xff1a; 你现在是一个新能源汽车的市场研究分析师&#xff0c;这里有一份调研报告总结…...

【HTML入门】Sublime Text 4与 Phpstorm

文章目录 前言一、环境基础1.Sublime Text 42.Phpstorm(1)安装(2)启动Phpstorm(3)“启动”码 二、HTML1.HTML简介(1)什么是HTML(2)HTML版本及历史(3)HTML基本结构 2.HTML简单语法(1)HTML标签语法(2)HTML常用标签(3)表格(4)特殊字符 总结 前言 在当今的软件开发领域&#xff0c…...

JVS低代码逻辑引擎多种业务场景触发案例配置:涵盖列表页按钮、表单数据、流程审批、外部API接口调用等

逻辑引擎作为JVS低代码开发套件的核心组件&#xff0c;专注于业务逻辑的快速构建与实现&#xff0c;它扮演着程序配置与执行的核心角色&#xff0c;适用于多样化的应用场景。该逻辑引擎设计灵活&#xff0c;能够通过多种配置方式被触发&#xff0c;以精准响应各类业务需求并实现…...

开发人员笔记本

为开发人员推荐大容量且性能稳定的电脑时&#xff0c;需考虑处理器、内存、存储、显卡和散热等因素。以下是几款适合开发的高性能电脑推荐&#xff1a; 1. Apple MacBook Pro 16英寸 (M2 Max/M2 Pro) 处理器: Apple M2 Max 或 M2 Pro内存: 32GB 或 64GB 统一内存存储: 1TB 或…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)

#作者&#xff1a;闫乾苓 文章目录 RabbitMQ简介RabbitMQ与VMware的关系架构工作流程RabbitMQ 队列工作模式及适用场景简单队列模式&#xff08;Simple Queue&#xff09;工作队列模式&#xff08;Work Queue&#xff09;发布/订阅模式&#xff08;Publish/Subscribe&#xff…...

计算机网络笔记再战——理解几个经典的协议4

目录 IP——网际协议 IP地址 1. A类地址 2. B类地址 3. C类地址 4. D类地址&#xff08;组播地址&#xff09; 5. E类地址&#xff08;保留地址&#xff09; 特殊地址与私有地址 广播地址 IP多播 子网掩码 传统分类与CIDR/VLSM的对比 路由控制 默认路由 主机路由…...

Java CountDownLatch 用法和源码解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

深度学习在文本情感分析中的应用

引言 情感分析是自然语言处理&#xff08;NLP&#xff09;中的一个重要任务&#xff0c;旨在识别和提取文本中的主观信息。随着深度学习技术的发展&#xff0c;我们可以使用深度学习模型来提高情感分析的准确性和效率。本文将介绍如何使用深度学习进行文本情感分析&#xff0c…...

C++编码规范(六)关于C++标准库STL在使用中的一些规范和建议

C 标准库STL是 C 编程语言的重要组成部分&#xff0c;为开发者提供了丰富的功能和工具&#xff0c;极大地提高了开发效率和代码的可移植性。 其主要包括&#xff1a;标准容器库&#xff0c;输入 / 输出流库&#xff0c;算法库&#xff0c;迭代器库&#xff0c;字符串库&#xf…...

两种文件类型(pdf/图片)打印A4半张纸方法

环境:windows10、Adobe Reader XI v11.0.23 Pdf: 1.把内容由横排变为纵排&#xff1a; 2.点击打印按钮&#xff1a; 3.选择打印页范围和多页&#xff1a; 4.内容打印在纸张上部 图片&#xff1a; 1.右键图片点击打印&#xff1a; 2.选择打印类型&#xff1a; 3.打印配置&am…...

Vue3状态管理: Pinia使用技巧与最佳实践

Vue3状态管理: Pinia使用技巧与最佳实践 随着Web应用复杂度的提升&#xff0c;前端状态管理变得愈发重要。而在Vue3中&#xff0c;Pinia作为一种全新的状态管理工具&#xff0c;为我们提供了更加灵活和强大的状态管理解决方案。本文将从Pinia的基本概念入手&#xff0c;深入探讨…...

stm32点灯 GPIO的输出模式

目录 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09;HSI 高速内部时钟8Mhz 5.项目配置 6.代码 延时1s循环LED亮灭 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09…...

​K8S运行时切换-从Docker到Containerd的切换实战

1. 切换的原因 性能提升&#xff1a;Containerd通过减少抽象层提升了整体性能。 安全性增强&#xff1a;它提供了更直接的系统调用&#xff0c;减少了潜在的安全风险。 简化架构&#xff1a;Containerd拥有更简洁的设计&#xff0c;使得维护和故障排除更为容易。 官方支持趋…...

腾讯会议win7二维码展示不出来

问题&#xff1a;win64更新后二维码展示不出来&#xff0c;手机等登陆都不行 安装所在位置创建文档命名TBSDEBUG并去掉后缀...

swift 专题三 swift 规范一

一、Swift编码命名规范 对类、结构体、枚举和协议等类型的命名应该采用大驼峰法&#xff0c;如 SplitViewController。 文件名采用大驼峰法&#xff0c;如BlockOperation.swift。 对于扩展文件&#xff0c;有时扩展定义在一个独立的文件中&#xff0c;用“原始类型名 扩展名…...

WPS计算机二级•幻灯片放映与会议

听说这是目录哦 放映PPT时常用的快捷技巧&#x1f96c;设置放映模式&#x1f955;演讲备注的添加和隐藏&#x1fada;在PPT中插入附件并放映时打开&#x1fadb;隐藏幻灯片 不被放映和打印&#x1f344;‍&#x1f7eb;演讲计时模式&#x1f966;能量站&#x1f61a; 放映PPT时…...

联想拯救者开机进入bios

如果你的联想拯救者&#xff08;Lenovo Legion&#xff09;笔记本电脑开机后直接进入 BIOS 设置界面&#xff0c;可能是以下原因之一导致的。以下是解决方法&#xff1a; 1. 检查启动顺序 进入 BIOS 后&#xff0c;找到 Boot&#xff08;启动&#xff09;选项卡。检查启动顺序…...

云原生周刊:K8s引领潮流

开源项目推荐 KWOK KWOK&#xff08;Kubernetes WithOut Kubelet&#xff09;是一个开源项目&#xff0c;旨在提供一个轻量级的 K8s 集群模拟环境&#xff0c;允许用户在不依赖真实节点的情况下&#xff0c;本地模拟整个 K8s 集群。它通过模拟 Kubelet 和其他集群组件的行为&…...

FBX SDK的使用:基础知识

Windows环境配置 FBX SDK安装后&#xff0c;目录下有三个文件夹&#xff1a; include 头文件lib 编译的二进制库&#xff0c;根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库&#xff0c;需要在配置属性->C/C->预…...

计算机网络笔记再战——理解几个经典的协议6——TCP与UDP

目录 先说端口号 TCP 使用序号保证顺序性和应答来保证有效性 超时重传机制 TCP窗口机制 UDP 路由协议 协议分类&#xff1a;IGP和EGP 几个经典的路由算法 RIP OSPF 链路状态数据库&#xff08;LSDB&#xff09; LSA&#xff08;Link State Advertisement&#xff0…...

Android 单例模式:实现可复用数据存储

引言 在 Java 开发中&#xff0c;我们经常会遇到需要在整个应用程序中共享数据的场景。例如&#xff0c;配置信息、缓存数据等&#xff0c;这些数据需要在不同的模块或类中被访问和使用。为了确保数据的一致性和避免重复创建&#xff0c;我们可以使用单例模式来实现一个可复用的…...

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制 一. 数据同步 在之前的学习中有了副本Replica的概念,解决了数据备份的问题。我们还需要面临一个设计难题即:如何处理分区中Leader与Follwer节点数据同步不匹配问题所带来的风险,这也是保证数据高可用的…...

【Linux】curl命令详解

【Linux】curl命令详解 【一】curl命令介绍【1】curl命令简介【2】curl命令的基本语法【3】常用的curl命令选项【4】常用的curl命令参数 【二】curl命令示例用法【1】下载文件【2】发送 POST 请求【3】发送请求时附加头部信息【4】请求方法【5】指定用户名和密码进行身份验证【…...

创建模态框和非模态框

主要的精简代码就这些 #include <QDialog>// 创建模态框 QDialog dialog(this); // 添加各种部件 // ... // 因为创建在栈上面&#xff0c;所以需要阻止程序继续运行 dialog.exec();// 非模态框 QDialog dialog new Dialog(this); // 添加各种部件 // ... dialog.show(…...

电商用户画像数据可视化分析

电商用户画像数据可视化分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&am…...

Vue3.5常用特性整理

Vue3.5 发布已近半年&#xff0c;抽空整理下常用的新增/改动特性 响应式 Props 解构 Vue3.5 中 Props 正式支持解构了&#xff0c;并添加了响应式跟踪 设置默认值 使用 JavaScript 原生的默认值语法声明 props 默认值 以前 const props withDefaults(defineProps<{ co…...

Android Studio:Application 和 Activity的区别

Application 和 Activity 是 Android 中非常重要的两个组件&#xff0c;它们分别负责不同的生命周期管理和应用的不同层次的操作。 Application 是应用级别的生命周期管理&#xff0c;它在整个应用运行时只有一个实例&#xff0c;负责应用的全局初始化和资源管理。Activity 是…...