博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MASM32编程实现窗口渐入渐出效果
阅读量:2399 次
发布时间:2019-05-10

本文共 3323 字,大约阅读时间需要 11 分钟。

导读:
  因为工作太忙,好久没写程序代码了,不过编写程序的乐趣令我乐此不疲。
  
  天天跟电脑打交道,一忙起来就忘了休息,弄得眼睛都花了~
  
  为了保护眼睛,偶决定写一个定时强制休息的程序~
  
  虽然现在这类程序已有不少,不过DIY一下还是不错的~
  
  先考虑实现倒计时提示窗口,打算让该窗口渐入渐出~
  
  这里用封装在user32.dll中的API函数AnimateWindow来实现。
  
  
函数原型为:
  
  BOOL AnimateWindow(
  HWND hwnd, //指定产生动画窗口的句柄;
  DWORD dwTime, //指明动画持续的时间(以微秒计),完成一个动画的标准时间为200微秒;
  DWORD dwFlags //指定动画类型。这个参数可以是一个或多个标志的组合。
  );
  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 flat, stdcall
  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
  g_szEditCls db "edit", 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, eax, OFFSET 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 eax, FALSE
  ret
  .endif
  
  xor eax, eax
  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
  }
本文转自

转载地址:http://ujiob.baihongyu.com/

你可能感兴趣的文章
第一次安装完linux不能上网的解决办法?
查看>>
zlc158
查看>>
linux安装完后的操作!
查看>>
(redhat) 在tcp/ip层次上创建虚拟接口.
查看>>
Apache
查看>>
用iptales实现包 过虑型防火墙(zt)
查看>>
如何用iptables实现NAT(zt)
查看>>
IBM-Windows 到 Linux 之旅: 系列文章概述
查看>>
Fedora core 5.0加载ntfs分区(yum方法)
查看>>
加载usb设备!
查看>>
yum--Yellow dog Updater, Modified
查看>>
星际译王(stardict)
查看>>
加载ntfs分区(通过加载支持ntfs内核补丁的方法)
查看>>
修改linux主机名!(网络上存在一些错误)
查看>>
edora core 5 办公环境安装配置,fc5不完全指南(十三)我在飞,加快fc5的启动速度(zt)...
查看>>
Linux启动过程综述(ibm)
查看>>
过并行化 Linux 系统服务来提高引导速度(zt)
查看>>
个人投资分析
查看>>
操作主机角色(操作主机角色有时称为灵活的单主机操作 (FSMO) 角色)
查看>>
域控制器降级失败后如何删除 Active Directory 中的数据
查看>>