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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波&#xff0c;现在&#xff0c;我们尝试的想要捕获我们的PWM波&#xff0c;测量它的频率&#xff0c;我们应该怎么做呢&#xff1f;答案还是回到我们的定时器上。 我们知道&#xff0c;定时器是一个高级的秒表&#xff08;参考笔者的比喻&a…

ArrayList 扩容机制的源码剖析

在 Java 编程中&#xff0c;ArrayList是一个常用的集合类&#xff0c;它实现了List接口&#xff0c;底层基于数组实现。与普通定长数组不同&#xff0c;ArrayList能够根据元素的添加情况动态调整数组的大小&#xff0c;这就是其扩容机制。下面我们将深入剖析ArrayList扩容机制的…

Java 面试之结束问答

技术优化 线程池优化 设置最大线程数设置最小核心线程数设置额外线程存活时间选择线程池队列选择合适的线程池选择合适的饱和策略 锁优化 尽量不要锁住方法缩小同步代码块&#xff0c;只锁数据锁中尽量不要再包含锁将锁私有化&#xff0c;在内部管理锁进行适当的锁分解 HT…

【llm对话系统】大模型源码分析之 LLaMA 位置编码 RoPE

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer 模型已经成为主流。然而&#xff0c;Transformer 本身并不具备处理序列顺序的能力。为了让模型理解文本中词语的相对位置&#xff0c;我们需要引入位置编码&#xff08;Positional Encoding&#xff09;…

【科研】 -- 医学图像处理方向,常用期刊链接

文章目录 文章目录 医学图像处理方向&#xff0c;期刊链接医学图像处理方向&#xff0c;会议 医学图像处理方向&#xff0c;期刊链接 Sicence https://www.science.org/ Nature https://www.nature.com/ Nature Communications https://www.nature.com/ncomms/ Nature Met…

The specified Gradle distribution ‘gradle-bin.zip‘ does not exist.

The specified Gradle distribution ‘https://services.gradle.org/distributions/gradle-bin.zip’ does not exist. distributionUrl不存在&#xff0c;关联不上&#xff0c;下载不了&#xff0c;那就匹配一个能下载的 distributionUrlhttps://services.gradle.org/distrib…

从零开始实现一个双向循环链表:C语言实战

文章目录 1链表的再次介绍2为什么选择双向循环链表&#xff1f;3代码实现&#xff1a;从初始化到销毁1. 定义链表节点2. 初始化链表3. 插入和删除节点4. 链表的其他操作5. 打印链表和判断链表是否为空6. 销毁链表 4测试代码5链表种类介绍6链表与顺序表的区别7存储金字塔L0: 寄存…

Cesium点集中获取点的id,使用viewer.value.entities.getById报错的解决方法

错误代码&#xff1a; viewer.value.entities.getById(pickedObject.id) 报错&#xff1a; 可以正常获取movement.position但是一直出现如下报错&#xff0c;无法获得航点的id&#xff0c;通过断点定位为 viewer.value.entities.getById(pickedObject.id)导致的报错 解决方…

java 进阶教程_Java进阶教程 第2版

第2版前言 第1版前言 语言基础篇 第1章 Java语言概述 1.1 Java语言简介 1.1.1 Java语言的发展历程 1.1.2 Java的版本历史 1.1.3 Java语言与C&#xff0f;C 1.1.4 Java的特点 1.2 JDK和Java开发环境及工作原理 1.2.1 JDK 1.2.2 Java开发环境 1.2.3 Java工作原理 1.…

ARM Linux Qt使用JSON-RPC实现前后台分离

文章目录 1、前言2、解决方案2.1、JSON-RPC2.2、Qt中应用JSON-RPC的框架图2.3、优点2.4、JSON-RPC 1.0 协议规范 3、程序示例3.1、Linux C&#xff08;只例举RPC Server相关程序&#xff09;3.2、Qt程序&#xff08;只例举RPC Client相关程序&#xff09; 4、编译程序4.1、交叉…

PyQt6/PySide6 的 QMainWindow 类

QMainWindow 是 PyQt6 或 PySide6 库中一个非常重要的类&#xff0c;它提供了一个主窗口应用程序的框架&#xff0c;该框架可以包含菜单栏、工具栏、状态栏以及中心部件等。QMainWindow 为 GUI 应用程序提供了基本的结构和布局管理功能&#xff0c;非常适合用来创建复杂的用户界…

9. k8s二进制集群之kube-controller-manager部署

同样在部署主机上创建证书请求文件(为之后的证书生成做准备)根据上面的证书文件创建证书(结果会在当前目录下产生kube-controller-manager证书)创建kube-controller-manager服务配置文件创建kube-controller-manager服务启动文件同步kube-controller-manager证书到对应mast…

教程 | i.MX RT1180 ECAT_digital_io DEMO 搭建(一)

本文介绍 i.MX RT1180 EtherCAT digital io DEMO 搭建&#xff0c;Master 使用 TwinCAT &#xff0c;由于步骤较多&#xff0c;分为上下两篇&#xff0c;本文为第一篇&#xff0c;主要介绍使用 TwinCAT 控制前的一些准备。 原厂 SDK 提供了 evkmimxrt1180_ecat_examples_digit…

ubuntu22.40安装及配置静态ip解决重启后配置失效

遇到这种错误&#xff0c;断网安装即可&#xff01; 在Ubuntu中配置静态IP地址的步骤如下。根据你使用的Ubuntu版本&#xff08;如 Netplan 或传统的 ifupdown&#xff09;&#xff0c;配置方法有所不同。以下是基于 Netplan 的配置方法&#xff08;适用于Ubuntu 17.10及更高版…

服务端渲染技术

一.JSP 1.jsp介绍,全称是java Server Pages ,java服务器页面,就是服务端渲染技术,html只能为用户提供静态数据,而JSP技术允许在页面中嵌套 java代码,jsp技术基于Servlet,Servlet很难对数据进行排版,而jsp就可以,可以理解为jsp就是对Servlet的包装. 2.jsp程序本质是java程序,无…

[23] cuda应用之 nppi 实现图像缩放

[23] cuda应用之 nppi 实现图像缩放 NPP&#xff08;NVIDIA Performance Primitives&#xff09;是一个由 NVIDIA 提供的库&#xff0c;专门用于加速图像和信号处理任务。NPP 提供了许多高效的图像处理函数&#xff0c;包括图像缩放。使用 NPP 实现图像缩放可以充分利用 GPU 的…

【产品经理学习案例——AI翻译棒出海业务】

前言&#xff1a; 本文主要讲述了硬件产品在出海过程中&#xff0c;翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家&#xff0c;需要优化翻译质量和算法&#xff0c;关注市场需求和文化差异&#xff0c;以便更好地满足当地用户的需求。同…

CH340G上传程序到ESP8266-01(S)模块

文章目录 概要ESP8266模块外形尺寸模块原理图模块引脚功能 CH340G模块外形及其引脚模块引脚功能USB TO TTL引脚 程序上传接线Arduino IDE 安装ESP8266开发板Arduino IDE 开发板上传失败上传成功 正常工作 概要 使用USB TO TTL&#xff08;CH340G&#xff09;将Arduino将程序上传…

1.4 Go 数组

一、数组 1、简介 数组是切片的基础 数组是一个固定长度、由相同类型元素组成的集合。在 Go 语言中&#xff0c;数组的长度是类型的一部分&#xff0c;因此 [5]int 和 [10]int 是两种不同的类型。数组的大小在声明时确定&#xff0c;且不可更改。 简单来说&#xff0c;数组…