Tải bản đầy đủ (.doc) (10 trang)

Changing Colours of a dialog

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (177.18 KB, 10 trang )

Benina’s TutASM # 2: Changing Colours of a Dialog – Ver 1.0
Author: Benina
Benina’ s Tut ASM # 2
Changing Colours of a Dialog
Author: Benina
Tut này tôi sẽ cùng bạn khám phá cách thay đổi màu sắc giao diện của một chương trình dùng
Dialog làm cửa sổ chính.
Đây là Demo hòan khi hòan tất tut này:
Các bạn có thể download Source theo link:
2.rar
A. Lý thuyết:
Windows gởi các thông điệp rất đa dạng liên quan đến màu sắc đến thủ tục dialog của bạn, và bằng
cách xử lý các thông điệp này bạn có thể thay đổi màu sắc nào mà bạn muốn hiển thị.Cho ví dụ, để
thay đổi màu sắc của chính dialog box, bạn có thể xử lý thông điệp WM_CTLCOLORDLG, để
thay đổi màu sắc cho điều khiển static control , thì bạn xử lý thông điệp
WM_CTLCOLORSTATIC và vân vân.
Sau đây tôi xin liệt kê một số thông điệp liên quan, bạn tra cứu Win32 API Reference để biết thêm
chi tiết :
WM_CTLCOLORDLG, WM_CTLCOLOREDIT, WM_CTLCOLORLISTBOX,
WM_CTLCOLORMSGBOX, WM_CTLCOLORSCROLLBAR, WM_CTLCOLORSTATIC,
WM_CTLCOLORBTN
Trước tiên bạn cài đặt một Brush dùng để paint nền background và chứa nó trong 1 biến để dùng
sau này. Thông điệp WM_CTLCOLORDLG và các thông điệp liên quan thường được gọi trong
suốt chương trình của bạn , và nếu bạn cài đặt một brush mới mỗi lần thông điệp được send thì
Trang 1/10
Benina’s TutASM # 2: Changing Colours of a Dialog – Ver 1.0
Author: Benina
cuối cùng bạn sẽ truy cập RAM rất nhiều với các brush die cũng nhiều vô số kể. Vì vậy với cách
cài đặt 1 brush lưu nó trong 1 biến, bạn sẽ dễ dàng điều khiển hơn, và chúng ta có thể xóa nó khi
dialog bị hủy và khi chúng ta đã biết chúng ta ko dùng nó nữa.
Hàm cài đặt 1 brush là hàm sau và lưu nó vào 1 biến:


(Các bạn tập tham khảo các hàm API bằng tiếng Anh cho quen, vì chắc chắn rất tiện lợi cho bạn
sau này)
The CreateSolidBrush function creates a logical brush that has the specified solid color.
HBRUSH CreateSolidBrush(
COLORREF crColor // brush color value
);

Parameters
crColor
Specifies the color of the brush.

Return Values
If the function succeeds, the return value identifies a logical brush.
If the function fails, the return value is NULL.
Remarks
A solid brush is a bitmap that Windows uses to paint the interiors of filled shapes.
After an application creates a brush by calling CreateSolidBrush, it can select that brush into any
device context by calling the SelectObject function.
Trong phần xử lý thông điệp WM_CTLCOLORDLG ta cho giá trị trả về là brush mà ta đã cài
đặt.
Trong phần xử lý các thông điệp liên quan như WM_CTLCOLORSTATIC vân vân, ta co thể
dùng SetBkMode, SetBkColor, SetTextColor để thay đổi màu sắc của control mà thông điệp
chịu trách nhiệm.Các hàm này có ý nghĩa sau:
Chức năng của hàm SetBkMode là set một kiểu pha trộn bkground của DC ta chỉ định. Kiểu pha
trộn Bkground (background mix mode) được sử dụng với texts, hatched brushes và các lọai pen ko
phải để vẽ line “đặc” (solid). Nó tác dụng đến các lọai line vẽ- sử dụng một pen bởi hàm cài đặt là
CreatePen . SetBkMode ko gây ảnh hưởng đến lines sử dụng hàm cài đặt ExtCreatePen.
Chức năng của hàm SetBkColor là set một bkground color hiện hành hay là màu tự nhiên gần
nhất nếu device ko miêu tả giá trị màu được chỉ định. Hàm này lắp các kẻ hở giữa các lines vẽ
được định mẫu sử dụng hàm CreatePen để cài đặt.

