用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
执行后,窗口会从左边滑出来:


j1.JPG (10566 字节)



  关闭时,窗口会变淡直到消失。

参考:
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
下一篇>>>