Tải bản đầy đủ (.pdf) (8 trang)

Tài liệu Tìm hiểu các thuộc tính của chữ pdf

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 (494.66 KB, 8 trang )

Iczelion’s Tutorial Win32 ASM Tutorial 5 : More about Text
Tìm hiểu các thuộc tính của chữ

Trong Windows, khi trình bày văn bản, các ký tự được thể hiện theo nhiều dạng
khác nhau. Đây là một trong những đặc trưng cơ bản của giao diện đồ họa - người dùng
(GUI – Graphical User Interface). Để thực hiện điều này, Windows hỗ trợ nhiều dạng
font chữ khác nhau. Trong phần này, chúng ta tìm hiểu các vấn đề chính về các font chữ,
màu sắc cũng như cách sử dụng chúng để trình bày văn bản.

Tìm hiểu về hệ thống màu

Hệ thống màu của Windows có được xây dựng dựa trên hệ thống màu RGB
(R=Red, G=Green, B=Blue) – hiểu nôm na là mỗi màu có được bằng cách trộn 3 màu cơ
bản là Red (đỏ), Green (xanh lá cây), Blue (xanh lam). Nếu bạn muốn sử dụng một màu
trên Windows, bạn phải cho biết giá trị của 3 thành phần màu R, G, B nói trên. Mỗi thành
phần màu tương ứng với một số từ 0 đến giá trị lớn nhất (tùy theo số bit cho mỗi điểm
ảnh), thông thường từ từ 0 đến 255 (giá trị 1 byte).



Ví dụ, nếu bạn muốn có m
àu đỏ “thuần túy” thì bạn phải chỉ định giá trị của R,G, B lần
lượt là 255,0,0 (R=255, G=0, và B=0). Hay nếu bạn muốn có màu trắng “thuần túy” thì
giá trị lần lượt là 255,255,255. Như vậy, để có được màu mà bạn cần thì rất khó khăn với
hệ thống như vậy, trừ khi bạn phải biết được giá trị của 3 thông số màu tương ứng trong
mỗi màu để. Đối với màu chữ và màu nền, bạn dùng hà
m SetTextColor và SetBkColor,
cả hai đều sử dụng một handle của DC và một giá trị màu 32-bit RGB. Hệ thống 32-bit
giá trị RGB được định nghĩa như sau:
RGB_value struct
unused db 0


blue db ?
green db ?
red db ?
RGB_value ends
Người dịch: Benina (REA TEAM) Trang 1
Tổng hợp và hiệu chỉnh: NhatPhuongLe (VNCERT TEAM)
Iczelion’s Tutorial Win32 ASM Tutorial 5 : More about Text
Chú ý, byte đầu tiên không được dùng và nó sẽ bằng zero. Thứ tự của 3 byte màu còn lại
R, G, B bị đảo ngược lại thành Blue, Green, Red. Tuy nhiên bạn sẽ không dùng cấu trúc
này vì khó khăn trong việc khởi tạo giá trị ban đầu cho các thành phần màu và sử dụng
chúng. Thay vì vậy, chúng ta sẽ tạo một macro. Marco này nhận 3 tham số: Red, Green
và Blue. Nó sẽ tạo một giá trị 32-bit RGB theo yêu cầu và nạp nó vào thanh ghi EAX.
Macro được định nghĩa như sau:
RGB macro red,green,blue
xor eax,eax
mov ah,blue
shl eax,8
mov ah,green
mov al,red
endm
Bạn có thể đặt macro này vào trong file include để dùng sau này.

Tìm hiểu về font
Font chữ trong Windows được chia thành hai nhóm, gọi là font GDI và font thiết bị. Font GDI được lưu
trữ dưới dạng tập tin trên đĩa, trong khi font thiết bị được thiết kế sẵn trong thiết bị xuất tương ứng, ví dụ
máy in. Đối với font GDI, Windows chuyển văn bản thành ảnh bitmap sau đó chuyển đến máy in để in.
Như vậy, ưu điểm của font GDI là độc lập với thiết bị xuất, tuy nhiên tốc độ xử lý in chậm hơn.
Các font GDI thôn
g thường gồm có: font bitmap, font vector và font TrueType.
 Font bitmap được cấu thành từ ma trận pixel, có lợi điểm là hiển thị nhanh, nhưng hạn chế trong