Hàm SetTextColor có chức năng set màu text .
Trang 2/10
Benina’s TutASM # 2: Changing Colours of a Dialog – Ver 1.0
Author: Benina
Các bạn có thể tham khảo các hàm này trong phần phụ lục của tut.
-Và cuối cùng khi thóat chương trình chúng ta đừng quên free brush của chúng ta đã cài đặt ra khỏi
memory bằng hàm DeleteObject
B. Thực hành:
Trong MASM ta thực hiện theo các bước sau:
Các bạn hãy thực hiện tiếp tục project mà ta đã làm ở tutorial “Benina’ Tut # 1”.
Hảy Open project Keygen1 trong Tut#1.
1. Bước 1:
Trước tiên ta include thư viện để sử dụng các hàm API đồ họa trong file Keygen1.Inc:
include gdi32.inc
includelib gdi32.lib
Kế đến khai báo các biến và hằng color trong file Keygen1.Inc:
Trong section .CONST khai báo hằng số màu color
; ------------------------------------------------------------------------------
; Colors
; ------------------------------------------------------------------------------
CR_BACKGROUND equ 00333300h
CR_TEXT equ 00CCCC99h
Trong section .DATA ?
Khai báo biến lưu Brush cài đặt
hBgColor HBRUSH ?
2. Bước 2 :
Trong file Keygen1.Asm , phần section .CODE trước lời gọi hàm DialogBoxParam ta add lệnh
sau để cài đặt Brush:
INVOKE CreateSolidBrush, CR_BACKGROUND
mov hBgColor, eax

Sau đó trong vòng lặp xử lý thông điệp ta add các lệnh:
Trang 3/10
Benina’s TutASM # 2: Changing Colours of a Dialog – Ver 1.0
Author: Benina
.ELSEIF uMsg == WM_CTLCOLORDLG
mov eax, hBgColor
ret
.ELSEIF uMsg == WM_CTLCOLORSTATIC

INVOKE SetBkMode, wParam, TRANSPARENT
INVOKE SetTextColor, wParam, CR_TEXT
Invoke SetBkColor,wParam,CR_BACKGROUND
mov eax, hBgColor
ret
.ELSEIF uMsg == WM_CTLCOLOREDIT
INVOKE SetBkMode, wParam, TRANSPARENT
INVOKE SetTextColor, wParam, CR_TEXT
Invoke SetBkColor,wParam,CR_BACKGROUND
mov eax, hBgColor
ret
Giải thích đôi chút:

-Ta biết thông điệp trả về giá trị trong eax, nên ta có các lệnh

mov eax, hBgColor
ret
-Chú ý dòng lệnh Set Background Mode (hàm SetBkMode) tham số thứ 2 là TRANSPARENT .
Nếu ko có dòng này thì Bkground sẽ được fill với brush mà bạn chỉ định , nhưng khi control vẽ
text nó sẽ vẽ đè lên với default background color. Vì vậy nếu ta setting với TRANSPARENT thì sẽ
fix được vấn đề này.

-Thay đổi màu của các control khác cũng tương tự. Bạn tìm các thông điệp có dạng sau :
WM_CTLCOLOR* message trong Win32 reference để tham khảo thêm. Chú ý rằng, một edit
control sẽ gởi thông điệp WM_CTLCOLORSTATIC nếu nó chỉ đọc (read only) và nếu khác thì nó
sẽ send thông điệp WM_CTLCOLOREDIT.
-Nếu bạn có nhiều hơn một static control hay nhiều các control khác mà bạn muốn thay đổi màu
sắc của chúng khác nhau cho từng control, bạn cần check ID của control từ thông điệp ta đang xử
lý và thay đổi màu dựa trên ID đó. Bạn đã chuyển Hwnd của controls trong lParam, và bạn có thể
lấy ID của control bằng cách dùng hàm GetDlgCtlrID(). Chú ý rằng static control được cho bởi ID
mặc định của IDC_STATIC (-1) bởi resource editor, vì vậy nếu bạn muốn có thể nói với chúng
phần bạn sẽ cần chỉ định chúng Ids mới. Phần này các bạn tự tìm hiểu và viết code nhé.
3. Bước 3:
Cuối cùng chúng ta cần free Object Brush ra khỏi bộ nhớ. Trước lệnh ExitProcess và sau lệnh
DialogBoxParam trong file Keygen1.Asm ta add thêm lệnh:
Trang 4/10
Benina’s TutASM # 2: Changing Colours of a Dialog – Ver 1.0
Author: Benina
INVOKE DeleteObject, hBgColor
Đây là hình ảnh sau khi thực hiện trong file Keygen1.Inc
Đây là hình ảnh sau khi thực hiện trong file Keygen.Asm
Trang 5/10

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×