これ何て呼びますか Part2

掲題の通り、C#のFontクラスが持つGdiCharSetプロパティについてですが、
これは一体どういったときに使われるものなのでしょうか?

msdnに記載されている値を入れれば何か変わるかと思いましたが、
変化は見受けられませんでした。
https://msdn.microsoft.com/ja-jp/library/system. …

かなり情けない話ですが、この疑問に対するアプローチの仕方すらよくわからず、
闇雲に調べてみてはいるのですが、全然分かりません…
大変お手数ですが、お詳しい方、ご教授をお願いいたします。

A 回答 (1件)

まず,結論としては,「何にも使われていない」です。




以下,技術資料として。

元はWin32のGDIでHFONTハンドルを作成するときに利用するLOGFONT構造体
https://msdn.microsoft.com/en-us/library/dd14503 …
のlfCharsetメンバに指定する値で (CreateFontの場合は該当する引数),「どの文字集合のフォントを使うか」を決める物です。

lfCharsetは,フォントの選択において,一番重要な値とされています。
https://msdn.microsoft.com/en-us/library/ms96990 …
上記の文書は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.Dra …
つまり,.NET Frameworkにおいて,このGdiCharSetプロパティは意味をなしていません。
これは利用しているGDI+関数の制限による物で,
https://msdn.microsoft.com/en-us/library/ms53397 …
から
https://msdn.microsoft.com/en-us/library/ms53620 …
をたどると,gdiCharSetを渡す余地がありません。
GdipCreateFontではなく,GdipCreateFontFromLogfontWを使っていれば,LOGFONTを経由して渡すことは出来ていたのですが,今更変更されることもないと思います。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
お礼が遅くなり、申し訳ございません。
(きちんと理解してからと思っていたら時間ばかりが過ぎてしまい…)

リンクのソースを見て、GdiCharsetがメンバに保持されているだけなのが分かりました。
また、NativeFont生成にGdipCreateFontを利用していて、それにはGdiCharsetの渡す余地がないことが分かりました。
(現状は、ToLogFontのためだけにいる感じなんですね。残念ながら私ではLOGFONT構造体を作りたいケースが思いつきませんが)

「.NET内部では何も使われていない」ということがわかり、大変助かりました。
(PropertyGridにFontを表示するとGdiCharsetも表示され、これ必要なの?と問われた時に答えられませんでしたので、これで答えられます。)

ありがとうございました!

お礼日時:2015/01/23 10:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報