MASM32编程实现窗口渐入渐出效果

本文介绍了一款个人DIY的定时休息程序,利用AnimateWindow API函数实现窗口的渐入渐出效果,帮助长时间使用电脑的人们缓解眼部疲劳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为工作太忙,好久没写程序代码了,不过编写程序的乐趣令我乐此不疲。

天天跟电脑打交道,一忙起来就忘了休息,弄得眼睛都花了~

为了保护眼睛,偶决定写一个定时强制休息的程序~

虽然现在这类程序已有不少,不过DIY一下还是不错的~

先考虑实现倒计时提示窗口,打算让该窗口渐入渐出~

这里用封装在user32.dll中的API函数AnimateWindow来实现。

函数原型为:

  1. BOOLAnimateWindow(
  2. HWNDhwnd,//指定产生动画窗口的句柄;
  3. DWORDdwTime,//指明动画持续的时间(以微秒计),完成一个动画的标准时间为200微秒;
  4. DWORDdwFlags//指定动画类型。这个参数可以是一个或多个标志的组合。
  5. );

dwFlags有效值::
  AW_SLIDE:使用滑动类型。缺省为滚动类型。使用AW_CENTER标志时被忽略;
  AW_ACTIVATE:激活窗口。在使用了AW_HIDE标志后不能使用这个标志;
  AW_BLEND:实现淡出效果。只有当hWnd为顶层窗口的时候才可以使用此标志;
  AW_HIDE:隐藏窗口,缺省则显示窗口;
  AW_CENTER:若使用了AW_HIDE标志,则使窗口向内重叠,即收缩窗口;若未使用AW_HIDE标志,则使窗口向外扩展,即展开窗口;
  AW_HOR_POSITIVE:自左向右显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略;
  AW_VER_POSITIVE:自顶向下显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略;
  AW_VER_NEGATIVE:自下向上显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略;

  返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。


如果
1、窗口使用了窗口边界;
2、窗口已经可见仍要显示窗口;
3、窗口已经隐藏仍要隐藏窗口。
函数调用将失败。

演示代码(下载地址:http://download.youkuaiyun.com/source/636309):

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;FileName:AninWin.asm
;Author:PurpleEndurer
;Functiion:DemothewaytouseAnimateWindow()
;DevEnv:WinXPSP2+MASM32v7

;log
;------------------------------
;2008-09-18Created!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.586
.modelflat,stdcall
optioncasemap:none
;------------------

incbothmacroincl
included:/masm32/include/incl.inc
includelibd:/masm32/lib/incl.lib
endm

included:/masm32/include/windows.inc
incbothkernel32
incbothuser32
incbothgdi32
incbothcomctl32
incbothshell32


;prototypes
DlgProcPROTO:HWND,:UINT,:WPARAM,:LPARAM

;.const
IDD_dlgSetStateequ1000

.data
g_szAnimWindb"AnimateWindow",0
g_szUser32Dlldb"user32.dll",0

.data?
hInstanceHINSTANCE?
pAnimateWindowDD?

.code
start:

invokeGetModuleHandle,NULL
mov[hInstance],eax
invokeDialogBoxParam,[hInstance],IDD_dlgSetState,NULL,OFFSETDlgProc,NULL
invokeExitProcess,NULL
invokeInitCommonControls

DlgProcprochWnd:HWND,wMsg:UINT,lParam:LPARAM,wParam:WPARAM
.ifwMsg==WM_INITDIALOG
;---获取AnimateWindow()地址
invokeSendMessage,[hWnd],WM_SETTEXT,NULL,OFFSETg_szAnimWin
invokeGetModuleHandle,OFFSETg_szUser32Dll
invokeGetProcAddress,eax,OFFSETg_szAnimWin
mov[pAnimateWindow],eax

;---如果取得地址,则渐入显示对话框窗口
.if[pAnimateWindow]
pushAW_BLEND+AW_ACTIVATE
push400h;time
push[hWnd];windowHandle
call[pAnimateWindow]
.endif

invokeInvalidateRect,hWnd,0,TRUE


.elseifwMsg==WM_CLOSE
;---如果取得地址,则渐出关闭对话框窗口
.if[pAnimateWindow]
pushAW_BLEND+AW_HIDE
push400h
push[hWnd]
call[pAnimateWindow]
.endif
invokeEndDialog,[hWnd],NULL
.else
moveax,FALSE
ret
.endif

xoreax,eax
ret
DlgProcendp

endstart

;;;;;;;;;;;
;rsrc.rc
;;;;;;;;;;;

#include"/masm32/include/resource.h"
#defineIDC_lblAppInfo3009
#defineIDD_dlgSetState1000

IDD_dlgSetStateDIALOG10,10,120,114
STYLE0x0004|DS_CENTER|WS_CAPTION|DS_SYSMODAL|WS_SYSMENU|WS_VISIBLE|WS_OVERLAPPED|DS_MODALFRAME|DS_3DLOOK
CAPTION"GetColor"
FONT9,"宋体"
{
LTEXT"purpleendurer@163.com/n2004.04.02广西河池/n开发环境:MASM32V8",IDC_lblAppInfo,0,75,105,30,WS_DISABLED+SS_CENTER
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值