Trao đổi với tôi

http://www.buidao.com

12/18/09

[MASM] Benina’s TutASM # 4: Fading Effects

Dowload source: Keygen4

Tranz by Benina

Bài viết này tôi trích dịch trong lọat tut Win32_Assembler_Coding_for_Crackers_by_Goppit_v11

Để keygen có hiệu ứng “fade in”(hiện dần) và “fade out” (tắt dần) khi opening và closing, chúng ta có 2 procedures được gọi là FadeIn và FadeOut. Đối với các hàm này chúng ta sẽ cần 2 prototypes, một biến DWORD ko được khởi trị đầu "Transparency" và các hằng số sau đây mà chúng ta phải định nghĩa khi mà chúng ko có trong windows.inc file: LWA_ALPHA, LWA_COLORKEY, WS_EX_LAYERED and DELAY_VALUE.

Vậy ta cần khai báo trong file inc:

FadeIn proto :DWORD

FadeOut proto :DWORD

.data?

Transparency dd ?

.const

DELAY_VALUE equ 10

Để sử dụng đặc tính trong suốt (transparency features) của win2k hay XP (có nghĩa là ko có tác dụng trong các version cũ của windows), chúng ta phải sử dụng cửa sổ được xếp lớp (layered window). Điều này có thể cải tiến đáng kể sự biểu diễn và hiệu ứng trực quan cho window mà chúng có hình dạng phức tạp, hình dạng động hay muốn sử dụng các hiệu ứng alpha blending effects. Hệ thống system sẽ tạo ra một cách tự động và vẽ lại các layered windows (cửa sổ xếp lớp) và các cửa sổ windows of các ứng dụng nằm dưới. Khi cho ra kết quả , các layered windows được lát một cách êm ả, mà ko có đặc trưng chập chờn của complex window regions. Thêm vào đó, layered windows có thể mờ một cách riêng rẽ, đó là alpha-blended (được pha trộn). Để tạo ra một layered window, window phải đựoc cài đặt hay set với lọai WS_EX_LAYERED extended windows style.

Đầu tiên chúng ta thêm các chỉ thị sau đây trong phần xử lý thông địêp WM_INITDIALOG:

.if eax==WM_INITDIALOG

;---------------------------------------

invoke GetWindowLong,hWin,GWL_EXSTYLE

or eax,WS_EX_LAYERED

invoke SetWindowLong,hWin,GWL_EXSTYLE,eax

;---------------------------------

;Set Icon

;---------------------------------

invoke LoadIcon,hInstance,500

mov hIcon,eax

invoke SendMessage,hWin,WM_SETICON,NULL,hIcon

INVOKE mfmPlay,pData

invoke FadeIn,hWin

;==========================================================

Hàm GetWindowLong API nhận thông tin về một window. Lọai thông tin cần lấy của window được chỉ định bởi tham số thứ 2 – trong case của chúng ta là GWL_EXSTYLE, yêu cầu lọai extended windows style cho cửa sổ window và hàm này trả về giá trị trong eax. Dòng kế tiếp là adds giá trị được biểu diễn bởi WS_EX_LAYERED vào eax. Dòng thứ ba set giá trị này như extended windows style cho window.

The FadeIn procedure looks like this:

clip_image001

FadeIn proc hWnd:HWND

invoke ShowWindow,hWnd,SW_SHOW

mov Transparency,75

@@:

invoke SetLayeredWindowAttributes,hWnd,0,Transparency,LWA_ALPHA

invoke Sleep,DELAY_VALUE

add Transparency,5

cmp Transparency,255

jne @b

ret

FadeIn endp

Hàm SetLayeredWindowAttributes API sets the opacity (mờ đục) và transparency colour key of a layered window. Trong trường hợp này tham số cuối cùng chỉ định một transparency (alpha blend) setting, và tham số thứ hai là 0 chỉ định completely transparent (trong suốt hòan tòan). Dòng đầu tiên trong thủ tục là hiển thị window trong một định dạng non-activated format và dòng kế tiếp moves một giá trị 75 vào trong biến transparency variable của chúng ta.

Trong vòng lặp kế tiếp của các chỉ thị là gia tăng transparency thêm 5 và sets window transparency với giá trị mới cho mỗi vòng lặp đến khi transparency là 255 (maximum value = opaque). Sleep cho phép một delay nhỏ giữa mỗi loop do đó fade ko thấy xuất hiện quá nhanh chóng . Khi transparency = 255 thì procedure returns.

FadeOut procedure tương tự và họat động ngược lại:

clip_image002

FadeOut proc hWnd:HWND

mov Transparency,255

@@:

invoke SetLayeredWindowAttributes,hWnd,0,Transparency,LWA_ALPHA

invoke Sleep,DELAY_VALUE

sub Transparency,5

cmp Transparency,0

jne @b

ret

FadeOut endp

Ta thêm hàm FadeOut vào :

.if eax==IDC_BTN2

INVOKE mfmPlay,0

invoke FadeOut,hWin

invoke EndDialog,hWin,0

.elseif eax==WM_CLOSE

INVOKE mfmPlay,0

invoke FadeOut,hWin

invoke EndDialog,hWin,0

Lời bình cho thủ tục fade procedure này:

Hàm fade-in function của chúng ta được gọi tương ứng với WM_INITDIALOG message được gởi đến dialogbox bởi OS. Code đặt ở đây được thực thi trước khi dialog được hiển thị trên màn hình. Kết quả ở đây là một một blank (trống) dialog hiện dần trước khi bitmap background và controls hiện ra trong khi hàm fade-out function does not suffer this problem. Một cách giải quyết khác (rất đơn giản) có thể sử dụng AnimateWindow API để làm alpha-blending. Dòng sau đây sẽ theo thông điệp WM_INITDIALOG message:

invoke AnimateWindow,hWin,1000,AW_BLEND+AW_ACTIVATE

Và dòng sau đây theo WM_CLOSE message trước khi calling EndDialog:

invoke AnimateWindow,hWin,1000,AW_BLEND+AW_HIDE

Tuy nhiên trong trường họp của chúng ta, mặc dù nó cho ra improved fade-in effect, các transparent buttons ko được xử lý tốt và được vẽ như là visible in the foreground.

Benina (5/2009)