📄 用masmplus 学习汇编语言 6.txt
字号:
用MasmPlus 学习汇编语言 6 作者:Zoologist 于2008-1-17上传
--------------------------------------------------------------------------------
本文相关的例子:下载>>>
一.窗口的动画效果的实现
在Windows中要实现窗口的动画效果,只需要一个API函数:AnimateWindow 。
MSDN上定义如下:
Syntax
BOOL AnimateWindow(
HWND hwnd,
DWORD dwTime,
DWORD dwFlags
);
Parameters
hwnd
[输入] 生成动画效果的窗口的handle。调用这个API的线程必须是这个窗口的。
dwTime
[输入]指定动画的时间,单位是毫秒,通常都是200毫秒。
dwFlags
[输入]指定动画的样式。可以指定一个或者多个。需要注意的是,默认情况下,这些效果是当显示一个窗口的时候。如果需要在隐藏一个窗口时实现这些效果,请指定AW_HIDE并用 or 逻辑再指定其他样式。
AW_SLIDE
滑动效果。当指定了AW_ACTIVE,将忽略这个标志。
AW_ACTIVATE
激活窗口,不要和AW_HIDE同时使用。
AW_BLEND
淡入淡出效果。只有当hwnd给出的窗口处于最上层才有效。
AW_HIDE
隐藏窗口。默认是显示窗口。
AW_CENTER
当指定AW_HIDE时为向中心收缩的效果;未指定AW_HIDE时为向四周扩散的效果。
AW_HOR_POSITIVE
窗口从左到右的效果。
AW_HOR_NEGATIVE
窗口从右到左的效果。
AW_VER_POSITIVE
窗口从上到下的效果。
AW_VER_NEGATIVE
窗口从下到上的效果。
下面就是一个简单的例子,大部分程序都是MasmPlus模板,真正的代码只有四行:
;MASMPlus 代码模板 - 普通的 Windows 程序代码
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.DATA
szClassName db "MASMPlus_Class",0
.DATA?
hInstance dd ?
.CODE
START:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
invoke ExitProcess,0
WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
local hWnd :HWND
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,offset szClassName
invoke LoadIcon,hInst,100
mov wc.hIcon,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
mov wc.hIconSm,0
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx,NULL,ADDR szClassName,CTXT("http://www.aogosoft.com"),WS_OVERLAPPEDWINDOW,200,200,400,200,NULL,NULL,hInst,NULL
mov hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWin:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
.if uMsg==WM_CREATE
;真正起作用的是下面的四条语句
;从左到右显示窗口
invoke AnimateWindow,hWin,1000,AW_SLIDE or AW_HOR_POSITIVE
;当要关闭窗口时会触发这个消息
.elseif uMsg==WM_CLOSE
;淡入效果,窗口消失
invoke AnimateWindow,hWin,1000,AW_BLEND or AW_HIDE
;下面要发一条WM_DESTROY消息,否则的话程序不会结束
invoke SendMessage,hWin,WM_DESTROY,wParam,lParam
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
.endif
ret
WndProc endp
END START
执行后,窗口会从左边滑出来:
关闭时,窗口会变淡直到消失。
参考:
1. MSDN: http://msdn2.microsoft.com/en-us/library/ms632669.aspx
2. <<Visual C++ 6.0 应用编程150例>> P18 实例9 窗口的动画效果
二.禁止用户关闭Winodws
下面的程序实现阻止用户关闭Windows。简单的说,当你选择关闭系统时,
Windows会给当前的程序发送 WM_QUERYENDSESSION 消息,意思就是说,我要
shutdown了,各位还有什么想说的,还有什么想做的... ... 我们在程序中
判定这个消息,返回一句话“FALSE”,告诉Windows,我这还没有完呢~ 于是
Windows就会停止关闭。
程序非常非常简单,使用MasmPlus随便建立一个 Win32 程序,我们在
消息循环中插入下面的代码,既可实现。
WndProc proc hWin:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
.if uMsg==WM_CREATE
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg == WM_QUERYENDSESSION ;最关键的就是这里
mov eax,FALSE
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
.endif
ret
WndProc endp
提醒一点:也许这个功能会有一点副作用,也保不准Windows不像城管们,
一样,万一“粗鲁了一下”,也许会使得你的程序强制关闭。最好在具体的应用
环境中饰演一下。
参考:
1.WM_QUERYENDSESSION Message
http://msdn2.microsoft.com/en-us/library/aa376890(VS.85).aspx
--------------------------------------------------------------------------------
欢迎访问AoGo汇编小站:http://www.aogosoft.com/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -