Hàm Windows API ExtTextOut:

Một phần của tài liệu Báo Cáo Luận Văn: Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên destop windows" doc (Trang 51 - 59)

II – Các hàm căn bản để kết xuất văn bản:

2-Hàm Windows API ExtTextOut:

- Tương tự hàm TextOut hàm này cũng sẽ vẽ một dịng văn bản đơn nhưng thêm một số chức năng tùy chọn sau: điều khiển chiều rộng ký tự, một vùng chữ nhật làm việc cắt xén, một vùng chữ nhật tơ đục. Tùy theo yêu cầu mà lựa chọn.

- Cú pháp: ExtTextOut ( HDC hdc, Int spx, Int spy, UINT fuOptions, CONST RECT* lpRect, LPCTSTR lpszString, Int cbString,

CONST INT* lpDxWidths ); - Thơng số:

hdc handle của DC

spx,spy tọa độ logic cho biết điểm điều khiển (control point) dùng canh vị trí khởi đi của dịng văn bản. Điểm điều khiển là một vị trí trong hệ tọa độ được định nghĩa trong DC. Với hệ tọa độ MM_TEXT thì đơn vị tính là pixel.

fuOptions cờ hiệu cho biết hàm sẽ sử dụng hình chữ nhật do ứng dụng cung cấp như thế nào, các giá trị cĩ thể là 0, ETO_CLIPPED,

ETO_OPAQUE hoặc kết hợp.

+ ETO_CLIPPED: dịng văn bản được xén vào hình chữ nhật được trỏ tới bởi lpRect.

+ ETO_APAQUE: màu nền hiện hành tơ đầy hình chữ nhật lpRect con trỏ chỉ cấu trúc RECT cho biết kích thước của hình chữ nhật

dùng clipping, opaquing hoặc cả hai tùy theo giá trị của nOptions. lpszString con trỏ chỉ tới chuỗi ký tự khơng cĩ ký tư kết thúc là ký tự rỗng.

cbString số ký tự trong chuỗi văn bản.

lpDxWidths con trỏ chỉ về bản dãy những trị cho biết khoảng cách các ký tự, nếu NULL thì dùng các giá trị cĩ sẵn.

- Hàm TextOut sử dụng khoảng cách giữa các ký tự mặc định của các font. ExtTextOut cho phép điều chỉnh độ rộng của từng ký tự được đặc tả trong mảng số nguyên .

- Giá trị trả về: hàm trả về khác 0 nếu thành cơng, ngược lại trả về 0.

3 – Thuộc tính kết xuất văn bản của DC:

Gồm cĩ 6 thuộc tính DC ảnh hưởng đến hình dáng và vị trí của văn bản khi kết xuất:

- Background Color: màu nền của văn bản

- Background Mode: cho ON/OFF màu nền

- Font: kiểu văn bản và kích thước văn bản

- Intercharacter Spacing: số pixel thêm vào giữa các ký tự để canh văn bản

- Text Alignment: mối quan hệ giữa văn bản với điểm xuất phát

- Text Color: màu chữ văn bản

Trong phạm vi đề tài chúng tơi chỉ quan tâm đến những đặc tính được định lượng bằng đơn vị pixel chứ khơng quan tâm đến các thuộc tính về màu sắc.

a) Hàm GetTextMetrics:

- Các thơng số trong cấu trúc dữ liệu TEXTMETRIC tức là tồn bộ các giá trị đo lường một font chữ vật lý. Muốn lấy được các giá trị này sử dụng hàm GetTextMetrics()

- Cú pháp:

BOOL GetTextMetrics(hdc, lptm)

HDC hdc;

TEXTMETRIC FAR* lptm;

- Lấy các giá trị font chữ vật lý của một DC, đặt vào cấu trúc TEXTMETRIC. - Thơng số:

hdc handle của DC (adsbygoogle = window.adsbygoogle || []).push({});

