为什么TFontDialog提供的字体少于Screen.Fonts?

时间:2012-07-02 19:54:39

标签: windows delphi fonts wordpad

我想知道为什么TFontDialog提供的字体少于Screen.Fonts? (例如,Arial *字体,漫画字体等在TFontDialog中不显示)

TFontDialog给出的字体列表似乎与写字板相同,而Screen.Fonts给出的字体列表与Word基本相同。

非常感谢您的见解!

PS:   德尔福XE,   Windows 7

PS:相关的SO主题:

  1. Too many fonts when enumerating with EnumFontFamiliesEx function
  2. Finding System Fonts with Delphi
  3. How to use external fonts?
  4. PS:相关网页:

    1. TFontDialog to show all Fonts @ borland.newsgroups.archived
    2. TFontDialog to show all Fonts @ delphigroups
    3. sys app

      unit Unit2;
      
      interface
      
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls;
      
      type
        TForm2 = class(TForm)
          lst1: TListBox;
          dlgFont1: TFontDialog;
          Button1: TButton;
          procedure Button1Click(Sender: TObject);
          procedure FormCreate(Sender: TObject);
        private
          { Private declarations }
        public
          { Public declarations }
        end;
      
      var
        Form2: TForm2;
      
      implementation
      
      {$R *.dfm}
      
      procedure TForm2.FormCreate(Sender: TObject);
      begin
        lst1.Items.AddStrings(Screen.Fonts);
      end;
      
      procedure TForm2.Button1Click(Sender: TObject);
      begin
        dlgFont1.Device := fdBoth;
        if dlgFont1.Execute then
        begin
      
        end;
      end;
      
      end.    
      

2 个答案:

答案 0 :(得分:6)

Screen.Fonts返回所有已安装的字体,包括 Registry \ HKCU \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Font Management \ Inactive Fonts 中管理的隐藏字体。 (Source)显然,TFontDialog不显示这些隐藏字体。

此外,Screen.Fonts字体组合框中未提及TFontDialog中列出的某些字体,但会添加到字体样式组合框。以 Arial 为例:字体样式列出了10个项目,这些项目似乎是字体 Arial Arial Black 的组合Arial Narrow

答案 1 :(得分:2)

不同的API,不同的结果。 Screen.Fonts使用EnumFontFamiliesEx(),它返回所有已安装的字体。 TFontDialog使用ChooseFont()代替TFontDialog.Font,仅显示与TFontDialog.Options和{{1}}属性兼容的字体。