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

MASM32编程状态栏显示字符动画,按钮跑马灯

 一、需求分析

由于sysInfo扫描的内容比较多,打算为它增加一点动画效果,提醒用户程序正在运行,耐心等待。

二、构建测试窗口

测试窗口上放置有一个按钮,按钮上的初始文字是“开始扫描”;并使用状态栏,状态栏初始状态不显示文字。

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 文 件 名:marquee.asm (GUI程序)
; 功    能: 文字动画
; 开发环境:Win10 PRO + MASM32 v22
; 作    者:PurpleEndurer,广西河池
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.586
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONEINCLUDE \masm32\include\windows.incINCLUDE \masm32\include\kernel32.inc
INCLUDELIB \masm32\lib\kernel32.libINCLUDE \masm32\include\user32.inc
INCLUDELIB \masm32\lib\user32.libinclude \MASM32\INCLUDE\shell32.inc
includelib \MASM32\LIB\shell32.libinclude \masm32\include\comctl32.inc
includelib \masm32\lib\comctl32.lib;ssssssssssssssssssssssss
;.const
;ssssssssssssssssssssssssc_MainWinStyle   equ NULL
c_statusBarStyle equ SBARS_SIZEGRIP or WS_CHILD or WS_VISIBLE
c_BtnStyle       equ WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON
c_BtnID          equ 198
c_statusBarID    equ 199
c_TimerID        equ 1000;ssssssssssssssssssssssss
;PROTO
;ssssssssssssssssssssssssWinMain          proto :HINSTANCE, :HINSTANCE, :LPSTR, :DWORD
WndProc          proto :HWND, :UINT, :WPARAM, :LPARAM
ResizeMainWnd    proto
Marquee          proto
statusBarMarquee proto
btnMarquee       proto;ssssssssssssssssssssssss
.DATA
;ssssssssssssssssssssssss
g_szClassName label byte
g_szAppInfo   db "文字动画 作者:PurpleEndurer, 广西河池", 0g_szBtnClsName  db "button", 0
g_szScan_btn    db "开始扫描", 0   ;_btn 用于按钮
g_szStop_btn    db "点击停止", 0
g_szLoopTxt_btn db "点击停止", 0g_szScanning_Sb db "—正在扫描……", 0; _Sb用于状态栏
g_szScanOver_Sb db "扫描完成", 0      ;  
g_dwLoop_Sb     dword 0g_hInstance  HANDLE ?
g_hwndMain   HANDLE ?
g_hStatusBar HANDLE ?
g_hBtn       HANDLE ?;ssssssssssssssssssssssss
.CODE
;ssssssssssssssssssssssss
start:invoke GetModuleHandle, NULLmov    g_hInstance, eaxinvoke WinMain, g_hInstance, NULL, NULL, SW_SHOWDEFAULTinvoke ExitProcess, eaxinvoke InitCommonControls;======================================================
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
;======================================================LOCAL wc:WNDCLASSEXLOCAL msg:MSGmov    wc.cbSize,SIZEOF WNDCLASSEXmov    wc.style, CS_HREDRAW or CS_VREDRAWmov    wc.lpfnWndProc, OFFSET WndProcmov    wc.cbClsExtra, NULLmov    wc.cbWndExtra, NULLpush   hInstpop    wc.hInstancemov    wc.hbrBackground, COLOR_WINDOW+1mov    wc.lpszMenuName, NULL  ;OFFSET MenuNamemov    wc.lpszClassName, OFFSET g_szClassNameinvoke LoadIcon,NULL,IDI_APPLICATION   ;invoke LoadIcon, hInst, IDI_ICONmov    wc.hIcon, eaxmov    wc.hIconSm, eaxinvoke LoadCursor, NULL, IDC_ARROWmov    wc.hCursor, eaxinvoke RegisterClassEx, addr wcINVOKE CreateWindowEx, c_MainWinStyle, ADDR g_szClassName,ADDR g_szAppInfo,\WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,500,400,NULL,NULL, hInst,NULLmov    g_hwndMain, eaxINVOKE ShowWindow, g_hwndMain, SW_SHOWNORMALINVOKE UpdateWindow, g_hwndMain.WHILE TRUEINVOKE GetMessage, ADDR msg,NULL,0,0.BREAK .IF (!eax)INVOKE TranslateMessage, ADDR msgINVOKE DispatchMessage, ADDR msg.ENDWmov     eax, msg.wParamret
WinMain endp;======================================================
WndProc proc uses ebx hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
;======================================================mov eax, uMsg.IF eax==WM_CREATE;创建状态栏invoke CreateStatusWindow, c_statusBarStyle, NULL, hWnd, c_statusBarIDmov    g_hStatusBar, eax;创建按钮invoke CreateWindowEx, NULL, ADDR g_szBtnClsName, ADDR g_szScan_btn,\c_BtnStyle, 75,70,140,25, hWnd, c_BtnID, g_hInstance, NULLmov    g_hBtn, eax.ELSEIF eax==WM_COMMANDmov eax,wParam.if ax==c_BtnIDshr eax,16.IF ax==BN_CLICKED;用户点击按钮.if  g_dwLoop_Sb==0;进行扫描状态invoke SetTimer, hWnd, c_TimerID, 1000, NULLmov    eax, OFFSET g_szStop_btn.else;退出扫描状态invoke KillTimer, hWnd, c_TimerID mov    g_dwLoop_Sb, 0invoke SendMessage, g_hStatusBar, SB_SETTEXT, 0, OFFSET g_szScanOver_Sbinvoke RedrawWindow, g_hStatusBar, NULL, NULL, RDW_INTERNALPAINT    mov    eax, OFFSET g_szScan_btn				.endifinvoke SendMessage, g_hBtn ,WM_SETTEXT, 0, eax.ENDIF.endif     .ELSEIF eax==WM_TIMER;定时调用Marquee函数invoke Marquee.ELSEIF eax==WM_SIZEinvoke ResizeMainWnd.ELSEIF eax==WM_DESTROYinvoke PostQuitMessage,NULL.ELSEinvoke DefWindowProc,hWnd,uMsg,wParam,lParamret.ENDIFxor eax,eaxret
WndProc endp;======================================================
ResizeMainWnd proc
;======================================================invoke MoveWindow, g_hStatusBar, 0, 0, 0, 0, TRUEret
ResizeMainWnd endpEND start