lptm trỏ tới cấu trúc TEXTMETRIC nhận các giá trị - Giá trị trả về: hàm trả về khác 0 nếu thành cơng, ngược lại trả về 0

Trong các giá trị được chứa trong cấu trúc TEXTMETRIC thì chúng tơi chỉ quan tâm tới thơng số tmAveCharWidth cĩ kiểu dữ liệu LONG, thơng số này là độ rộng trung bình tính bằng pixel của một ký tự của font chữ thường được đại diện bởi độ rộng của ký tự “x”.

Sau đây là cấu trúc TEXTMETRIC là cấu trúc chứa thơng tin căn bản về font vật lý. Tất cả kích thước được đưa ra trong các đơn vị logic tức là chúng phụ thuộc vào chế độ ánh xạ hiện hành của ngữ cảnh màn hình.

Cú pháp:

typedef struct tagTEXTMETRIC { int tmHeight; int tmAscent; int tmDescent; int tmInternalLeading; int tmExternalLeading; int tmAveCharWidth; int tmMaxCharWidth; int tmWeight; BYTE tmItalic; BYTE tmUnderlined; BYTE tmStruckOut; BYTE tmFirstChar; BYTE tmLastChar; BYTE tmDefaultChar; BYTE tmBreakChar; BYTE tmPitchAndFamily; BYTE tmCharSet; int tmOverhang; int tmDigitizedAspectX; int tmDigitizedAspectY; } TEXTMETRIC; - Thơng số:

int tmHeight Chiều cao tồn phần của cỡ chữ (= tmAscent + tmDescentmembers) int tmAscent Chiều cao phần trên đường cơ sở int tmDescent Chiều cao phần ở dưới đường cơ sở

int tmInternalLeading Chiều cao phần nhơ lên của cỡ chữ, ví dụ như dấu ^ của chữ ơ

int tmAveCharWidth Độ rộng trung bình của các ký tự trong font, với những font ANSI_CHARSET là độ rộng trung bình của tất cả các ký tự từ “a” đến “z”, với các tập ký tự khác là giá trị trung bình khơng trọng lượng của mọi ký tự ở trong font

int tmMaxCharWidth Độ rộng của ký tự rộng nhất trong font

int tmWeight Độ “nặng” (bão hịa) cỡ chữ, các giá trị cĩ thể là: FW_DONTCARE 0 FW_THIN 100 FW_EXTRALIGHT 200 FW_ULTRALIGHT 200 FW_LIGHT 300 FW_NORMAL 400 FW_REGULAR 400 FW_MEDIUM 500 FW_SEMIBOLD 600 FW_DEMIBOLD 600 FW_BOLD 700 FW_EXTRAB OLD 800 FW_ULTRABOLD 800 FW_BLACK 900 FW_HEAVY 900

BYTE tmItalic Khác 0 nếu chữ nghiêng BYTE tmUnderlined Khác 0 nếu chữ cĩ gạch dưới BYTE tmStruckOut Khác 0 nếu chữ bị gạch giữa thân BYTE tmFirstChar Ký tự đầu tiên của font

BYTE tmLastChar Ký tự cuối cùng của font BYTE tmDefaultChar Ký tự mặc định để thay thế

BYTE tmBreakChar Ký tự dùng để ngăn cách giữa các từ BYTE tmPitchAndFamily Kiểu và họ của font, 4 bit thấp là kiểu font

với các giá trị: TMPF_FIXED_PITCH TMPF_VECTOR TMPF_TRUETYPE TMPF_DEVICE FF_DECORATIVE FF_DONTCARE FF_MODERN FF_ROMAN FF_SCRIPT FF_SWISS

BYTE tmCharSet Tập ký tự của font, với các giá trị cĩ thể là: ANSI_CHARSET 0 DEFAULT_CHARSET 1 SYMBOL_CHARSET 2 SHIFTJIS_CHARSET 128 OEM_CHARSET 255

