TCanvas.Font.NameをUnicode文字列で指定したいです。
ShiftJISに変換不可能なUnicodeのフォント名です。
ダイアログは使わずにプログラム内から任意のフォント名を指定します。
わかっているのはフォント名のみです。
TFontはどうしようもないのでAPIになるかと思いますがご教授お願いします。
文字コードとフォント名を混同してる?
UNICODEでフォント名を指定しても文字コードがUNICODEになるわけじゃない。
StringToWideChar関数を使いたくない?なぜ?
例えば、UNICODEで「MS 明朝」を指定したいなら、
var
szFontName: array[0..5] of WideChar = (#$FF2D,#$FF33,#$0020,#$660E,#$671D,#$0000);
TCanvas.Font.Name := szFontName;
でも、ナンの意味がある?
外国のフォントファイルの中にはShiftJISで表せないUnicodeのフォント名しか
もっていないものがあります。
Tfont.NameはString型なのでこれは受け付けてくれません。
String型に変換されるとダメで、Unicodeのままフォント名を受け入れてくれな
いと(APIに渡さないと)プログラム内からフォントを指定できません。
できるかどうか解りませんが、APIのCreateFontIndirectを利用してフォントのハンドルを取得し、TFont.Handleに入れ込んでみてはどうでしょう。
だめであれば、描画系すべて自前で処理する必要があります。
間違えました。
CreateFontIndirectWですね。
CreateFontIndirectは、CreateFontIndirectAと同等なので。
返答遅くなりました。
教えていただいた方法でうまくいきました。
ハンドルの反映の仕方でいろいろ悩んでいたのですがTFont.Handleに
直接入れるのは気がつきませんでした。
メモリリークを心配したのですが大丈夫のようです。
ありがとうございました。
以下、参考までに簡単に書きます。
EnumFontFamExProc と EnumFontFamiliesExW により
TLogFontWを取得
Font.Handle:= CreateFontIndirectW(LogFontW);
ツイート | ![]() |