news 2026/2/9 4:40:46

汇编语言全接触-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/2/8 7:10:31

语音识别也能做微调?HQQ量化+GRPO对齐技术落地实践

语音识别也能做微调&#xff1f;HQQ量化GRPO对齐技术落地实践 在智能语音助手、会议转录和实时字幕等场景日益普及的今天&#xff0c;一个看似“成熟”的语音识别系统背后&#xff0c;仍面临诸多隐性挑战&#xff1a;模型动辄数十GB&#xff0c;难以部署到边缘设备&#xff1b;…

作者头像 李华
网站建设 2026/2/5 21:37:51

工业控制系统中C语言实时性提升实战(从代码到硬件的全链路优化)

第一章&#xff1a;工业控制系统中C语言实时性提升的核心挑战在工业控制系统&#xff08;ICS&#xff09;中&#xff0c;C语言因其高效性和对硬件的直接控制能力被广泛采用。然而&#xff0c;实现高实时性仍面临多重技术挑战&#xff0c;尤其是在任务调度、中断响应和资源竞争等…

作者头像 李华
网站建设 2026/2/9 2:32:12

HuggingFace镜像网站支持HF_TOKEN免登录下载

HuggingFace镜像网站支持HF_TOKEN免登录下载 在大模型研发日益普及的今天&#xff0c;一个看似简单却频繁发生的操作——“下载模型权重”——常常成为实际工作流中的瓶颈。尤其是在国内网络环境下&#xff0c;直接从 Hugging Face 官方仓库拉取 LLaMA、Qwen 等热门模型时&…

作者头像 李华
网站建设 2026/2/5 17:08:54

Python调用C函数慢?教你用CFFI实现接近原生速度的接口调用

第一章&#xff1a;Python调用C函数慢&#xff1f;性能瓶颈的根源剖析在高性能计算场景中&#xff0c;开发者常通过Python调用C函数以提升执行效率。然而&#xff0c;实际应用中却可能发现性能提升并不明显&#xff0c;甚至出现调用开销反超的情况。这一现象的背后&#xff0c;…

作者头像 李华
网站建设 2026/2/8 19:11:02

C#调用Python AI模型?跨语言集成实战案例分享

C#调用Python AI模型&#xff1f;跨语言集成实战案例分享 在企业级系统中&#xff0c;C#长期占据着桌面应用、工业软件和后台服务的主导地位。它的类型安全、高性能运行时&#xff08;CLR&#xff09;以及与Windows生态的深度整合&#xff0c;使其成为金融、制造、医疗等领域系…

作者头像 李华
网站建设 2026/2/7 2:39:27

Git Commit提交规范太复杂?让本地大模型自动帮你生成Commit信息

Git Commit提交规范太复杂&#xff1f;让本地大模型自动帮你生成Commit信息 在每天的开发流程中&#xff0c;你是否也曾面对 git commit 时卡壳——明明改了几百行代码&#xff0c;却不知道该怎么写一条既准确又合规的提交信息&#xff1f;“feat”还是“fix”&#xff1f;要不…

作者头像 李华