int tmOverhang Độ rộng thêm vào đối với những font đặc biệt int tmDigitizedAspectX Hướng ngang của thiết bị mà font được thiết kế int tmDigitizedAspectY Hướng theo chiều đứng của thiết bị mà font được

thiết kế

b) Hàm GetTextExtent:

- Kích thước của dịng văn bản (dimensions): tức là chiều cao và chiều rộng của dịng văn bản sử dụng font hiện hành. Cĩ nhiều hàm để lấy giá trị này nhưng chúng tơi dùng hàm GetTextExtent().

- Cú pháp:

DWORD GetTextExtent(hdc, lpszString, cbString) HDC hdc;

LPCSTR lpszString; int cbString;

- Tính kích thước của dịng văn bản (dimensions): tức là chiều cao và chiều rộng của dịng văn bản sử dụng font hiện hành. Khi tính kích thước thì hàm GetTextExtent() cũng tính luơn những khoảng trắng được thêm vào bởi hàm SetTextCharacterExtra().

- Thơng số:

hdc handle của DC lpszString Trỏ tới chuỗi văn bản cbString Số byte của chuỗi

- Giá trị trả về: Hàm trả về giá trị DWORD chứa kích thước cửa một dịng văn bản trong đĩ byte thấp chứa bề rộng của chuỗi và byte cao chứa chiều cao của chuỗi tính bằng đơn vị logic.

* Khung chữ nhật bao dịng text (bounded-rectangle): Là khung chữ nhật nhỏ nhất bao trọn hình ảnh dịng text bên trong, nĩ cĩ các cạnh tiếp xúc với các điểm ảnh xa nhất ở 4 hướng (trên, dưới, trái, phải). Bằng kết quả trả về từ

GetTextExtent, ta cĩ thể tính ra khung chữ nhật này dễ dàng. Khung chữ nhật này cĩ thể dùng để tính xem một điểm nào đĩ cĩ nằm trong dịng text khơng.

c) Hàm GetTextAlign:

- Thuộc tính canh văn bản (Text Alignment): cho phép ta thay đổi mối tương quan giữa điểm xuất phát tọa độ thường được chuyển cho hàm kết xuất văn bản (như các hàm TextOut() và ExtTextOut()) và đoạn văn bản phải kết xuất. GDI cho phép đặt các cờ hiệu canh văn bản bằng hàm SetTextAlign() và hàm GetTextAlign() để đi tìm trị của các cờ hiệu canh văn bản. (adsbygoogle = window.adsbygoogle || []).push({});

- Như vậy muốn xác định vị trí chính xác của một ký tự so với điểm xuất dịng văn bản thì ta nhất thiết phải tìm cho được những giá trị cờ hiệu được đặt bởi hàm SetTextAlign() bởi vì các hàm này quyết định việc canh dịng văn bản được xuất ra bởi các hàm kết xuất văn bản, để đáp ứng yêu cầu đĩ ta sử dụng hàm GetTextAlign(): - Cú pháp: UINT GetTextAlign(hdc) HDC hdc; - Thơng số: hdc handle của DC

- Giá trị trả về: hàm này trả về trạng thái các cờ canh văn bản, cĩ thể cĩ một hoặc nhiều cờ phối hợp với nhau. Cĩ 9 loại cờ canh văn bản mang các giá trị là:

TA_BASELINE y-coordinate đặt tại đường baseline.

TA_TOP y-coordinate đặt tại cạnh trên khung chữ nhật bao dịng text (bounded-rectangle) (default)

TA_BOTTOM y-coordinate đặt tại cạnh dưới khung chữ nhật bao dịng text (bounded-rectangle)

TA_LEFT x-coordinate đặt tại cạnh cạnh trái bounded-rectangle (default)

TA_CENTER x-coordinate đặt ngay giữa 2 cạnh bounded-rectangle TA_RIGHT x-coordinate đặt tại cạnh phải bounded-rectangle

TA_NOUPDATECP Dùng x; y-coordinate của TextOut; ExtTextOut để vẽ, khơng quang tâm đến CP (default)