việc thể hiện với các kích thước khác nhau (do chỉ phóng to, thu nhỏ, và khi phóng sẽ bị bể ảnh).

Font vector thể hiện các ký tự như là tập hợp các nét vẽ (sử dụng các hàm GDI), do đó linh động
và co giản hơn font bitmap, tuy nhiên được vẽ khá chậm và đường nét cũng không được mềm mại
cho lắm.

 Font TrueType là dạng font được sử dụng phổ biến nhất hiện nay, được lưu trữ dưới dạng một
tập các điểm ảnh, kết hợp một số thuật toán biến đổi. Do đó thể hiện sắc xảo các đường nét trên
màn hình và máy in. Chúng ta sẽ khảo sát các hàm xử lý cho các font chữ dạng này.
Những lý thuyết về font ở phần trên, bạn không cần nhớ. Tóm lại, để tạo font (font logic),
bạn gọi hàm CreateFont hay CreatFontIndirect. Hàm CreateFontIndirect nhận con
trỏ cấu trúc LOGFONT. Xét định nghĩa của cấu trúc LOGFONT :

typedef struct tagLOGFONT // lf
{
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;

Người dịch: Benina (REA TEAM) Trang 2
Tổng hợp và hiệu chỉnh: NhatPhuongLe (VNCERT TEAM)
Iczelion’s Tutorial Win32 ASM Tutorial 5 : More about Text
Hàm CreateFontIndirect linh hoạt hơn, đặc biệt là nếu các chương trình của bạn cần
thay đổi font thường xuyên. Tuy nhiên, trong ví dụ của chúng ta , chúng ta “tạo” font chữ
bằng cách dùng hàm CreateFont. Sau lời gọi hàm, nó sẽ trả về một handle của font mà
bạn muốn chọn để hiển thị trong DC. Sau đó, các hàm API có chức năng xuất chữ ra màn
hình (TextOut, TabbedTextOut, ExtTextOut hoặc DrawText) sẽ sử dụng font mà
chúng ta đã chọn trong DC.
Font logic là một đối tượng GDI có handle kiểu HFONT. Một font logic là một mô tả của một font chữ
thực tế. Tương tự như viết vẽ logic và chổi sơn logic, font logic là một đối tượng trừu tượng, và trở thành
font thực tế trong DC khi ứng dụng gọi hàm SelectObject.
Đầu tiên, ta cần định nghĩa các trường trong cấu trúc LOGFONT theo một trong hai cách sau :
 Thiết lập các trường trong cấu trúc LOGFONT dựa trên các đặc tính của font bạn q
uan tâm.
Trong trường hợp này, khi gọi hàm SelectObject, Windows sẽ sử dụng một thuật toán "ánh xạ
font" để chọn một font tương thích nhất hiện có trên thiết bị.
 Chọn font trong hộp thoại Font, hàm ChooseFont sẽ khởi gán các giá trị trong cấu trúc
LOGFONT theo thuộc tính font được chọn.
Để sử dụng font này trong các thao tác xuất văn bản, trước hết ứng dụng cần khởi tạo font logic, rồi
chuyển cho DC. Việc tạo font
logic được thực hiện bằng cách gọi hàm CreateFont hoặc hàm
CreateFontIndirect. Tuy nhiên, hàm CreateFont ít được sử dụng hơn do hàm cần gởi các biến trong cấu
trúc LOGFONT, trong khi hàm CreateFontIndirect chỉ cần biến con trỏ LOGFONT. Cả hai hàm đều
trả về handle của font logic HFONT.
Trước khi ứng dụng có thể xuất văn bản, font logic cần được ánh xạ tương ứng với một font vật lý trong
thiết bị xuất, hoặc font nạp vào hệ điều hành. Tiến trình nà
y được thực hiện khi ứng dụng gọi hàm
SelectObject. Khi đó, ta có thể dùng hàm GetTextMetrics (hoặc các hàm tương đương) xác định kích
thước và đặc trưng của font thực để tính vị trí và xuất văn bản ra thiết bị xuất.

Sau khi dùng font, ta cần loại bỏ font dùng hàm DeleteObject. Chú ý không được xoá font trong DC đang
thực thi, hoặc font hệ thống.
.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
RGB macro red,green,blue
xor eax,eax
mov ah,blue
shl eax,8
mov ah,green
mov al,red
endm
.data

ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
TestString db "Win32 assembly is great and easy!",0
FontName db "script",0
Người dịch: Benina (REA TEAM) Trang 3
Tổng hợp và hiệu chỉnh: NhatPhuongLe (VNCERT TEAM)
Iczelion’s Tutorial Win32 ASM Tutorial 5 : More about Text
.data?


hInstance HINSTANCE ?
CommandLine LPSTR ?
.code

start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc
hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax

invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL hfont:HFONT
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\


OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
DEFAULT_QUALITY,DEFAULT_PITCH or
FF_SCRIPT,\
ADDR FontName
invoke SelectObject, hdc, eax
Người dịch: Benina (REA TEAM) Trang 4
Tổng hợp và hiệu chỉnh: NhatPhuongLe (VNCERT TEAM)
Iczelion’s Tutorial Win32 ASM Tutorial 5 : More about Text
mov hfont,eax
RGB 200,200,50
invoke SetTextColor,hdc,eax
RGB 0,0,255
invoke SetBkColor,hdc,eax
invoke TextOut,hdc,0,0,ADDR TestString,SIZEOF TestString
invoke SelectObject,hdc, hfont
invoke EndPaint,hWnd, ADDR ps
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
Phân tích mã lệnh

invoke CreateFont,24,16,0,0,400,0,0,0,OEM_CHARSET,\
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,\
DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\
ADDR FontName


Hàm CreatFont tạo ra một font logic, mà các tham số đầu vào của hàm này tương ứng với
các trường của cấu trúc LOGFONT (lfHeight – nHeight; lfWidth – nWidth) cũng như các
font hiện có. Hàm này có nhiều tham số hơn bất cứ hàm nào khác trong Windows. Nó trả
về một handle của font logic, dùng cho hàm SelectObject. Sau đây, là chi tiết các tham số
của nó:

CreateFont proto nHeight:DWORD,\
nWidth:DWORD,\
nEscapement:DWORD,\
nOrientation:DWORD,\
nWeight:DWORD,\
cItalic:DWORD,\
cUnderline:DWORD,\
cStrikeOut:DWORD,\
cCharSet:DWORD,\
cOutputPrecision:DWORD,\
cClipPrecision:DWORD,\
cQuality:DWORD,\
cPitchAndFamily:DWORD,\
lpFacename:DWORD

nHeight: cho biết chiều cao của phông chữ, tính theo đơn vị logic. 0 là kích thước mặc
định.

nWidth: Chiều rộng trung bình các ký tự trong phông chữ, tính theo đơn vị logic. Nếu
thông số này bằng 0, thì tỷ lệ chiều rộng, cao của thiết bị xuất sẽ trùng khớp với tỷ lệ
chiều rộng, cao của các phông chữ có sẵn. Tuy nhiên trong ví dụ này, tôi set nWidth
bằng 16 để cho dễ nhìn so với chiều rộng mặc định (=0)


nEscapement: cho biết góc
độ (tính theo đơn vị 0.1 độ hay 1/10 độ) của mỗi hàng văn
bản được kết xuất, giữa escapement vector và trục x của màn hình. Escapement vector là
đường kẻ từ ký tự đầu tiên và ký tự cuối cùng trên cùng một dùng. Còn góc độ sẽ được
tính theo ngược chiều kim đồng hồ của trục x. Thông thường, set là 0. Set là 900 tức là tất
Người dịch: Benina (REA TEAM) Trang 5
Tổng hợp và hiệu chỉnh: NhatPhuongLe (VNCERT TEAM)

×