news 2026/4/23 9:47:55

汇编语言全接触-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/4/23 9:48:33

C语言无人机数据采集处理全攻略(从传感器读取到实时分析)

第一章&#xff1a;C语言在无人机数据采集中的核心作用在现代无人机系统中&#xff0c;数据采集是实现飞行控制、环境感知和任务执行的关键环节。C语言凭借其高效的执行性能、对硬件的直接操作能力以及低内存占用特性&#xff0c;成为无人机嵌入式系统开发的首选编程语言。实时…

作者头像 李华
网站建设 2026/4/23 9:47:58

【稀缺技术披露】:如何用Apache Arrow实现C与Rust零成本数据共享?

第一章&#xff1a;Apache Arrow C/Rust 数据交互概述Apache Arrow 是一种跨语言的内存数据格式标准&#xff0c;旨在实现高效的数据分析与交换。其核心优势在于提供零拷贝&#xff08;zero-copy&#xff09;读取能力&#xff0c;使得不同编程语言之间能够以统一的列式内存布局…

作者头像 李华
网站建设 2026/4/23 11:27:00

多模态大模型怎么选?一锤定音提供300+模型对比与评测数据

多模态大模型怎么选&#xff1f;一锤定音提供300模型对比与评测数据 在智能应用从“能用”迈向“好用”的今天&#xff0c;一个现实问题摆在开发者面前&#xff1a;面对动辄上百GB的多模态大模型、五花八门的微调方法和参差不齐的评测标准&#xff0c;我们究竟该如何选择最适合…

作者头像 李华
网站建设 2026/4/23 11:14:09

百元预算跑大模型?RTX 3090+Swift框架性价比之选

百元预算跑大模型&#xff1f;RTX 3090Swift框架性价比之选 在AI模型参数动辄上百亿的今天&#xff0c;“本地部署大模型”听起来像是只有大厂才能玩得起的游戏。A100、H100集群一上就是几十万起步&#xff0c;普通开发者别说训练了&#xff0c;连推理都望而却步。但如果你手头…

作者头像 李华
网站建设 2026/4/23 16:06:41

AWQ与GPTQ谁更强?ms-swift量化模块深度评测

AWQ与GPTQ谁更强&#xff1f;ms-swift量化模块深度评测 在大模型落地的现实战场上&#xff0c;显存墙、推理延迟和部署成本始终是横亘在理想与可用之间的三座大山。当一个70亿参数的模型加载就需要14GB显存时&#xff0c;我们不得不面对一个问题&#xff1a;如何让这些“巨无霸…

作者头像 李华
网站建设 2026/4/23 16:11:06

谷歌镜像访问困难?转向国内AI专用模型仓库正当时

谷歌镜像访问困难&#xff1f;转向国内AI专用模型仓库正当时 在大模型研发如火如荼的今天&#xff0c;许多开发者可能都经历过这样的场景&#xff1a;凌晨两点&#xff0c;实验即将启动&#xff0c;却卡在最后一步——从 Hugging Face 或 Google Drive 下载模型权重。进度条缓慢…

作者头像 李华