三、在状态栏显示字符动画

记得以前DOS时代使用冠群金辰的杀毒软件kill,在扫描时会显示一个扫描形状的字符动画,当时觉得很有意思,映像深刻,这次就把这种效果用在状态栏上。

实现的方法就是当用户点扫描使用定时器定时刷新状态栏的文字。其中的扫描动态效果就是将依次状态栏文字的首字依次更新为—(编码:0AAA1h)、\(编码:0DCA3h)、|(编码:0FCA3h)、/(编码:0AFA3h)。

代码如下:


;======================================================
Marquee proc
;======================================================invoke statusBarMarquee ret
Marquee endp;======================================================
statusBarMarquee proc uses eax
;======================================================inc g_dwLoop_Sb.if g_dwLoop_Sb > 4mov g_dwLoop_Sb, 1 .endifmov eax, offset g_szScanning_Sb.if g_dwLoop_Sb==1mov word ptr [eax], 0DCA3h;'\'.elseif g_dwLoop_Sb==2mov word ptr [eax], 0FCA3h;'|'.elseif g_dwLoop_Sb==3mov word ptr [eax], 0AFA3h;'/'.elseif g_dwLoop_Sb==4mov word ptr [eax], 0AAA1h;'—'.endifinvoke SendMessage, g_hStatusBar, SB_SETTEXT, 0, OFFSET g_szScanning_Sbinvoke RedrawWindow, g_hStatusBar, NULL, NULL, RDW_INTERNALPAINT    ret
statusBarMarquee endp

四、按钮跑马灯

窗口上的按钮初始文字是“开始扫描”,当我们点击按钮进入扫描状态时,我们将按钮文字改成“点击停止”并跑马灯。原理也是使用定时器,定期更新按钮上的文字。

代码如下:

;======================================================
Marquee proc
;======================================================invoke btnMarqueeinvoke statusBarMarquee ret
Marquee endp;======================================================
btnMarquee proc uses eax ;ebx
;======================================================mov eax, offset g_szLoopTxt_btn;保存按钮文本首字push word ptr [eax] ;mov bx, word ptr [eax]inc eaxinc eax; 按钮文字前移.while byte ptr [eax]!=0push word ptr [eax]pop  word ptr [eax-2]inc  eaxinc  eax.endw;把按钮文本首字放到末尾pop word ptr [eax-2] ;mov word ptr [eax-2], bxinvoke SendMessage, g_hBtn ,WM_SETTEXT, 0, OFFSET g_szLoopTxt_btninvoke RedrawWindow, g_hBtn, NULL, NULL, RDW_INTERNALPAINT    ret
btnMarquee endp

