Unicodeのフォント名をセットするには?

解決


ぱお  2005-03-16 11:00:50  No: 13782  IP: [192.*.*.*]

TCanvas.Font.NameをUnicode文字列で指定したいです。
ShiftJISに変換不可能なUnicodeのフォント名です。
ダイアログは使わずにプログラム内から任意のフォント名を指定します。
わかっているのはフォント名のみです。

TFontはどうしようもないのでAPIになるかと思いますがご教授お願いします。

編集    削除
意味不明  2005-03-16 15:05:39  No: 13783  IP: [192.*.*.*]

文字コードとフォント名を混同してる?
UNICODEでフォント名を指定しても文字コードがUNICODEになるわけじゃない。
StringToWideChar関数を使いたくない?なぜ?
例えば、UNICODEで「MS 明朝」を指定したいなら、

var
  szFontName: array[0..5] of WideChar = (#$FF2D,#$FF33,#$0020,#$660E,#$671D,#$0000);

TCanvas.Font.Name := szFontName;

でも、ナンの意味がある?

編集    削除
ぱお  2005-03-16 21:51:08  No: 13784  IP: [192.*.*.*]

外国のフォントファイルの中にはShiftJISで表せないUnicodeのフォント名しか
もっていないものがあります。
Tfont.NameはString型なのでこれは受け付けてくれません。
String型に変換されるとダメで、Unicodeのままフォント名を受け入れてくれな
いと(APIに渡さないと)プログラム内からフォントを指定できません。

編集    削除
にしの  2005-03-16 22:29:31  No: 13785  IP: [192.*.*.*]

できるかどうか解りませんが、APIのCreateFontIndirectを利用してフォントのハンドルを取得し、TFont.Handleに入れ込んでみてはどうでしょう。
だめであれば、描画系すべて自前で処理する必要があります。

編集    削除
にしの  2005-03-16 22:30:04  No: 13786  IP: [192.*.*.*]

間違えました。
CreateFontIndirectWですね。
CreateFontIndirectは、CreateFontIndirectAと同等なので。

編集    削除
ぱお  2005-03-19 11:03:13  No: 13787  IP: [192.*.*.*]

返答遅くなりました。
教えていただいた方法でうまくいきました。
ハンドルの反映の仕方でいろいろ悩んでいたのですがTFont.Handleに
直接入れるのは気がつきませんでした。
メモリリークを心配したのですが大丈夫のようです。
ありがとうございました。

以下、参考までに簡単に書きます。

EnumFontFamExProc  と  EnumFontFamiliesExW  により
TLogFontWを取得

Font.Handle:= CreateFontIndirectW(LogFontW);

編集    削除