?? 用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 + -