五、程序运行效果

如下:

六、改进思路

文字动画在DOS的CGI时代还是颇具吸引力的,放到GUI时代复古一下也是一种怀念。

如果我们追求GUI的效果,可以对状态栏进行子类化,为它创建一个进度条。对按钮子类化,显示gif图片。

七、附记

进入Windows时代,Kill就像UCDOS一样淡出视野了。刚才为了确认无误,bing查了一下,冠群金辰的网站还在,只是内容很久没更新了。

不经意间顺带看到一篇关于火绒的文章,才知道火绒的几位创始人都出自瑞星……

相关文章:

MASM32编程状态栏显示字符动画,按钮跑马灯

一、需求分析 由于sysInfo扫描的内容比较多&#xff0c;打算为它增加一点动画效果&#xff0c;提醒用户程序正在运行&#xff0c;耐心等待。 二、构建测试窗口 测试窗口上放置有一个按钮&#xff0c;按钮上的初始文字是“开始扫描”&#xff1b;并使用状态栏&#xff0c;状态…...

Pytorch-以数字识别更好地入门深度学习

目录 一、数据介绍 二、下载数据 三、可视化数据 四、模型构建 五、模型训练 六、模型预测 一、数据介绍 MNIST数据集是深度学习入门的经典案例&#xff0c;因为它具有以下优点&#xff1a; 1. 数据量小&#xff0c;计算速度快。MNIST数据集包含60000个训练样本和1000…...

微服务--服务介绍

Spring Cloud实现对比 Spring Cloud 作为一套标准&#xff0c;实现不一样 Spring Cloud AlibabaSpring Cloud NetflixSpring Cloud 官方Spring Cloud Zookeeper分布式配置Nacos ConficArchaiusSpring Cloud ConfigZookeeper服务注册/发现Nacos DiscoveryEureka--Zookeeper服务…...

自定义线程池-初识

自定义线程池-初步了解 创建一个固定大小的线程池 在Java中&#xff0c;你可以通过自定义线程池并指定线程的名称来实现你的需求。下面是一个简单的示例&#xff0c;展示了如何创建一个固定大小的线程池&#xff0c;并给每个线程指定一个名称&#xff1a; import java.util.…...

低代码平台:IVX 重新定义编程

目录 &#x1f36c;一、写在前面 &#x1f36c;二、低代码平台是什么 &#x1f36c;三、为什么程序员和技术管理者不太可能接受“低代码”平台&#xff1f; &#x1f36d;1、不安全&#xff08;锁定特性&#xff09; &#x1f36d;2、不信任 &#x1f36c;四、IVX低代码平台 &a…...

Android之自定义时间选择弹框

文章目录 前言一、效果图二、实现步骤1.自定义Dialog2.xml布局3.背景白色转角drawable4.取消按钮背景drawable5.确定按钮背景drawable6.NumberPicker样式和弹框样式7.弹框动画8.Activity使用 总结 前言 随着产品人员不断变态下&#xff0c;总是会要求我们的界面高大上&#xf…...

异地容灾系统和数据仓库系统设计和体系结构

&#xff08; 1&#xff09;生产系统数据同步到异地容灾系统 生产系统与异地容灾系统之间是通过百兆网连接的&#xff1b;生产系统的数据库是 Oracle 9i RAC&#xff0c;总的数据量大约为 3 TB&#xff0c;涉及五千多张表。对这些表进行分析归 类&#xff0c;发现容灾系统真正…...

【pytest】tep环境变量、fixtures、用例三者之间的关系

tep是一款测试工具&#xff0c;在pytest测试框架基础上集成了第三方包&#xff0c;提供项目脚手架&#xff0c;帮助以写Python代码方式&#xff0c;快速实现自动化项目落地。 在tep项目中&#xff0c;自动化测试用例都是放到tests目录下的&#xff0c;每个.py文件相互独立&…...

风控引擎如何快速添加模型,并实时了解运行状态?

目录 风控模型的主要类型 风控引擎如何管理模型&#xff1f; 模型就是基于目标群体的大规模采样数据&#xff0c;挖掘出某个实际问题或客观事物的现象本质及运行规律&#xff0c;利用抽象的概念分析存在问题或风险&#xff0c;计算推演出减轻、防范问题或风险的对策过程&…...

