GDI+: Liệt kê các font được cài đặt trong hệ thống

Bạn có thể lấy các font được cài đặt trong hệ thống rất đơn giản bằng cách tạo một thể hiện của lớp InstalledFontCollection. Sau đó lấy về các Font Family qua thuộc tính Familes của đối tượng này. Trong bài này tôi sẽ vẽ ra màn hình các font lên một control dạng ListBox.

Sau khi lấy được danh sách font, tôi tạo ra một control thừa kế từ Panel, thêm vào đó một control VScrollBar. Dựa vào thuộc tính Value của VScrollbar, tôi sẽ lấy được vị trí các font cần phải vẽ lên màn hình. Tương tự như chế độ VirualMode của ListView, control này chỉ vẽ các font có thể nhìn thấy được theo giới hạn kích thước của nó.

Bằng cách cho các lệnh vẽ vào phương thức override OnPain(), cửa sổ sẽ tự động hiển thị và cập nhật khi cần thiết. Bạn cũng cần chú ý kiểm tra style của font trước khi sử dụng để vẽ ra màn hình bằng phương thức FontFamily.IsStyleAvailable().Ví dụ sau chỉ in ra các font family có hỗ trợ style Regular.
Bạn hãy tạo môt class mới cho đoạn mã sau, biên dịch để VS hiển thị control mới lên ToolBox và sử dụng nó như một control thông thường:

using System;
using System.Drawing;
using System.Drawing.Text;
using System.Runtime.CompilerServices;
using System.Windows.Forms;

namespace Win1
{

	public class FontViewer:Panel
	{
		FontFamily [] _familes;
		VScrollBar _vScrollBar;

		public int ItemHeight {get;set;}

		public FontViewer()
		{

			_familes = new InstalledFontCollection().Families;

			_vScrollBar=new VScrollBar();
			_vScrollBar.Maximum=_familes.Length;
			_vScrollBar.ValueChanged+=(sender,e)=>
			{
				this.Invalidate();
			};

			this.Resize+=(sender,e)=>
			{
				_vScrollBar.Height=this.Height;
				_vScrollBar.Left=this.Right-_vScrollBar.Width-1;
			};

			this.Controls.Add(_vScrollBar);

			this.BackColor=Color.White;
			if (ItemHeight <= 0)
				ItemHeight = 14;

			this.DoubleBuffered = true;
		}

		protected override void OnPaint(PaintEventArgs e)
		{
			int count=0;
			int index=count+_vScrollBar.Value;

			int visibleItems = this.Height / this.ItemHeight;

			while(count<visibleItems)
			{
				if(index>=_familes.Length)
					return;
				FontFamily family=_familes[index];
				if (family.IsStyleAvailable(FontStyle.Regular))
				{
					Font font = new Font(family.Name, 10);
					e.Graphics.DrawString (family.Name, font,
					                       Brushes.Black,10,count*this.ItemHeight);
					font.Dispose();
					count++;
				}
				index++;
			}
			base.OnPaint(e);
		}	}
}
Advertisements

2 thoughts on “GDI+: Liệt kê các font được cài đặt trong hệ thống

  1. Theo mình thì dùng cái này hơi bất tiện vì control này đơn thuần giống như 1 dạng “ảnh”. Trường hợp nếu người dùng muốn phát triển thêm tính năng, vd khi click vào chọn 1 font nào đó thì có lẽ control này ko khả thi.
    Bạn áp dụng với ListBox hoặc ComboBox mình nghĩ sẽ tốt hơn.

    Phản hồi
  2. Bạn nhận xét rất đúng, khi viết ví dụ trên thì mình cũng cân nhắc điều này. Bởi vì bài viết trình bày về GDI+ nên phải giảm bớt những tính năng khác để ví dụ được đơn giản và cô đọng. Như bạn thấy qua ví dụ trên thì người đọc có thể vận dụng GDI+ để giải quyết hai vấn đề là: lấy các font được cài đặt trong máy và tạo một control scrollable “ảo”.

    Việc sử dụng phương pháp này để tạo một control có chức năng giống listbox hoặc combobox là điều hoàn toàn có thể và không có quá phức tạp.

    Phản hồi

Trả lờ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 Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s