• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C# Font GdiCharSet)

C#のFontクラスのGdiCharSetプロパティについて

このQ&Aのポイント
  • C#のFontクラスのGdiCharSetプロパティは、文字セットを指定するためのプロパティです。
  • このプロパティは、特定の文字セットを指定することで、フォントの表示や処理を制御することができます。
  • しかし、msdnに記載されている値を変更しても、変化が見受けられないことがあります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

まず,結論としては,「何にも使われていない」です。 以下,技術資料として。 元はWin32のGDIでHFONTハンドルを作成するときに利用するLOGFONT構造体 https://msdn.microsoft.com/en-us/library/dd145037(v=vs.85).aspx のlfCharsetメンバに指定する値で (CreateFontの場合は該当する引数),「どの文字集合のフォントを使うか」を決める物です。 lfCharsetは,フォントの選択において,一番重要な値とされています。 https://msdn.microsoft.com/en-us/library/ms969909.aspx 上記の文書はWindows 3.1の時代のものですが,GDIの動作としては現在も変化していないと思います。 例えば「日本語を表示したい」場合にはSHIFTJIS_CHARSETを指定することになります。 そして,lfFaceNameで使いたいフォントを指定するわけですが,この場合にそのフォントが指定された文字集合をサポートしていない場合, 別のフォントが利用されます (e.g. lfFontFaceにSymbolを指定しても,SHIFTJIS_CHARSETを持っていないので別のフォントが使われる)。 これは,「その文字を表示する」ことを最優先にするための処理になります。 ただ,lfCharsetとして通常はDEFAULT_CHARSETが使われ,この場合は実質的にこの項目は無視されます。 さて,ここまではWindows GDIでの話ですが,.NETのSystem.Drawing.Fontにおいて,この値は単純に保存されるだけの値になります。 Fontのコンストラクタには引数にByteをとるものがあり,上記のような目的で使えそうに思えますが, 実際に動作を調べるとそのようなことは起こらず,MSが提供しているソースコードを見ると,gdiCharSetメンバの値は単に保持されるだけのようです。 http://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/Font.cs,4c2776f1dce62161 つまり,.NET Frameworkにおいて,このGdiCharSetプロパティは意味をなしていません。 これは利用しているGDI+関数の制限による物で, https://msdn.microsoft.com/en-us/library/ms533978(v=vs.85).aspx から https://msdn.microsoft.com/en-us/library/ms536207(v=vs.85).aspx をたどると,gdiCharSetを渡す余地がありません。 GdipCreateFontではなく,GdipCreateFontFromLogfontWを使っていれば,LOGFONTを経由して渡すことは出来ていたのですが,今更変更されることもないと思います。

okwaveid_1
質問者

お礼

ご回答ありがとうございます。 お礼が遅くなり、申し訳ございません。 (きちんと理解してからと思っていたら時間ばかりが過ぎてしまい…) リンクのソースを見て、GdiCharsetがメンバに保持されているだけなのが分かりました。 また、NativeFont生成にGdipCreateFontを利用していて、それにはGdiCharsetの渡す余地がないことが分かりました。 (現状は、ToLogFontのためだけにいる感じなんですね。残念ながら私ではLOGFONT構造体を作りたいケースが思いつきませんが) 「.NET内部では何も使われていない」ということがわかり、大変助かりました。 (PropertyGridにFontを表示するとGdiCharsetも表示され、これ必要なの?と問われた時に答えられませんでしたので、これで答えられます。) ありがとうございました!

関連するQ&A

専門家に質問してみよう