一文读懂|内核顺序锁

Linux 内核有非常多的锁机制&#xff0c;如&#xff1a;自旋锁、读写锁、信号量和 RCU 锁等。本文介绍一种和读写锁比较相似的锁机制&#xff1a;顺序锁&#xff08;seqlock&#xff09;。 顺序锁与读写锁一样&#xff0c;都是针对多读少写且快速处理的锁机制。而顺序锁和读写…...

openproject在docker下的安装

官方指引&#xff1a;https://www.openproject.org/docs/installation-and-operations/installation/docker/ 网友指引&#xff1a;https://blog.csdn.net/joefive/article/details/119409550 建个自己的数据文件夹&#xff1a; sudo mkdir -p /var/lib/openproject/{mydata…...

React【React是什么?、创建项目 、React组件化、 JSX语法、条件渲染、列表渲染、事件处理】(一)

文章目录 React是什么&#xff1f; 为什么要学习React React开发前准备 创建React项目 React项目结构简介 React组件化 初识JSX 渲染JSX描述的页面 JSX语法 JSX的Class与Style属性 JSX生成的React元素 条件渲染&#xff08;一&#xff09; 条件渲染 &#xff0…...

Ubuntu系统下配置 Qt Creator 输入中文、配置软件源的服务器地址、修改Ubuntu系统时间

上篇介绍了Ubuntu系统下搭建QtCreator开发环境。我们可以发现安装好的QtCreator不能输入中文&#xff0c;也没有中文输入法供选择&#xff0c;这里需要进行设置。 文章目录 1. 配置软件源的服务器地址2. 先配置Ubuntu系统语言&#xff0c;设置为中文3. 安装Fcitx插件&#xff…...

Ab3d.PowerToys 11.0.8614 Crack

版本 11.0.8614 修补程序 使用 MouseCameraController 移动相机时防止旋转 FreeCamera。 版本 11.0.8585 重大更改&#xff1a;由于专利问题删除了 ViewCubeCameraController - 请联系支持人员以获取更多信息以及如果您想继续使用此控件。添加了 CameraNavigationCircles 控件…...

汽车3D HMI图形引擎选型指南【2023】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 2002年&#xff0c;电影《少数派报告》让观众深入了解未来。 除了情节的核心道德困境之外&#xff0c;大多数人都对它的技术着迷。 我们看到了自动驾驶汽车、个性化广告和用户可以无缝交互的 3D 计算机界面。 令人惊讶的是…...

Stable Diffusion stable-diffusion-webui开发笔记

https://lexica.art/ lexica.art 该网站拥有数百万Stable Diffusion案例的文字描述和图片&#xff0c;可以为大家提供足够的创作灵感。可以提供promt灵感 https://civitai.com/ Civitai是一个聚集AI绘图爱好者的社区&#xff0c;在此网站上有许多定制化的模型&#xff0c;特…...

利用MQ实现mysql与elasticsearch数据同步

流程 1.声明exchange、queue、RoutingKey 2. 在hotel-admin中进行增删改&#xff08;SQL&#xff09;&#xff0c;完成消息发送 3. 在hotel-demo中完成消息监听&#xff0c;并更新elasticsearch数据 4. 测试同步 1.引入依赖 <!--amqp--> <dependency><groupId&…...

linux免密登录最简单--图文详解

最简单的免密登录 1.A电脑生成秘钥 ssh-keygen -t rsa 2.A电脑将秘钥传给B电脑 ssh-copy-id root192.168.1.129 #将秘钥直接传给B电脑 需要输入B电脑的密码&#xff0c;可以看到成功。 3.测试 同理&#xff1a;如果B->A也需要免密登录&#xff0c;统一的操作。 大功告…...

HTTP/1.1协议中的请求报文

2023年8月30日&#xff0c;周三上午 目录 概述请求报文示例详述 概述 HTTP/1.1协议的请求报文由以下几个部分组成&#xff1a; 请求行&#xff08;Request Line&#xff09;请求头部&#xff08;Request Headers&#xff09;空行&#xff08;Blank Line&#xff09;请求体&a…...

攻防世界-Hear-with-your-Eyes

原题 解题思路 是一个没有后缀的文件&#xff0c;题目提示要用眼睛看这段音频&#xff0c;notepad打开文件&#xff0c;没什么东西。 加后缀zip再解压看看。 使用Audacity打开音频文件...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...