The SetBkColor function sets the current background color to the specified color value, or to the nearest physical color if the device cannot represent the specified color value.. COLOR[r]
(1)Benina’ s Tut ASM # 2 Changing Colours of a Dialog Author: Benina
Tut này 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 hòan tất tut này:
Các bạn có thể download Source theo link: http://h1.ripway.com/benina/files/Keygen2.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 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
(2)điệp được send thì 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 brush lưu nó biến, bạn sẽ dễ dàng điều khiển hơn, và chúng ta có thể xóa nó dialog bị hủy và chúng ta đã biết chúng ta ko dùng nó nữa
Hàm cài đặt brush là hàm sau và lưu nó vào 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 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 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
(3)Chức 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 set màu text
Các bạn có thể tham khảo các hàm này phần phụ lục của tut
-Và cuối cùng thóat chương trình chúng ta đừng quên free brush của chúng ta đã cài đặt 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 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 file Keygen1.Inc:
include gdi32.inc includelib gdi32.lib
Kế đến khai báo các biến và hằng color 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 :
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:
(4)Sau đó vòng lặp xử lý thông điệp ta add các lệnh: .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ị 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ứ là TRANSPARENT Nếu ko có dòng này thì Bkground sẽ được fill với brush mà bạn chỉ định , 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 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
(5)3 Bước 3:
Cuối cùng chúng ta cần free Object Brush khỏi bộ nhớ Trước lệnh ExitProcess và sau lệnh DialogBoxParam file Keygen1.Asm ta add thêm lệnh:
INVOKE DeleteObject, hBgColor
Đây là hình ảnh sau thực hiện file Keygen1.Inc
(6)(7)Sau thực hiện xong ta Hit nút “GO” xem sau nhé OK rồi chứ!
C.Phụ lục:
Tham khảo các hàm API: 1 SetBkMode :
The SetBkMode function sets the background mix mode of the specified device context The background mix mode is used with text, hatched brushes, and pen styles that are not solid lines
int SetBkMode(
HDC hdc, // handle of device context
int iBkMode // flag specifying background mode );
(8)hdc
Identifies the device context iBkMode
Specifies the background mode This parameter can be either of the following values: Value Description
OPAQUE Background is filled with the current background color before the text, hatched brush, or pen is drawn.
TRANSPARENT Background remains untouched.
Return Values
If the function succeeds, the return value specifies the previous background mode. If the function fails, the return value is zero
Remarks
The SetBkMode function affects the line styles for lines drawn using a pen created by the CreatePen function SetBkMode does not affect lines drawn using a pen created by the ExtCreatePen function
The iBkMode parameter can also be set to driver-specific values GDI passes such values to the device driver and otherwise ignores them.
2 SetBkColor
The SetBkColor function sets the current background color to the specified color value, or to the nearest physical color if the device cannot represent the specified color value
COLORREF SetBkColor(
HDC hdc, // handle of device context COLORREF crColor // background color value );
(9)Identifies the device context crColor
Specifies the new background color
Return Values
If the function succeeds, the return value specifies the previous background color as a COLORREF value
If the function fails, the return value is CLR_INVALID Remarks
This function fills the gaps between styled lines drawn using a pen created by the CreatePen function; it does not fill the gaps between styled lines drawn using a pen created by the
ExtCreatePen function
If the background mode is OPAQUE, the background color is used to fill gaps between styled lines, gaps between hatched lines in brushes, and character cells The background color is also used when converting bitmaps from color to monochrome and vice versa.
3 SetTextColor:
The SetTextColor function sets the text color for the specified device context to the specified color
COLORREF SetTextColor(
HDC hdc, // handle of device context COLORREF crColor // text color
);
Parameters hdc
Identifies the device context crColor
(10)Return Values
If the function succeeds, the return value is a color reference for the previous text color. If the function fails, the return value is CLR_INVALID To get extended error information, call GetLastError
Remarks
The text color is used to draw the face of each character written by the TextOut and ExtTextOut functions The text color is also used in converting bitmaps from color to monochrome and vice versa.
Hy vọng các bạn hài lòng Các bạn cần nghiên cứu thêm để Template của ta ngày càng đẹp Các bạn có thể download Source theo link:
http://h1.ripway.com/benina/files/Keygen2.rar
Benina 27/12/2005 Update 27/12/2005 Mail: info@123doc.org