TA_UPDATECP Khơng quan tâm x; y-coordinate, thay thế bởi toạ độ CP hiện tại, sau khi vẽ xong thì cập nhật CP.

* CP - current position: Mỗi DC định nghĩa một CP để dùng trong các trường hợp tọa độ khơng chỉ định rõ hoặc vẽ các đối tượng liên tiếp nhau. Ví dụ dùng CP và hàm LineTo để vẽ poly-line.

d) Hàm GetTextCharacterExtra:

- Thuộc tính Intercharacter Spacing: cho phép ta cộng thêm một số pixel vào giữa các ký tự của dịng văn bản, những pixel thêm vào này gọi là Extra pixel. Sử dụng hàm SetTextCharacter() được cung cấp bởi GDI để đặt khoảng cách giữa các ký tự. Như vậy muốn lấy khoảng cách này giữa các ký tự của dịng văn bản được xuất ra thì sử dụng hàm GetTextCharacterExtra().

- Cú pháp:

int GetTextCharacterExtra(hdc) HDC hdc;

- Giá trị trả về: Hàm trả về giá trị xác định số lượng khoảng trắng thêm vào giữa các ký tự nếu hàm thành cơng.

- Giá trị mặc định là 0.

4 - Tọa độ trong kết xuất văn bản:

Trong 5 hàm kết xuất văn bản: TextOut(), ExtTextOut(), TabbedTextOut(), DrawText() và GrayString() thì tọa độ để xuất dịng văn bản ra được tính bằng đơn vị logic. Trong khi đĩ một số hàm để lấy các đặc tính DC của các dịng văn bản được xuất đĩ lại được tính bằng nhiều đơn vị khác nhau, lúc thì tính bằng đơn vị logic, lúc thì lại được tính bằng các loại tọa độ thiết bị khác nhau. Ngồi ra, đơn vị tính của vị trí cursor mouse lại được tính bằng hệ toạ độ thiết bị tồn màn hình nên trong quá trình tính tốn chúng ta cần lưu ý để chuyển tất cả chúng về cùng một hệ tọa độ để phần tính tốn được chính xác.

a) Hàm GetDCOrg:

- Hàm GetDCOrg() lấy tọa độ origin dịch cuối cùng cho DC, hoặc nĩi cách khác là toạ độ (thiết bị) của gốc toạ độ logic của DC. Kết quả trả về dùng làm offset để chuyển tọa độ client thành tọa độ thiết bị của các điểm trong cửa sổ một ứng dụng. Origin dịch cuối cùng liên quan với origin vật lý của màn hình.

- Cú pháp:

DWORD GetDCOrg(hdc) HDC hdc;

- Thơng số hdc là handle của DC mà origin của nĩ được lấy.

- Giá trị trả về: Trả về giá trị trong đĩ word thấp chứa tọa độ x, word cao chứa tọa độ y của origin dịch cuối cùng trong tọa độ thiết bị.

b) Hàm PtInRect:

- Hàm PtInRect() xác định điểm cĩ nằm bên trong hình chữ nhật hay khơng. Chú ý rằng một điểm được coi là thuộc hình chữ nhật khi nĩ nằm ở trên cạnh trái, nằm ở trên cạnh trên hoặc nằm hồn tồn trong hình chữ nhật, ngược lại một điểm khơng thuộc hình chữ nhật khi nĩ nằm ở bên ngồi, nằm ở trên cạnh phải hoặc nằm ở trên cạnh dưới của hình chữ nhật.

- Cú pháp:

BOOL PtInRect(lprc, pt)

const RECT FAR* lprc; POINT pt;

- Thơng số: (adsbygoogle = window.adsbygoogle || []).push({});

lprc trỏ tới địa chỉ hình chữ nhật pt cấu trúc điểm

Chương 5:

P

Một phần của tài liệu Báo Cáo Luận Văn: Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên destop windows" doc (Trang 51 - 59)