2011-01-02 10 views
16

Điều này đã khiến tôi phát điên cả ngày.Nhận tên tập tin phông chữ dựa trên Tên phông chữ và Kiểu (Chữ đậm/nghiêng)

Tôi cần lấy tên tệp phông chữ (ví dụ: Arial.ttf) dựa trên tên của nó (Arial trong trường hợp này) và cho dù đó là chữ in đậm, in nghiêng hoặc cả hai. Sử dụng những mẩu thông tin đó, tôi cần tìm tệp phông chữ để tôi có thể sử dụng nó để hiển thị.

Một số chi tiết ví dụ:

  • Calibri, Bold sẽ giải quyết để calibrib.ttf.
  • Calibri, Nghiêng sẽ giải quyết thành calibrii.ttf.

Bất kỳ ý tưởng về làm thế nào tôi có thể đạt được điều này trong C++ (Win32)

+0

Nếu bạn có tay cầm HFONT của phông chữ, bạn có thể thử [đề xuất giải pháp] của tôi (http://stackoverflow.com/questions/16769758/get-a-font-filename-based-on-the-font- handle-hfont). Tôi không muốn thêm câu trả lời ở đây, bởi vì câu hỏi là không rõ ràng nếu bạn có một xử lý cho phông chữ hay không. –

Trả lời

10

Trước tiên, để kiến ​​thức của tôi, không có cách nào đáng tin cậy để làm điều đó.

API Windows giao dịch với họ phông chữ và ánh xạ, không phải với tệp phông chữ, được xử lý ở cấp thấp hơn. Cũng lưu ý rằng ngay cả khi bạn quản lý để có được tên tập tin của một phông chữ, không có chức năng dựng hình (mà tôi biết) sẽ chấp nhận nó, vì vậy bạn sẽ làm gì với nó?

Điều đó nói rằng, bạn có thể tìm trong khóa đăng ký HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts để lấy tên tệp của phông chữ từ tên lôgic của nó. Việc thực hiện giải pháp đó có thể được tìm thấy here.

+6

Tôi cần tên tệp phông chữ vì tôi đang sử dụng FreeType để hiển thị phông chữ và FreeType chỉ chấp nhận tên tệp. – Brad

+1

Ánh xạ đó không hoạt động khi hệ điều hành ở một ngôn ngữ khác. Tên bạn sẽ nhận được từ EnumFontFamiliesExW là ngôn ngữ hệ điều hành (ví dụ: 안상수 2006 굵은) trong khi tên đăng ký luôn bằng tiếng Anh (ví dụ: ahn2006-B (TrueType)). Microsoft dường như làm thêm các bước khi ánh xạ tên khuôn mặt cho tệp phông chữ thực tế. –

0

Một giải pháp là truy cập các tệp phông và trích xuất tên từ bảng tên để tạo tra cứu của riêng bạn (bản đồ STL sẽ là cách đơn giản để thực hiện điều đó). Có thể tìm thấy chi tiết về định dạng tệp TTF here.

+0

Đây là những gì tôi đã làm với Thư viện FreeType. Tôi đang lặp lại tất cả các tập tin phông chữ trong% WINDIR%/Fonts Sau đó, tôi có thể kiểm tra loại khuôn mặt của họ và thời tiết đậm/nghiêng hoặc cả hai. Vấn đề là, thư mục Fonts chứa các tệp mà FreeType gặp khó khăn khi đọc, điều này làm cho FreeType phát ra lỗi. – Brad

1

Bạn thường làm điều này bằng cách gọi CreateFontIndirect và sau đó nhận được hệ thống hiển thị. Có lẽ bạn có thể giải thích tại sao bạn không thể sử dụng phương pháp chuẩn này.

2

Điều này Code Project project thực hiện những gì bạn muốn. Như là nó không thành công trên Windows 7 vì chức năng GetWinVer dừng lại ở XP. Đó là tầm thường để thêm trường hợp cho Windows 7.

1

liên quan đến bài viết trước đó, đây có vẻ là một cách đáng tin cậy:

1) đọc đăng ký danh sách phông chữ Windows từ HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Fonts \ Bạn sẽ nhận được tên tệp và đường dẫn tệp thay thế tại đây. Tên phông chữ không hữu ích vì chúng có thể thay đổi bằng ngôn ngữ của người dùng.

2) Tải các tệp TrueType (.ttf, .ttc, .otf): Sử dụng FreeType https://www.freetype.org/). Chỉ cần khởi tạo thư viện freetype và nạp khuôn mặt với khuôn mặt FT_New_Face (thư viện, đường dẫn, 0, &).

3) Lấy phông chữ Tên gia đình bằng cách sử dụng FreeType. Sử dụng FT_Get_Sfnt_Name_Count() và FT_Get_Sfnt_Name() để lấy bảng chuỗi. Bạn sẽ cần phải kiểm tra xem mã hóa là Ansi, UTF16 hay khác, vì một số chuỗi sẽ có nhiều ngôn ngữ và mã hóa khác nhau.

4) Lấy thuộc tính TrueType OS2. Sử dụng (TT_OS2 *) FT_Get_Sfnt_Table (mặt, ft_sfnt_os2) để lấy cấu trúc OS2. Giải thích cấu trúc bằng cách sử dụng tài liệu như https://www.microsoft.com/typography/otspec/os2.htm#fc

5) Bây giờ bạn có đường dẫn tệp phông chữ, tên gia đình, thuộc tính kiểu và thông tin khác. Xây dựng danh sách các chức năng và chức năng này để tìm kiếm tệp dựa trên họ phông chữ và kiểu.