Vclでは、システムのフォント一覧は以下のように簡単に取れた。
1 |
ComboBox1->Items->Assign( Screen->Fonts ); |
Firemonkeyでは、同様の手段は提供されてない模様。
が、PCに限れば、プリンタから取得するという手段があるようだ。
1 2 3 |
#include <Fmx.Printer.hpp> ComboBox1->Items->Assign( Printer::Printer()->Fonts ); |
MacOSでも同様に可能という情報もあるが(海外の掲示板)私は未確認。
なお、FireMonkeyでもシステムのデフォルトフォントを取得する手段は提供されている。
1 2 3 4 5 6 7 |
String DefaultFontName; if( TPlatformServices::Current->SupportsPlatformService( __uuidof( IFMXSystemFontService ) ) ) { _di_IFMXSystemFontService Service = TPlatformServices::Current->GetPlatformService( __uuidof( IFMXSystemFontService ) ); DefaultFontName = Service->GetDefaultFontFamilyName(); } |
Windowsの場合、Vclと同様、フォント一覧に縦書き用(先頭に@)も取得してしまう。
縦書き用を排除したフォント一覧をFormのComboBoxに設定し、さらにデフォルトフォントを選択した状態にするのは以下のような感じだろうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <Fmx.Printer.hpp> #include <memory> __fastcall TFormMain::TFormMain(TComponent* Owner) : TForm(Owner) { // デフォルトのフォントを取得 String DefaultFontName; if( TPlatformServices::Current->SupportsPlatformService( __uuidof( IFMXSystemFontService ) ) ) { _di_IFMXSystemFontService Service = TPlatformServices::Current->GetPlatformService( __uuidof( IFMXSystemFontService ) ); DefaultFontName = Service->GetDefaultFontFamilyName(); } // プリンタからフォント一覧を取得 std::shared_ptr<TStringList> FontList( new TStringList ); FontList->Assign( Printer::Printer()->Fonts ); // "@"付きを削除 for( int i = 0; i < FontList->Count; ++i ) { if( FontList->Strings[i].Pos( L"@" ) == 1 ) { FontList->Delete( i-- ); } } // ComboBoxにセット ComboBoxFont->Items->Assign( FontList.get() ); // デフォルトのフォントを選択状態にする if( !DefaultFontName.IsEmpty() ) ComboBoxFont->ItemIndex = ComboBoxFont->Items->IndexOf( DefaultFontName ); else if( ComboBoxFont->Items->Count ) ComboBoxFont->ItemIndex = 0; } |
C++Builder10.2.3 / Windows10(64bit)で確認。