2008-10-22 42 views
13

Tôi tự hỏi nếu có bất kỳ cách đơn giản nào để có được một danh sách tất cả các phông chữ cố định chiều rộng (đơn cách) được cài đặt trên hệ thống của người dùng trong C#?Làm cách nào để có được tất cả các phông chữ có chiều rộng cố định được cài đặt?

Tôi đang sử dụng .net 3.5 để có quyền truy cập vào không gian tên WPF System.Windows.Media và LINQ để nhận thông tin phông chữ, nhưng tôi không chắc chắn những gì tôi đang tìm kiếm.

Tôi muốn có thể cung cấp danh sách lọc các phông chữ đơn cách và/hoặc chọn phông chữ đơn cách từ danh sách phông chữ lớn hơn (như được thấy trong hộp thoại tùy chọn VS).

Trả lời

11

Có một cái nhìn tại địa chỉ:

http://www.pinvoke.net/default.aspx/Structures/LOGFONT.html

Sử dụng một trong các cấu trúc trong đó, sau đó vòng qua gia đình, instantiating một Font, và nhận được giá trị LogFont và kiểm tra lfPitchAndFamily.

Các mã sau đây được viết một cách nhanh chóng và chưa được kiểm tra, nhưng một cái gì đó như sau nên làm việc:

foreach (FontFamily ff in System.Drawing.FontFamily.Families) 
{ 
    if (ff.IsStyleAvailable(FontStyle.Regular)) 
    { 
     Font font = new Font(ff, 10); 
     LOGFONT lf = new LOGFONT(); 
     font.ToLogFont(lf); 
     if (lf.lfPitchAndFamily^1) 
     { 
      do stuff here...... 
     } 
    } 
} 
+0

'lfPitchAndFamily' doesn 't làm việc (luôn luôn bằng không) và '(lf.lfPitchAndFamily^1)' cho một lỗi ('CS0029: Không thể chuyển đổi ngầm' int 'thành' bool'') – Doc

5

AFAIK bạn không thể thực hiện việc này bằng thư viện BCL. Bạn phải sử dụng WinAPI interop.

Bạn cần phải phân tích 2 bit thấp nhất là LOGFONT .lfPitchAndFamily thành viên. Có một FIXED_PITCH không đổi (có nghĩa là phông chữ có chiều rộng cố định) có thể được sử dụng như một mặt nạ bit cho lfPitchAndFamily.

Dưới đây là một bài viết hữu ích:

phông chữ Tiến hành thống kê có thể là một chút khó hiểu, và trừ khi bạn muốn liệt kê tất cả các phông chữ trên hệ thống của bạn, có thể khó khăn hơn một chút hơn MSDN đề xuất. Bài viết này sẽ giải thích chính xác các bước bạn cần để sử dụng để tìm mọi phông chữ có chiều rộng cố định trên hệ thống của bạn và cũng liệt kê mọi kích thước có thể là cho mỗi phông chữ riêng lẻ.

6

Thật không may ToLogFont chức năng không điền lfPitchAndFamily lĩnh vực để sửa giá trị. Trong trường hợp của tôi nó luôn luôn 0.

Một xấp xỉ để phát hiện mà phông chữ có thể được cố định là sau

foreach (FontFamily ff in FontFamily.Families) { 
      if (ff.IsStyleAvailable(FontStyle.Regular)) { 
       float diff; 
       using (Font font = new Font(ff, 16)) { 
        diff = TextRenderer.MeasureText("WWW", font).Width - TextRenderer.MeasureText("...", font).Width; 
       } 
       if (Math.Abs(diff) < float.Epsilon * 2) { 
        Debug.WriteLine(ff.ToString()); 
       } 
      } 

     } 

Hãy ghi nhớ rằng họ rất nhiều dương tính giả, ví dụ Wingdings

+0

0 là một giá trị" đúng ". Nó có nghĩa là 'DEFAULT_PITCH'. –

+0

Cách quá _hacky_ và dễ bị sai tích cực (như bạn đã đề cập) :( – Doc

Các vấn đề liên quan