GDI+: Các khái niệm Font Family, Typeface, Font, Style và Graphics Unit

Tìm hiểu và phân biệt các khái niệm Font Family, Typeface, Font, Style, Graphics Unit trong GDI+. Các lớp tương ứng trong .Net thuộc namespace System.Drawing.

 Font Family, Typeface và Font

Đây là các khái niệm cơ bản nhưng lại dễ nhầm lẫn và không được phân biệt rõ ràng.

–       Font family là một nhóm font có cùng kiểu thiết kế, ví dụ “Time New Roman”, “Arial”

–       Typeface là một thể hiện của font family. Điểm khác biệt là typeface bao gồm cả style như regular, bold, italic,… Vi dụ như Arial Bold.

–       Font là mức chi tiết nhất, là một thể hiện của typeface và bao gồm thêm kích thước font. Vi dụ Arial Bold size 12.

Các khái niệm này làm ta liên tưởng đến mô hình thừa kế trong OOP, ta có thể coi font family là lớp cha của typeface và typeface là cha của font. Hoặc cũng có thể coi font là một object thể hiện của hai class typeface và font family.

Sơ đồ dưới đây không biểu diễn mối quan hệ thực sự của 3 khái niệm này, nó chỉ nhằm minh họa cho liên tưởng của tôi.

Trong 3 khái niệm trên thì typeface không có lớp tương ứng trong .Net (GDI+).

Ví dụ sau ta tạo một FontFamily có tên Arial trong hệ thống, sau đó tạo một đối tượng Font có size 12 từ FontFamily này:

FontFamily family = new FontFamily(“Arial”);

Font font = new Font(family, 12);

Thay vì tạo một đối tượng FontFamily, bạn có thể tạo trực tiếp Font từ tên của font family:

Font font = new Font(“Arial”, 12);

Font Style

FontStyle trong .Net là một enumeration bao gồm 5 giá trị:

Regular Normal text.
Bold Bold text.
Italic Italic text.
Underline Underlined text.
Strikeout Text with a line through the middle.

Không phải font family nào cũng hỗ trợ đầy đủ các font style trên. Ví dụ như font Magneto  chỉ hỗ trợ 2 style là Bold và Bold Italic (Oblique). Vì vậy phải cẩn thận kiểm tra xem font family có hỗ trợ style mà bạn cần hay không trước khi sử dụng, thông qua phương thức FontFamily. IsStyleAvailable(FontStyle):

FontFamily family = new FontFamily(“Magneto”);

bool b = family.IsStyleAvailable(FontStyle.Regular);

// b = false

Enum FontStyle được đánh dấu bởi [FlagAttribute], vì vậy bạn có thể kết hợp các giá trị lại bằng toán tử bitwise OR “|”. Ví dụ sau tạo ra một font Arial có các style là Bold, Italic và Underline:

Font font = new Font(“Arial”, 12,FontStyle.Bold | FontStyle.Italic | FontStyle.Underline);

Graphics Unit

Thuộc tính Unit của Font chỉ ra đơn vị đo lường dùng để hiển thị. Các giá trị của thuộc tính này được liệt kê trong enum GraphiscUnit. Đơn vị mặc định được sử dụng cho Font là Point:

Member name

Description

World Specifies the world coordinate system unit as the unit of measure.
Display Specifies the unit of measure of the display device. Typically pixels for video displays, and 1/100 inch for printers.
Pixel Specifies a device pixel as the unit of measure.
Point Specifies a printer’s point (1/72 inch) as the unit of measure.
Inch Specifies the inch as the unit of measure.
Document Specifies the document unit (1/300 inch) as the unit of measure.
Millimeter Specifies the millimeter as the unit of measure.

Bạn không thể sử dụng GraphiscUnit.Display làm đơn vị để vẽ font, có thể do phụ thuộc vào thiết bị xuất, khác nhau về kích thước khi xuất trên màn hình (1/75 inch) và máy in (1/100 inch). Tôi cũng chưa thấy MSDN đề cập rõ ràng về phần này.

Ví dụ sau vẽ các đoạn text với cùng font Arial với size 36 lên màn hình, theo các loại đơn vị khác nhau:

protected override void OnPaint(PaintEventArgs e)
{
    FontFamily family = new FontFamily("Arial");
    int size = 36;

    Font font = new Font(family, size, GraphicsUnit.World);
    e.Graphics.DrawString("World", font, Brushes.Red, 10, 10);
    font = new Font(family, size, GraphicsUnit.Pixel);
    e.Graphics.DrawString("Pixel", font, Brushes.Red, 10, 40);
    font = new Font(family, size, GraphicsUnit.Point);
    e.Graphics.DrawString("Point", font, Brushes.Red, 10, 70);
    font = new Font(family, size, GraphicsUnit.Inch);
    e.Graphics.DrawString("Inch", font, Brushes.Red, 10, 100);
    font = new Font(family, size, GraphicsUnit.Document);
    e.Graphics.DrawString("Document", font, Brushes.Red, 10, 130);
    font = new Font(family, size, GraphicsUnit.Millimeter);
    e.Graphics.DrawString("Millimeter", font, Brushes.Red, 10, 160);
    base.OnPaint(e);
}

Sự khác biệt về kích thước giữa các kiểu đơn vị như bạn có thể thấy sau:

https://yinyangit.wordpress.com

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s