news 2026/9/6 18:55:59

汇编语言全接触-62.Win32汇编教程六

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编语言全接触-62.Win32汇编教程六

在这儿下载本节的所有源程序。

有关工具栏和状态栏

工具栏和状态栏也是Windows标准界面的组成部分,工具栏一般位于菜单栏的下方,上面是一些系统定义的或自己定义的图片,可以通俗地显示这个按钮的作用。状态栏一般位于窗口的最下方,用来显示程序运行中的一些信息。工具栏和状态栏是Windows系统的两个通用的控件,你可以通过两个专用的 API 或者利用 CreateWindowEx 再使用制定的已经由系统定义的类来创建它们。这两个 API 分别是 CreateToolbarEx 和 CreateStatusWindow。下面将一下它们的用法。

CreateToolbarEx 的声明为:

HWND CreateToolbarEx(

HWND hwnd,

DWORD ws,

UINT wID,

int nBitmaps,

HINSTANCE hBMInst,

UINT wBMID,

LPCTBBUTTON lpButtons,

int iNumButtons,

int dxButton,

int dyButton,

int dxBitmap,

int dyBitmap,

UINT uStructSize}

它的参数中 hwnd 是父窗口(也就是我们的主窗口)的句柄,ws 是工具栏的风格,可以由几项合成,如 WS_VISIBLE 是创建是可见,TBSTYLE_FLAT表示平面按钮,WS_BORDER表示有边线等,具体可以见手册。wID 是工具栏的标识,nBitmaps 是定义按钮的图片个数,因为如果你要使用自己的图片,所有图片是要放在同一行中的,然后就由你自己指定中间的个数, hBMInst 是包含已定义系统图片的资源句柄,在你不想自己画图,使用内定的标准图片时使用,一般包含这些图片的 hInstance 已经在 Widnows.inc 中定义为 HINST_COMMCTRL,同样 wBMID 一般是 IDB_STD_SMALL_COLOR,表示使用大图片还是小图片等等。接下来是定义按钮的数据结构,中间定义了各个按钮的命令号,图片号及其他属性,结构如下:

TBBUTTON STRUCT

iBitmap DWORD ?

idCommand DWORD ?

fsState BYTE ?

fsStyle BYTE ?

bReserved BYTE 2 dup(?)

dwData DWORD ?

iString DWORD ?

TBBUTTON ENDS

其中,每个结构定义一个按钮,数据结构中iBitmap 是图片ID,idCommand 是按钮的命令号,这个命令号当你按下按钮的时候会出现在 WM_COMMAND 消息的 wParam 中,你就可以知道哪个按钮被按下了。fsState 是按钮的初始状态,如 TBSTATE_PRESSED 是已经按下的,详细见手册,fsStyle 是风格。

而建立状态栏的 CreateStatusWindow 的声明如下:

HWND CreateStatusWindow(

LONG style,

LPCTSTR lpszText,

HWND hwndParent,

UINT wID

);

style 是状态栏的风格,lpszText 指向初始化是要显示在状态栏的文本,你可以指向 NULL。hwndParent 是父窗口的句柄。wID 是窗口 ID。

使用工具栏和状态栏的源程序

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 是否包括调试代码

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

DEBUG = 1

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Programmed by 罗云彬, bigluo@telekbird.com.cn

; Website: http://asm.yeah.net

; LuoYunBin's Win32 ASM page (罗云彬的编程乐园)

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 版本信息

; 工具栏和状态栏演示程序 Ver 1.0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.386

.model flat, stdcall

option casemap :none ; case sensitive

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Include 数据

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include windows.inc

include user32.inc

include kernel32.inc

include comctl32.inc

include comdlg32.inc

include gdi32.inc

includelib user32.lib

includelib kernel32.lib

includelib comctl32.lib

includelib comdlg32.lib

includelib gdi32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Equ 数据

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

IDI_MAIN equ 1000 ;icon

IDM_MAIN equ 4000 ;menu

IDM_TOOLBAR equ 4001

IDM_STATUSBAR equ 4002

IDM_EXIT equ 4003

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data?

hInstance dd ?

hWinMain dd ?

hMenu dd ?

hIcon dd ?

hToolbar dd ?

hStatusbar dd ?

szBuffer db 256 dup (?)

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data

szClassName db "Toolbar Template",0

szCaptionMain db '工具栏和状态栏演示程序 - 罗云彬',0

dwFlag dd F_TOOLBAR or F_STATUSBAR

;********************************************************************

; 标志位定义

F_TOOLBAR equ 00000001b

F_STATUSBAR equ 00000010b

stToolbar TBBUTTON < STD_FILENEW,1,TBSTATE_ENABLED,TBSTYLE_BUTTON,2 dup(0),-1>

TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,2 dup(0),-1>

TBBUTTON < STD_FILEOPEN,2,TBSTATE_ENABLED,TBSTYLE_BUTTON,2 dup(0),-1>

TBBUTTON < STD_FILESAVE,3,TBSTATE_ENABLED,TBSTYLE_BUTTON,2 dup(0),-1>

TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,2 dup(0),-1>

TBBUTTON < STD_PRINT,4,TBSTATE_ENABLED,TBSTYLE_BUTTON,2 dup(0),-1>

TBBUTTON < STD_PRINTPRE,0,TBSTATE_ENABLED,TBSTYLE_SEP,2 dup(0),-1>

NUM_BUTTONS EQU 7

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代码段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

if DEBUG

include Debug.asm

endif

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 程序开始

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

start:

call _WinMain

invoke ExitProcess,NULL

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 主窗口程序

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_WinMain proc

local @stWcMain:WNDCLASSEX

local @stMsg:MSG

;********************************************************************

; 如果已经在运行,则激活已运行的进程

