VC6.0で開発しています。(UNICODE化しない)
日本語で「φ」という文字が表示できます。
フォント指定は:
lfFaceName = MS 明朝
lfCharSet = SHIFTJIS_CHARSET;
英語システムに移行しますと、英語フォントに対する「φ」という文字を表示できますか?
こんなフォントがありませんか?
lfFaceName と lfCharSet はどのように設定してもいいですか?
フォントに関連知識が少ないですから、もし認識が間違っているとご指摘よろしくお願い
します。
>英語システムに移行しますと、英語フォントに対する「φ」という文字を表示できます
>か?
無条件に可能かと問うていますか?もしそうなら、特定の条件下では可能です
1.ギリシャ文字が使えるフォントがその機械にあって、そのフォントと文字コードと
を正しく指定した場合(MS 明朝のφに似た文字が使えるでしょう)
2.MS 明朝をインストールした英語システムであれば使えておかしくないと思いま
す
フォントの指定とは論理フォントの指定なので(MDNライブラリーで調べて下さいね)
、フォント名で期待通りのフォントが選べる保障はありません。
ズバリのものがなくても指定したフォントの性質にできるだけ近いものを選ぶという
のが論理フォントの指定ということだからです。
また、フォント名と文字集合?(文字セット)とだけの指定で期待したフォントが
必ず得られるとは思いません
>lfFaceName と lfCharSet はどのように設定してもいいですか?
あなたがどのフォントが使いたいかによります。lfFaceName よりも fCharSet の方が
二バイト文字コード(mbcs だったかかな)ではフォント指定時の重みが大きいと思います
デフォルトとして、英語システムにSJISというフォントやCharSetをインストールしてい
ますか?つまり、英語のシステムに必ずSHIFTJIS_CHARSETを使用できますか?
# 以下断言調で書いてるけど、想像で書いてる部分もあるから鵜呑みにしないように…
> 英語フォントに対する「φ」という文字を表示できますか?
そのフォント(文字セット)が「φ」を知っているなら表示できる。それだけ。
SelectObject(dc, CreateFont(.., ANSI_CHARSET, .., Arial));
// Arial(文字セット=ANSI_CHARSET)は「φ」なんて文字は知らないので×
TextoutA(dc, .., φ, 2);
// Arial(文字セット=UNICODE)は「φ」を知っているので○
TextoutW(dc, .., Lφ, 1);
// MS 明朝(文字セット=ANSI_CHARSET)は「φ」なんて文字は知らないので×
SelectObject(dc, CreateFont(.., ANSI_CHARSET, .., MS 明朝));
TextoutA(dc, .., φ, 2);
// MS 明朝(文字セット=SHIFTJIS_CHARSET)は「φ」を知っているので○
SelectObject(dc, CreateFont(.., SHIFTJIS_CHARSET, .., MS 明朝));
TextoutA(dc, .., φ, 2);
> 英語のシステムに必ずSHIFTJIS_CHARSETを使用できますか?
システムは関係ない。フォント次第。フォントが SHIFTJIS_CHARSET(日本語)に対応し
ていれば使用できるし、してなきゃできない。
SHIFTJIS_CHARSET に対応したインストール済みフォント一覧は↓感じで取得可。
int CALLBACK proc(ENUMLOGFONTEX* elf, NEWTEXTMETRICEX*, DWORD, LPARAM param) {
std::vector<std::string>* p = (std::vector<std::string>*)param;
p->push_back(elf->elfLogFont.lfFaceName);
return 1;
}
void func() {
LOGFONT lf = {0};
lf.lfCharSet = SHIFTJIS_CHARSET;
std::vector<std::string> font_list;
HDC dc = ::GetDC(NULL);
EnumFontFamiliesEx(dc, &lf, (FONTENUMPROC)proc, (LPARAM)&font_list, 0);
ReleaseDC(NULL, dc);
// std::sort(font_list.begin(), font_list.end());
// std::unique(font_list.begin(), font_list.end());
}
わかりました。
もし、SHIFTJIS_CHARSETが指定できましたら、表示できると思います。
でしょう。
>わかりました。
>もし、SHIFTJIS_CHARSETが指定できましたら、表示できると思います。
>
>でしょう。
(間違ってたら御免ね)日本語がお得意ではないようですね?
>もし、SHIFTJIS_CHARSETが指定できましたら、表示できると思います。
についてですが、指定(できる/できない)ということはどうやって確かめろつもり
なんでしょう?SHIFTJIS_CHARSET のフォントが存在しなくてもそれだけでは
CreateFont() には失敗しないと思います
MSDNにも記述があります。
> OEM 文字セットはシステムに依存します。
> 別の文字セットを使ったフォントがシステムに存在することもあります。
> アプリケーションで不明な文字セットが使用されている場合は、
> そのフォントを使用する文字列の変換または解釈はできません。
> 出力するデバイス ドライバに直接、文字列を渡します。
つまり、SHIFTJIS_CHARSETが設定できない場合は、ドライバに依存した設定になる。
ということですよね。
皆様
ありがとうございました。
よく理解できました。本件が完了になります。