Xử lý văn bản và font chữ

23 551 0
Xử lý văn bản và  font chữ

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 124 Chương 5 XỬ VĂN BẢN FONT CHỮ 5.1. MỞ ðẦU Một trong các ñặc tính nổi bật nhất của Windows là giao diện giao tiếp với người dùng. Nhờ ñặc tính này, nhiều dạng dữ liệu thông tin khác nhau ñược máy tính hỗ trợ khi xuất ra màn hình, máy in, … Trong ñó, xuất văn bản ra vùng làm việc của các ứng dụng Win32 là hình thức phổ biến nhất trong giao diện ñồ họa. Ở các chương trước, các thao tác xuất thông tin chỉ ñược thực hiện thông qua các cửa sổ thông báo, hộp thoại các phần tử ñiều khiển. Chương này sẽ trình bày cách thể hiện nội dung văn bản trên vùng làm việc của cửa sổ thông qua các hàm Win32® API. Phần cuối chương sẽ trình bày cách khởi tạo, chọn xử các dạng font chữ khác nhau. Nhờ khả năng này, việc thể hiện các ñoạn văn bản sẽ trở nên sinh ñộng trực quan hơn. 5.2. XỬ VĂN BẢN Xử văn bản là công việc phổ biến nhất trong các thao tác ñồ họa. Chúng ñược sử dụng theo các ñịnh dạng cách thức khác nhau trong các ứng dụng xử tài liệu, bảng biểu, cơ sở dữ liệu hỗ trợ thiết kế bằng máy tính (CAD - Computer Aided Design). Tập hợp các hàm Win32® API xử văn bản ñược phân thành hai nhóm chính: Nhóm các hàm ñịnh dạng – chuẩn bị cho thao tác xuất dữ liệu, nhóm các hàm thực hiện thao tác hiển thị. Chúng ta sẽ bắt ñầu với việc tìm hiểu các hàm hiển thị. 5.2.1. Hiển thị văn bản ðể hiện thị nội dung văn bản trên các thiết bị xuất, dựa vào từng trường hợp thể hiện khác nhau, ta dùng các hàm Win32 API khác nhau. Các hàm này phụ thuộc vào font chữ, thuộc tính của thiết bị ngữ cảnh DC (Device Context ) khoảng cách ký tự thể hiện. Hàm phổ biến nhất thực hiện thao tác xuất một chuỗi ký tự văn bản, sử dụng font chữ, màu chữ màu nền hiện hành là : BOOL TextOut(HDC hDC, int nXStart, int nYStart, LPCTSTR lpString, int cbString); Hàm này thực hiện thao tác xuất chuỗi ký tự xác ñịnh bởi con trỏ lpString ra DC, với chiều dài ñược xác ñịnh bởi cbString (không phụ thuộc vào ký tự NULL ñánh dấu kết thúc chuỗi). Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 125 Hai trường nXStart nYStart là vị trí gốc của chuỗi hiển thị, xác ñịnh theo tọa ñộ logic của vùng làm việc cửa sổ, thường là ñiểm gốc trên bên trái của vùng hiển thị chuỗi. Chúng ta sẽ bàn kỹ hơn khi tìm hiểu về canh lề văn bản trong phần 5.2.2. Nếu thao tác xuất chuỗi thực hiện thành công, hàm trả về giá trị khác 0. Ngược lại, giá trị trả về bằng 0. Khi cần trình bày văn bản theo tuần tự từng cột, ta dùng hàm TabbedTextOut sau : LONG TabbedTextOut(HDC hDC, int nX, int nY, LPCTSTR lpString, int nCount, int nNumTabs, LPINT lpnTabStopPositions, int nTabOrigin); Nếu trong chuỗi ký tự có các ký tự tab (‘\t’ hoặc 0x09), hàm TabbedTextOut sẽ chuyển các ký tự tab vào dãy các vị trí "dừng" tương ứng. Số lượng các tab dừng ñược xác ñịnh bởi nNumTabs, lpnTabStopPositions là dãy vị trí các tab dừng theo ñơn vị tính pixels. Ví dụ, nếu ñộ rộng trung bình của mỗi ký tự là 8 pixels, mỗi tab dừng cần ñặt cách nhau 5 ký tự, dãy các tab dừng sẽ phải lần lượt có giá trị 40, 80, 120, … . Tuy nhiên, các giá trị này không nhất thiết phải là bội số của nhau. Nếu biến nNumTabs hoặc lpnTabStopPositions có giá trị là 0 NULL, các tab dừng ñược ñặt cách nhau từng 8 ký tự. Nếu nNumTabs bằng 1, lpnTabStopPositions trỏ ñến giá trị xác ñịnh một dãy tăng tuần hoàn là bội số của dãy này. Ví dụ, nếu nNumTabs bằng 1, lpnTabStopPositions bằng 30, ta sẽ có dãy tab dừng tại vị trí 30, 60, 90, … pixels. Trường nTabOrigin xác ñịnh tọa ñộ theo trục x của ñiểm bắt ñầu tính khoảng cách tới các tab. Giá trị này không nhất thiết phải là vị trí ñầu tiên của chuỗi, có thể chọn trùng hoặc không. Hàm trả về kích thước chuỗi hiển thị, theo ñơn vị logic, nếu thành công. Ngược lại, hàm trả về 0. Trong ñó, chiều cao chuỗi là WORD cao của biến kiểu LONG, chiều rộng là WORD thấp. Một hàm xuất văn bản khác tương tự hàm TextOut là hàm ExtTextOut : BOOL ExtTextOut(HDC hDC, int X, int Y, UINT fuOptions, CONST RECT *lprc, LPCTSTR lpString, UINT cbCount, CONST INT *lpDx); Biến lprc là một con trỏ ñến cấu trúc RECT, trong ñó nội dung văn bản hiển thị sẽ bị cắt vào vùng hình chữ nhật tương ứng nếu fuOptions ñược thiết lập là ETO_CLIPPED, hoặc là vùng nền hình chữ nhật sẽ ñược tô bởi màu nền nếu fuOptions là ETO_OPAQUE. Trường lpDx là một dãy số nguyên xác ñịnh khoảng cách giữa các ký tự liên tiếp trong chuỗi. Nó cho phép một chương trình tạo khoảng cách rộng hoặc hẹp giữa các ký tự, ñiều mà ñôi lúc cần thiết trong việc ñiều chỉnh các từ trong văn bản theo ñộ rộng cột. Giá trị lpDx có thể là NULL tương ứng với chế ñộ mặc ñịnh cho khoảng cách này. Tương tự hàm TextOut, hàm ExtTextOut trả về giá trị khác 0 nếu thành công. Ngược lại, giá trị trả về bằng 0. Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 126 Một hàm mức ở mức cao hơn ñể xuất văn bản là hàm DrawText : int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat); Cũng như các hàm xuất văn bản khác, hàm DrawText xuất chuỗi xác ñịnh bởi con trỏ lpString có ñộ dài nCount. Tuy nhiên, với chuỗi có ký tự kết thúc là NULL, nếu nCount bằng -1, hàm sẽ tự ñộng tính toán chiều dài của chuỗi. Biến lpRect trỏ ñến cấu trúc RECT của hình chữ nhật (theo toạ ñộ logic) mà trong ñó văn bản thể hiện theo ñịnh dạng ñược thiết lập trong uFormat. Nếu uFormat bằng 0, nội dung văn bản sẽ ñược hiển thị theo từng dòng từ trên xuống dưới. Mỗi dòng mới ñược xác ñịnh thông qua ký tự về ñầu dòng CR (carriage return, bằng ‘\r’ hoặc 0x0D) hoặc ký tự xuống dòng LF (linefeed, bằng ‘\n’ hoặc 0x0A) có trong văn bản. Phần văn bản bên ngoài hình chữ nhật lpRect sẽ bị cắt bỏ. Giá trị uFormat bằng 0 cũng chính là giá trị cờ canh lề trái (DT_LEFT). Ngoài ra, ta có thể thiết lập các cờ canh lề phải (DT_RIGHT), canh lề giữa (DT_CENTER) cho văn bản. ðể loại bỏ chức năng ñiều khiển của các ký tự CR LF, cần thêm vào cờ DT_SINGLELINE. Nếu thiết lập DT_SINGLELINE, ta cũng có thể chỉ ñịnh vị trí của dòng hiển thị ở phía trên (DT_TOP), phía dưới (DT_BOTTOM), hoặc ở chính giữa (DT_VCENTER) trong vùng hình chữ nhật. Trong trường hợp hiển thị nhiều dòng văn bản, Windows chỉ ngắt dòng khi gặp ký tự CR LF. ðể ngắt dòng dài hơn kích thước hình chữ nhật hiển thị, cần thiết lập cờ DT_WORDBREAK. Nếu không muốn Windows cắt bỏ các phần dư ra khi vẽ chữ vượt quá phạm vi khung chữ nhật, ta thêm cờ DT_NOCLIP. Nếu muốn ký tự tab (‘\t’ hoặc 0x09) ñược diễn dịch thành ký tự phân cột, cần thêm cờ DT_EXPANDTABS. Giá trị mặc ñịnh của tab là 8 khoảng trắng. Cờ DT_TABSTOP ñược dùng ñể ñặt lại giá trị tab. Trong trường hợp này, byte cao của word thấp (bits 15-8) của uFormat sẽ chứa giá trị tab cần thay thế. 5.2.2. ðịnh dạng văn bản Dựa vào ñặc trưng các thành phần hiển thị, các hàm ñịnh dạng văn bản phân làm ba nhóm liên quan ñến thuộc tính của DC, ñộ rộng ký tự kích thước chuỗi ký tự hiển thị. Việc thiết lập thuộc tính ñịnh dạng văn bản cho DC ñược thực hiện thông qua các hàm canh lề văn bản, thiết lập khoảng cách ký tự, xác ñịnh màu nền màu văn bản. Cùng với các hàm này, Windows cũng cung cấp các hàm cho biết thuộc tính hiện hành tương ứng cho DC. Trong các hàm về thuộc tính DC, biến ñầu tiên luôn là handle của DC hiện hành. Xét hàm thiết lập màu chữ màu nền : COLORREF SetTextColor(HDC hDC, COLOREF crColor); Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 127 COLORREF SetBkColor(HDC hDC, COLORREF crColor); Biến crColor xác ñịnh màu cần thiết lập. Nếu thành công, hàm trả về màu chữ (màu nền) trước khi ñược thiết lập. Nếu không, hàm trả về giá trị cờ CLR_INVALID. Ngoài ra, ñể xác ñịnh màu chữ màu nền hiện hành, ta dùng hai hàm sau : COLORREF GetTextColor(HDC hDC); COLORREF GetBkColor(HDC hDC); Nếu hàm thực hiện thành công, ta xác ñịnh ñược màu hiện hành. Nếu không, giá trị trả về là CLR_INVALID. Khi vẽ chữ, Windows sử dụng hai chế ñộ : chế ñộ trong suốt (TRANSPARENT) chế ñộ mờ (OPAQUE). Ở chế ñộ trong suốt, màu nền sẽ không ñược sử dụng ñến, chữ vẽ ra ñè lên nền hiện hành. Ở chế ñộ mờ, trước khi vẽ chữ, nền sẽ ñược xoá ñi với màu nền ñược thiết lập bởi hàm SetBkColor: int SetBkColor(HDC hDC, int iBkMode); Với iBkMode là chế ñộ nền TRANSPARENT hoặc OPAQUE (chế ñộ mặc ñịnh của Windows là OPAQUE). Nếu thành công, hàm trả về chế ñộ nền trước khi ñược thiết lập. Ngược lại, giá trị trả về là zero. ðể biết chế ñộ nền hiện tại, ta dùng hàm : int GetBkMode(HDC hDC); Hàm trả về giá trị TRANSPARENT hoặc OPAQUE, nếu thành công. Ngược lại, giá trị trả về là zero. ðể xác lập vị trí chuỗi văn bản hiển thị dựa trên ñiểm gốc nXStart, nYStart (xem phần 5.2.1) ta dùng hàm SetTextAlign : UINT SetTextAlign(HDC hDC, UINT fMode); Khi ñó, ñiểm gốc nXStart ở cạnh bên trái khung chữ nhật nếu fMode là TA_LEFT. Ký tự ñầu chuỗi sẽ hiển thị từ ñiểm gốc này. ðây cũng là giá trị mặc ñịnh của Windows. Nếu fMode bằng TA_RIGHT, vị trí chuỗi ñược tính từ bên phải, tức ký tự cuối chuỗi hiển thị tại ñiểm gốc, ngược lại cho ñến ký tự ñầu tiên. Nếu fMode bằng TA_CENTER, vị trí giữa chuỗi chính là ñiểm gốc. Tương tự, ñể thiết lập vị trí hiển thị chuỗi theo phương ñứng, các cờ TA_TOP, TA_BOTTOM, TA_BASELINE ñược dùng tương ứng ñiểm gốc nYStart ở trên, giữa dưới dòng văn bản hiển thị. ðối với Windows thì giá trị mặc ñịnh theo phương ñứng là TA_TOP. Nếu gọi hàm SetTextAlign với cờ TA_UPDATE, Windows sẽ không sử dụng ñiểm gốc nXStart, nYStart trong hàm xuất văn bản TextOut, thay vào ñó là vị trí ñược thiết lập trước ñó bởi hàm MoveToEx hoặc LineTo, hoặc một hàm thay ñổi vị trí khác. Cờ TA_UPDATE cũng cập nhật ñiểm gốc về ñầu chuỗi (nếu dùng TA_LEFT) về cuối chuỗi (nếu dùng TA_RIGHT) Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 128 cho lần gọi kế tiếp. ðiều này cần thiết cho việc hiển thị nhiều dòng văn bản với hàm TextOut. Nếu cờ TA_CENTER ñược thiết lập, vị trí của nXStart vẫn như cũ sau khi hàm TextOut ñược gọi. ðể biết chế ñộ canh lề văn bản hiện tại, ta dùng hàm : UINT GetTextAlign(HDC hDC); Nếu thành công, hàm trả về cờ tương ứng của canh lề văn bản hiện hành. Ngược lại, giá trị trả về là GDI_ERROR. Ví dụ sau ñây trình bày cách thức xác ñịnh các dạng canh lề theo phương ngang: switch ( (TA_LEFT | TA_RIGHT | TA_CENTER) & GetTextAlign(hDC) ) { case TA_LEFT: . . . case TA_RIGHT: . . . case TA_CENTER: . . . } Ví dụ tiếp theo sử dụng hàm SetTextAlign ñể cập nhật vị trí hiển thị hiện thời khi hàm TextOut ñược gọi. Trong ví dụ này, biến cArial là một số nguyên cho biết số font Arial. UINT uAlignPrev; char szCount[8]; Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 129 uAlignPrev = SetTextAlign(hdc, TA_UPDATECP); MoveToEx(hdc, 10, 50, (LPPOINT) NULL); TextOut(hdc, 0, 0, "Number of Arial fonts: ", 23); itoa(cArial, szCount, 10); TextOut(hdc, 0, 0, (LPSTR) szCount, strlen(szCount)); SetTextAlign(hdc, uAlignPrev); Một thuộc tính khác của DC ảnh hưởng ñến cách vẽ chuỗi là khoảng cách giữa các ký tự trong chuỗi hiển thị. Khoảng cách mặc ñịnh của Windows là 0, khi ñó các ký tự ñược hiển thị liên tiếp nhau. ðể thay ñổi khoảng cách giữa các ký tự, ta dùng hàm : int SetTextCharacterExtra(HDC hDC, int nCharExtra); Trong ñó, nCharExtra là khoảng cách theo ñơn vị logic thiết lập giữa các ký tự. Nếu thành công, hàm trả về khoảng cách trước khi ñược thiết lập. Ngược lại, giá trị trả về là 0x80000000. ðể biết khoảng cách hiện tại, ta dùng hàm : int GetTextCharacterExtra(HDC hDC); Nếu thành công, giá trị trả về cho biết khoảng cách hiện tại. Ngược lại, giá trị trả về là 0x80000000. Ngoài ra, Windows còn hỗ trợ các hàm cho biết ñộ rộng ký tự kích thước chuỗi hiển thị. ðây là các hàm cấp cao, sử dụng trong việc trình bày văn bản với các kiểu font khá phức tạp. Trong chương này, chúng ta chỉ ñề cập ñến một số hàm như GetTextMetrics (phần 5.3.2) GetTextExtentPoint32 (phần 5.3.5). 5.3. FONT 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ữ, cũng như cách sử dụng chúng ñể trình bày văn bản. 5.3.1. Khái niệm font trong Windows Một font chữ là một tập hợp các ký tự ký hiệu cùng dạng, thể hiện qua kiểu chữ, loại chữ kích cỡ chữ. Kiểu chữ xác ñịnh các ñặc trưng về ký tự ký hiệu trong font chữ, ví dụ ñộ rộng, nét chữ dày hoặc mảnh, có chân (có gạch ngang hoặc các nét cong mảnh ở ñầu các ký tự) hay không. Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 130 Loại chữ xác ñịnh ñộ ñậm nhạt (trọng lượng) ñộ nghiêng của dạng font thể hiện. Chia làm ba loại sau : roman, opaque, italic. Font roman là dạng font chữ có trọng lượng trung bình, thường dùng trong in ấn. Font opaque là dạng ñược biến ñổi ngiêng của font roman. Font italic là dạng font ñược thiết kế theo dạng nghiêng chuyên biệt. Kích thước font chữ ñược tính như là khoảng cách từ chặn dưới của một ký tự có chân ñến chặn trên của một ký tự hoa, ñược tính theo ñơn vị ñiểm (khoảng 0,013817 của 1 inch). Một tập các font với một số kích cỡ trọng lượng khác nhau nhưng cùng một kiểu loại ñược xem là một họ font chữ. Các font chữ trong Windows ñược chia thành hai nhóm, gọi là font GDI 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. Không như font GDI, khi in bằng font thiết bị, Windows không cần ñịnh dạng font, mà chỉ cần gởi nội dung dữ liệu trực tiếp ñến thiết bị. Người dùng chọn trực tiếp font từ máy in ñể 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, lợi ñiểm của font GDI là ñộc lập với thiết bị xuất, tuy nhiên tốc ñộ xử in chậm hơn. Các font GDI thông thường gồm có : font bitmap, font vector 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ỏ, khi phóng trông rất thô). 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 co giản hơn font bitmap, tuy nhiên ñược vẽ khá chậm ñườ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 máy in. Chúng ta sẽ khảo sát các hàm xử cho các font chữ dạng này trong phần 5.3.3. Còn bây giờ chúng ta tìm hiểu cách sử dụng các font có sẵn của hệ thống. 5.3.2. Sử dụng font ñịnh nghĩa sẵn Khi ta gọi các hàm vẽ chữ TextOut, TabbedTextOut, ExtTextOut hoặc DrawText, Windows sẽ sử dụng font chữ ñang ñược chọn trong DC ñể hiện thị nội dung văn bản. Ta có thể dùng một số font ñược Windows ñịnh nghĩa sẵn, thường gọi là font hệ thống (phân biệt các font do người dùng tạo trong quá trình xử văn bản – xem phần 5.3.3). Tên macro của các font này thể hiện trong bảng sau : MACRO FONT ANSI_FIXED_FONT Font với kích thước cố ñịnh của ký tự dựa trên Windows. Font Courier là một ví dụ ñiển hình của dạng font này. ANSI_VAR_FONT Font với ñộ rộng ký tự thay ñổi dựa trên các ký tự chuẩn của Windows. Font MS San Serif là một ví Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 131 dụ ñiển hình. DEVICE_DEFAULT_FONT Font với thiết bị ñã cho ñược chọn mặc nhiên. Dạng font này thường co sẵn trong hệ thống ñể ñiều khiển việc trình bày trên thiết bị. Tuy nhiên, ñối với một số thiết bị, font ñược cài ñặt ngay trên thiết bị. Ví dụ, ñối với máy in, các font thiết bị cài sẵn thực hiện thao tác in nhanh hơn so với việc load bitmap ảnh về từ máy tính. DEFAULT_GUI_FONT Font của giao diện ñồ họa ñược thiết lập mặc ñịnh. OEM_FIXED_FONT Font chữ cố ñịnh, dựa trên bộ ký tự OEM. Ví dụ, ñối với máy IBM®, font OEM dựa trên bộ ký tự IBM PC. SYSTEM_FONT Font hệ thống của Windows. ðược hệ ñiều hành dùng ñể trình bày các thành phần giao diện như thanh tiêu ñề, menu, nội dung văn bản trong các hộp thoại thông ñiệp. Các font hệ thống này luôn có sẵn khi cài hệ ñiều hành, trong khi các font khác cần phải cài thêm tùy theo ứng dụng sau này. SYSTEM_FIXED_FONT Font Windows ñược sử dụng như font hệ thống trong các phiên bản trước 3.0. Bảng 5.1 Macro các font ñịnh nghĩa sẵn. Việc chọn sử dụng font hệ thống trong Windows khá ñơn giản. ðể làm ñiều này, ñầu tiên chương trình tạo ra handle của font - kiểu biến HFONT, sau ñó chọn font dùng hàm GetStockObject. HGDIOBJ GetStockObject(int fnObject); Trong ñó, kiểu HGDIOBJ là HFONT, biến fnObject là một trong các macro ở bảng trên. Nếu thành công, hàm này trả về handle của font hệ thống hiện hành. Ngược lại, giá trị trả về là NULL. ðể thay ñổi font, ta gọi hàm SelectObject. HGDIOBJ SelectObject(HDC hDC, HGDIOBJ hGDIObj); Hoặc gọn hơn, ta có thể gọi : SelectObject(hDC.GetStockObject(fnObject)); Khi ñó, font hiện hành trong DC là font vừa ñược gọi. Hàm trả về macro font trước ñó. Nếu không thành công, lỗi trả về là GDI_ERROR. Thường khi gọi font ñịnh sẵn, nếu các font Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 132 không có sẵn, hệ thống sẽ trả về font hệ thống (SYSTEM_FONT). Lưu ý, chỉ nên dùng các font có sẵn nếu chế ñộ hiện thị của DC ứng dụng hiện thời là MM_TEXT. ðể xem các thuộc tính của font hệ thống, ví dụ kích thước của bộ font ñể tính toán vị trí khi xuất văn bản, ta dùng hàm GetTextMetrics. BOOL GetTextMetrics(HDC hDC, LPTEXTMETRIC lpTM); Biến lpTM là con trỏ ñến cấu trúc TEXTMETRIC mà nếu hàm thực hiện thành công (trả về giá trị nonzero) sẽ chứa các tham số của font. ðoạn chương trình sau minh họa việc chọn font ñịnh sẵn vào một DC, sau ñó viết một chuỗi ký tự sử dụng font này. HFONT hfnt, hOldFont; hfnt = GetStockObject(ANSI_VAR_FONT); if (hOldFont = SelectObject(hdc, hfnt)) { TextOut(hdc, 10, 50, "Sample ANSI_VAR_FONT text.", 26); SelectObject(hdc, hOldFont); } Tuy nhiên, font chữ hệ thống khá nghèo nàn, không ñáp ứng ñủ nhu cầu trình bày văn bản. Vì thế, Windows hỗ trợ các hàm sử dụng các font chữ tự tạo. Phần tiếp theo sẽ bàn kỹ hơn về các hàm xử các font này. 5.3.3. Sử dụng font tự tạo 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 chổi sơn logic, font logic là một ñối tượng trừu tượng, 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 quan 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. Tech24.vn NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH C TRÊN WINDOWS Trang 133 ðể 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 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 ñặc trưng của font thực ñể tính vị trí 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. 5.3.4. Cấu trúc LOGFONT TEXTMETRIC ðể tạo font logic, ta có thể gọi hàm CreateFont CreateFontIndirect. Hàm CreateFontIndirect nhận con trỏ cấu trúc LOGFONT. Hàm CreateFont có biến là 14 trường của 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; Tech24.vn [...]... PRINTER_FONTTYPE REGULAR_FONTTYPE Font ch nghiêng Giá tr này ñư c l p l i trong trư ng lfItalic c a c u trúc LOGFONT Font ch là font máy in Font ch bình thư ng Giá tr này ñư c l p l i trong trư ng lfWeight c a c u trúc LOGFONT, b ng FW_REGULAR SCREEN_FONTTYPE Font ch là font màn hình SIMULATED_FONTTYPE Font d a theo giao di n GUI B ng 5.4 Các macro xác ñ nh d ng font tr v Trư ng nSizeMin nSizeMax xác... i ch n font 4 Xét c u trúc CHOOSEFONT vn ð ch n font, ta có th s d ng h p tho i font ð u tiên, ng d ng kh i t o các giá tr trong c u trúc CHOOSEFONT, sau ñó g i hàm ChooseFont ñ hi n th h p tho i li t kê danh sách các font Sau khi ngư i dùng ch n m t font có s n ch n OK, hàm ChooseFont s kh i gán các giá tr tương ng vào c u trúc LOGFONT ng d ng có th g i hàm CreateFontIndirect ñ t o m t font logic... cf.nFontType = SCREEN_FONTTYPE; cf.nSizeMin = 0; cf.nSizeMax = 0; Trang 143 NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS // Hi n th h p tho i font ChooseFont(&cf); /* T o font logic d a trên các ch n l a c a ngư i dùng tr v handle c a font logic */ hfont = CreateFontIndirect(cf.lpLogFont); return (hfont); } 5.3.6 Ví d v hi n th văn b n b ng các font khác nhau Sau khi tìm hi u v vi c xu t n i dung văn. .. thư c CF_NOVECTORFONTS Hàm ChooseFont không cho phép ch n l a font vector CF_NOVERTFONTS H p tho i font ch li t kê các font vi t hư ng ngang CF_PRINTERFONTS H p tho i ch li t kê các font h tr máy in liên quan ñ n DC xác ñ nh qua handle hDC CF_SCALABLEONLY Ch ñ nh hàm ChooseFont ch cho phép ch n l a các font có th co giãn (font vector, TrueType, …) CF_SCREENFONTS H p tho i ch li t kê các font màn hình... hàm ChooseFont s s d ng d li u trong vùng ñ m ñ kh i t o combo box ki u font Khi ngư i dùng ñóng h p tho i, hàm ChooseFont chép chu i trong combo box ki u font vào vùng ñ m này vn Trư ng nFontType xác ñ nh d ng font tr v Có th k t h p các giá tr sau : BOLD_FONTTYPE Te ITALIC_FONTTYPE ch 2 4 Font ch ñ m Giá tr này ñư c l p l i trong trư ng lfWeight c a c u trúc LOGFONT, b ng FW_BOLD PRINTER_FONTTYPE... tr tr v b ng 0 Ví d sau minh h a vi c ch n font logic s d ng h p tho i font HFONT FAR PASCAL MyCreateFont( void ) { CHOOSEFONT cf; LOGFONT lf; HFONT hfont; vn // Kh i t o các trư ng trong c u trúc CHOOSEFONT ch 2 cf.hwndOwner = (HWND)NULL; Te cf.hDC = (HDC)NULL; cf.lpLogFont = &lf; 4 cf.lStructSize = sizeof(CHOOSEFONT); cf.iPointSize = 0; cf.Flags = CF_SCREENFONTS; cf.rgbColors = RGB(0,0,0); cf.lCustData... tho i Font Trư ng này có th k t h p các giá tr sau : CF_APPLY H p tho i có thêm button Apply Ta ph i cung c p hàm hook x thông ñi p WM_COMMAND cho button này CF_BOTH H p tho i li t kê danh sách các font máy in font màn hình Trư ng hDC s xác ñ nh DC liên quan ñ n máy in C này c n k t h p v i c CF_SCREENFONTS CF_PRINTERFONTS CF_TTONLY Xác ñ nh hàm ChooseFont ch qu n ch n l a trên font d... th có) c a font th c t so v i font yêu c u Trư ng lfClipPrecision xác ñ nh cách th c các ký t b c t b khi n m ngoài vùng clipping Trư ng lfQuality dùng cho font vector, xác ñ nh cách th c GDI ñ nh nghĩa ñ chính xác c a font logic so v i font v t Trư ng lfPitchAndFamily xác ñ nh h font ch Trư ng lfFaceName xác ñ nh tên ki u font Sau khi ñã ch n font cho DC, ta c n bi t các ñ c trưng c a font hi n... hàm ChooseFont ph i s d ng c u trúc LOGFONT qua trư ng lpLogFont ñ kh i t o h p tho i CF_LIMITSIZE Xác ñ nh hàm ChooseFont ch ch n font có kích thư c trong gi i h n t nSizeMin ñ n nSizeMax Te NGÔN NG CF_NOOEMFONTS Gi ng c CF_NOVECTORFONTS CF_NOFACESEL Khi s d ng c u trúc LOGFONT ñ kh i t o các control c a h p tho i, trong ñó combo box tên font không th hi n m t font nào ñang ñư c ch n c CF_NOSCRIPTSEL... ch a d li u ki u mà hàm ChooseFont dùng ñ kh i t o combo box Font Style Sau khi ngư i dùng ñóng h p tho i, hàm ChooseFont chép d li u ki u vào vùng ñ m CF_WYSIWYG Xác ñ nh hàm ChooseFont cho phép ch n l a các font có s n cho máy in màn hình N u c này ñư c thi t l p, c c CF_BOTH CF_SCALABLEONLY cũng c n ñư c thi t l p B ng 5.3 Các macro c Flags kh i t o h p tho i Font N u c CF_EFFECT ñư c thi . chọn và xử lý các dạng font chữ khác nhau. Nhờ khả năng này, việc thể hiện các ñoạn văn bản sẽ trở nên sinh ñộng và trực quan hơn. 5.2. XỬ LÝ VĂN BẢN Xử lý. thể hiện qua kiểu chữ, loại chữ và kích cỡ chữ. Kiểu chữ xác ñịnh các ñặc trưng về ký tự và ký hiệu trong font chữ, ví dụ ñộ rộng, nét chữ dày hoặc mảnh,

Ngày đăng: 02/10/2013, 20:20

Hình ảnh liên quan

Windows. Font Courier làm ột ví dụ ñiển hình của dạng font này.  - Xử lý văn bản và  font chữ

indows..

Font Courier làm ột ví dụ ñiển hình của dạng font này. Xem tại trang 7 của tài liệu.
dụ ñiển hình. - Xử lý văn bản và  font chữ

d.

ụ ñiển hình Xem tại trang 8 của tài liệu.
Bảng 5.2 Macro xác ñịnh ñộ ñậm nhạt lfWeight. - Xử lý văn bản và  font chữ

Bảng 5.2.

Macro xác ñịnh ñộ ñậm nhạt lfWeight Xem tại trang 13 của tài liệu.
CF_SCREENFONTS Hộp thoại chỉ liệt kê các font màn hình - Xử lý văn bản và  font chữ

p.

thoại chỉ liệt kê các font màn hình Xem tại trang 18 của tài liệu.
SCREEN_FONTTYPE Font chữ là font màn hình. - Xử lý văn bản và  font chữ

ont.

chữ là font màn hình Xem tại trang 19 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan