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

来源:岁月联盟 编辑:zhu 时间:2009-03-09

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

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

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

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

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

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

  函数原型为:

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

  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.csdn.net/source/636309):

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; FileName:AninWin.asm
;  Author:PurpleEndurer
;Functiion:DemothewaytouseAnimateWindow()
;  DevEnv:WinXPSP2 MASM32v7
;log
;------------------------------
;2008-09-18Created!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.586
.modelflat,stdcall
optioncasemap:none
;------------------
incbothmacroincl
included:masm32includeincl.inc
includelibd:masm32libincl.lib
endm
included:masm32includewindows.inc
incbothkernel32
incbothuser32
incbothgdi32
incbothcomctl32
incbothshell32
;prototypes
DlgProc PROTO:HWND,:UINT,:WPARAM,:LPARAM
;.const
IDD_dlgSetState equ  1000
.data
g_szAnimWindb"AnimateWindow",0
g_szUser32Dlldb"user32.dll",0
.data?
hInstance  HINSTANCE?
pAnimateWindow DD?
.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"masm32includeresource.h"
#defineIDC_lblAppInfo   3009
#defineIDD_dlgSetState   1000
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.comn2004.04.02广西河池n开发环境:MASM32V8",IDC_lblAppInfo,0,75,105,30,WS_DISABLED SS_CENTER
}

图片内容