;********************************************************************

invoke FindWindow,offset szClassName,NULL

.if eax != NULL

invoke ShowWindow,eax,SW_SHOWNORMAL

invoke ExitProcess,NULL

.endif

invoke InitCommonControls

invoke GetModuleHandle,NULL

mov hInstance,eax

invoke LoadIcon,hInstance,IDI_MAIN

mov hIcon,eax

invoke LoadMenu,hInstance,IDM_MAIN

mov hMenu,eax

;*************** 注册窗口类 *****************************************

invoke LoadCursor,0,IDC_ARROW

mov @stWcMain.hCursor,eax

mov @stWcMain.cbSize,sizeof WNDCLASSEX

mov @stWcMain.hIconSm,0

mov @stWcMain.style,CS_HREDRAW or CS_VREDRAW

mov @stWcMain.lpfnWndProc,offset WndMainProc

mov @stWcMain.cbClsExtra,0

mov @stWcMain.cbWndExtra,0

mov eax,hInstance

mov @stWcMain.hInstance,eax

mov @stWcMain.hIcon,0

mov @stWcMain.hbrBackground,COLOR_BTNFACE+1

mov @stWcMain.lpszClassName,offset szClassName

mov @stWcMain.lpszMenuName,0

invoke RegisterClassEx,addr @stWcMain

;*************** 建立输出窗口 ***************************************

invoke CreateWindowEx,NULL,\ ;WS_EX_CLIENTEDGE,\

offset szClassName,offset szCaptionMain,\

WS_OVERLAPPEDWINDOW,\ ; OR WS_VSCROLL OR WS_HSCROLL,\

50,50,550,350,\

NULL,hMenu,hInstance,NULL

invoke ShowWindow,hWinMain,SW_SHOWNORMAL

invoke UpdateWindow,hWinMain

;*************** 消息循环 *******************************************

.while TRUE

invoke GetMessage,addr @stMsg,NULL,0,0

.break .if eax == 0

invoke TranslateMessage,addr @stMsg

invoke DispatchMessage,addr @stMsg

.endw

ret

_WinMain endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

WndMainProc proc uses ebx edi esi, \

hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

mov eax,uMsg

.if eax == WM_CREATE

mov eax,hWnd

mov hWinMain,eax

call _Init

;********************************************************************

.elseif eax == WM_SIZE

invoke SendMessage,hStatusbar,uMsg,wParam,lParam

invoke SendMessage,hToolbar,uMsg,wParam,lParam

;********************************************************************

.elseif eax == WM_COMMAND

mov eax,wParam

movzx eax,ax

.if eax == IDM_EXIT

call _Quit

.elseif eax == IDM_TOOLBAR

xor dwFlag,F_TOOLBAR

call _ArrangeWindow

.elseif eax == IDM_STATUSBAR

xor dwF

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 6:46:03

Token购买优惠活动开启:买一送一限时进行中

Token购买优惠活动开启&#xff1a;买一送一限时进行中 在大模型技术飞速演进的今天&#xff0c;一个70亿参数的模型已经不再需要顶级科研团队才能微调。越来越多的开发者开始面临一个新的现实问题&#xff1a;如何在一块消费级显卡上&#xff0c;高效完成从模型下载、微调到部…

作者头像 李华
网站建设 2026/9/2 22:28:35

C语言在工业控制中的实时响应优化:5大关键技术彻底解析

第一章&#xff1a;C语言在工业控制中的实时响应优化概述在工业控制系统中&#xff0c;实时性是衡量系统性能的核心指标之一。C语言因其接近硬件的操作能力、高效的执行效率以及对内存的精细控制&#xff0c;成为开发实时控制应用的首选编程语言。通过合理设计任务调度机制、优…

作者头像 李华
网站建设 2026/9/3 6:46:02

揭秘C语言集成TensorRT模型加载全过程:3大陷阱与性能优化策略

第一章&#xff1a;C语言集成TensorRT模型加载概述在高性能推理场景中&#xff0c;将深度学习模型通过NVIDIA TensorRT进行优化&#xff0c;并使用C语言实现高效加载与推理调用&#xff0c;已成为边缘计算、自动驾驶和实时图像处理等领域的关键技术路径。C语言凭借其对硬件资源…

作者头像 李华
网站建设 2026/9/5 0:23:29

Selenium 4.0实战:智能元素定位策略全解析

Selenium 4.0与元素定位的变革 Selenium作为自动化测试的核心工具&#xff0c;其4.0版本&#xff08;2021年发布&#xff09;引入了革命性的“智能元素定位策略”&#xff0c;解决了传统定位方法的痛点&#xff0c;如元素动态变化导致的脚本脆弱性。本文面向软件测试从业者&am…

作者头像 李华
网站建设 2026/9/5 21:16:50

ReFT与LISA联合微调:小样本场景下的精准模型优化

ReFT与LISA联合微调&#xff1a;小样本场景下的精准模型优化 在当前大模型快速演进的背景下&#xff0c;一个现实问题日益凸显&#xff1a;我们能否在仅有几百条标注数据、一块消费级显卡的情况下&#xff0c;依然对千亿参数模型完成有效微调&#xff1f;传统全参数微调早已成为…

作者头像 李华
网站建设 2026/9/4 1:10:07

深入浅出WinDbg Preview对PnP请求的跟踪方法

用WinDbg Preview揭开PnP请求的神秘面纱&#xff1a;从设备插入到驱动崩溃的全链路追踪你有没有遇到过这样的场景&#xff1f;一台新买的USB采集卡插上电脑&#xff0c;系统却弹出“该设备无法启动&#xff08;代码10&#xff09;”&#xff1b;或者某个PCIe板卡在重启后莫名其…

作者头像 李华