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查了一下,冠群金辰的网站还在,只是内容很久没更新了。

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

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

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

相关文章

技术领导力实战笔记25

25&#xff5c;用心做好“鼓励式”管理 激发正能量 授权 分工作&#xff1a; 老人干新事&#xff0c;新人干老事&#xff0c;强者干难事&#xff0c;弱者干细事 新人干老事 所谓新人&#xff0c;是对业务产品不了解&#xff0c;对工作流程不清晰的岗位新人。对于新人来说&…

【Linux内核】以共享内存的方式实现进程间通信

现在有很多进程间通信的模式&#xff0c;但是我们选择一个简单的IPC机制&#xff08;共享内存&#xff09;来实现&#xff0c;并让它工作起来。 简单来讲我们实现了两个系统调用&#xff08;不可避免地需要我们完善IDT&#xff09;&#xff0c;发送方查看接受方是否接收&#…

成都瀚网科技有限公司:抖店的评论会消失吗?

抖店是抖音推出的电子商务平台。很多用户在购物后都会对产品进行评价。但有时用户可能会发现抖店评论缺失&#xff0c;让用户产生一些疑惑和困惑。本文将围绕这个问题提供一些答案和解决方案。 1.为什么抖店评论不见了&#xff1f; 首先需要明确的是&#xff0c;抖店评论消失可…

STM32G030F6 (SOP-20)Cortex ® -M0+, 32KB Flash, 8KB RAM, 17 GPIOs

淘宝淘了一批 STM32G030F6P6 SOP20&#xff0e;先备注一下, 还没想到能干嘛用&#xff0e; 手上的 STM32F103C6T6还剩一些&#xff0e; 一堆 “淘宝原厂STM32F103C8T6”, 还烫着手. 理解信息: ( 逐步补充 ) System Clock GPIOs GPIOs 17 PA[7:0] : 8bits USART Timer ADC I2…

面试中的商业思维:如何展示你对业务的理解

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Ubuuntu22.04 LTS 用户管理,新建用户 adduser,sudo,管理员用户

1、新建用户zzsn adduser zzsn 为用户修改密码 # 为用户修改密码 sudo passwd zzsn 2、验证用户是否创建成功 cat /etc/passwd | grep zzsn 查看系统中所有用户&#xff08;可选&#xff09; grep bash /etc/passwd 3、为新用户授予管理或sudo权限&#xff08;可选&#x…

固定资产卡片乱怎么管理

固定资产卡片是记录公司固定资产信息的重要工具&#xff0c;如果管理不善&#xff0c;容易造成卡片混乱、数据错误等问题。 为了避免这种情况的发生&#xff0c;可以采取以下措施&#xff1a;  建立完善的资产管理制度&#xff0c;明确固定资产的分类、标准和使用情况&#x…

解决uniapp下拉框 内容被覆盖的问题

1. 下拉框 内容被覆盖的问题 场景: 现在是下拉框被表格覆盖了 解决办法: 在表格上添加css 样式来解决这个问题 .add-table{display: static;overflow: visible; } display: static: 将元素会按照默认的布局方式进行显示&#xff0c;不会分为块状或行内元素。 overflow: vi…

SpringMvc框架入门使用(详细教程)

目录 ​编辑 1.SpringMVC框架是什么&#xff1f; 2.SpringMVC工作流程 3.SpringMVC的入门 3.1 pom.xml 3.2spring-mvc.xml 3.3web.xml 3.4 建立一个web的方法 4.5 建立一个首页 4.6效果展示 4.图片处理 1.SpringMVC框架是什么&#xff1f; Spring MVC是一个基…

css让多个盒子强制自动等宽

1.width: calc( 100 / n‘%" ) 2.display:flex; flex:1;width:100px;&#xff08;width是几都行 只要保证一样就可以 会自动等分&#xff09; 3.display:grid;grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); 但是其中某一个内容较长的时候 会破坏1:1:1的…

Linux的命令

Linux的命令分为四个类型&#xff1a;文件操作命令、系统操作命令、文本处理命令和网络操作命令。下面简单介绍一下常用的Linux命令&#xff1a; 文件操作命令 ls&#xff1a;列出目录下的所有文件和目录。 cd&#xff1a;切换当前目录。 mkdir&#xff1a;创建一个新目录。…

skywalking springgateway 全链路

环境 spring-cloud-gateway 3.1.0 springGateway整合skywalking skywalking 默认是不整合springGateway的,需要手动拷贝skywalking optional-plugins下的 apm-spring-cloud-gateway-N.x-plugin-8.13.0.jar 和 apm-spring-webflux-5.x-plugin-8.13.0.jar 架包拷贝到plugins目…