现在的位置: 首页 > 综合 > 正文

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

2013年08月20日 ⁄ 综合 ⁄ 共 3360字 ⁄ 字号 评论关闭

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

 

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

 

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

 

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

 

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

 

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

 

函数原型为:

 

  1. BOOL AnimateWindow( 
  2.       HWND hwnd, //指定产生动画窗口的句柄;
  3.       DWORD dwTime, //指明动画持续的时间(以微秒计),完成一个动画的标准时间为200微秒; 
  4.       DWORD dwFlags //指定动画类型。这个参数可以是一个或多个标志的组合。
  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.csdn.net/source/636309):

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;  FileName: AninWin.asm
;    Author: Purple Endurer
; Functiion: Demo the way to use AnimateWindow()
;    DevEnv: Win XP SP2 + MASM32 v7

; log
; ------------------------------
; 2008-09-18 Created!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.586
.model flatstdcall
option casemap:none
;------------------

incboth macro incl
 include d:/masm32/include/incl.inc
 includelib d:/masm32/lib/incl.lib
endm

include d:/masm32/include/windows.inc
incboth kernel32
incboth user32
incboth gdi32
incboth comctl32
incboth shell32

; prototypes
DlgProc   PROTO :HWND, :UINT, :WPARAM, :LPARAM

; .const
IDD_dlgSetState  equ    1000

.data
g_szAnimWin db "AnimateWindow", 0
g_szUser32Dll db "user32.dll", 0

.data?
hInstance    HINSTANCE ?
pAnimateWindow   DD ?

.code
start:

invoke GetModuleHandle, NULL
mov [hInstance], eax
invoke DialogBoxParam, [hInstance], IDD_dlgSetState, NULL, OFFSET DlgProc, NULL
invoke ExitProcess, NULL
invoke InitCommonControls
 
DlgProc proc hWnd:HWND, wMsg:UINT, lParam:LPARAM, wParam:WPARAM
     .if wMsg == WM_INITDIALOG
          ;--- 获取AnimateWindow()地址
          invoke SendMessage, [hWnd], WM_SETTEXT, NULL, OFFSET g_szAnimWin
          invoke GetModuleHandle, OFFSET g_szUser32Dll
          invoke GetProcAddress, eaxOFFSET g_szAnimWin
          mov [pAnimateWindow], eax

          ;--- 如果取得地址,则渐入显示对话框窗口
      .if [pAnimateWindow]
               push AW_BLEND + AW_ACTIVATE
               push 400h  ; time
               push [hWnd] ; window Handle
               call [pAnimateWindow]
          .endif

          invoke InvalidateRect, hWnd, 0, TRUE

  
     .elseif wMsg == WM_CLOSE
          ;--- 如果取得地址,则渐出关闭对话框窗口
      .if [pAnimateWindow]
               push AW_BLEND + AW_HIDE
               push 400h
               push [hWnd]
               call [pAnimateWindow]
          .endif
          invoke EndDialog, [hWnd], NULL  
     .else
          mov eaxFALSE
          ret
     .endif
 
     xor eaxeax
     ret
DlgProc endp

end start

 

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

#include "/masm32/include/resource.h"
#define IDC_lblAppInfo       3009
#define IDD_dlgSetState      1000

IDD_dlgSetState DIALOG 10, 10, 120, 114
STYLE 0x0004 | DS_CENTER | WS_CAPTION | DS_SYSMODAL | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Get Color"
FONT 9, "宋体"
{
    LTEXT    "purpleendurer@163.com/n2004.04.02 广西河池/n开发环境:MASM32 V8", IDC_lblAppInfo, 0, 75, 105, 30, WS_DISABLED + SS_CENTER
}

抱歉!评论已关闭.