まだ、前の質問が片付いていませんが。
WinXP(SP2) VC++2005 MFC です。
SDI で CScrollView の派生クラスで OnDraw を override し、その中で、あらかじめ
CFont::CreatePointFont(120, TEXT(MS ゴシック)) で作成しておいた CFont を
OnDraw の引数の pDC に SelectObject の引数として渡した後、
pDC->TextOut(0, py, strData);
とやっているのですが、何故か日本語が化けて出ています。
CEditView に対して、SetFont した後、SetWindowText なら化けないのですが。
何か、設定がいるのでしょうか?
あまりに状況説明が足りないので、回答しようないですね。
CScrollView から派生したクラスに、
CFont m_oFont;
を追加、OnInitialUpDate()内で
m_oFont.CreatePointFont(90, TEXT(MS ゴシック));
LOGFONT sLogFont;
m_oFont.GetLogFont(&sLogFont);
sLogFont.lfCharSet = SHIFTJIS_CHARSET;
m_oFont.CreateIndirectFont(&sLogFont);
SetFont(&m_oFont);
とやっておき、OnPaint() で
CPaintDC oDC(this);
PreCreate(&oDC);
OnDraw(&oDC);
OnDraw() 内でまず、
pDC->TextOut(0, py, strData);
とやると、日本語が化けました。
CFont と CDC の メンバ関数をヘルプであさってみたあと、
DWORD nLangInfo = pDC->GetFontLanguageInfo();
とやると、nLangInfo に FLI_GLYPHS が帰ってきていました。
ヘルプ読むと、これはこのままでは表示できない Glyph が入っているとか(Glyph って
何って問題もありますが)。
で、その場合、文字を表示するためには、GetCharacterPlacement() で表示したい文字列
を置き換えてやった上で、ExtTextOut で表示せねばならぬとか。
で、GetCharacterPlacement() の引数の配置フラグに何を設定しても、文字列が化けて
帰ってきてしまします。ExtTextOut で表示する以前に、デバッガで見て化けていました。
日本語だけでなく、半角英数まで。
まとめますと知りたいことは、
CDC::GetFontLanguageInfo() が FLI_GLYPHS を返してくる CDC へのテキストを化けずに
出力するにはどーしたらよいか? です。
OnInitialUpDate()内のCreateIndirectFont()をCreateFontIndirect()に変更して
やって見たたが、CreateFontIndirect()でアサートされる。無視して続行すると正し
く表示される。環境はWin2K(SP4) VC++2005 MFCだけど。
問題は、CDCではなく、フォントのほうじゃないの?
CreateFontIndirect()でアサートされるのは、
> m_oFont.CreatePointFont(90, TEXT(MS ゴシック));
したフォントをDeleteObject()してないから。
他にもつっこみどころ満載だが、
細かい間違いをすべてこちらで修正した上、実行してみたところ
文字化けは起こらず、きちんと表示されました。
まだ、情報が足りないようです。
すみません。
職場からは直接書き込めず、内容がうろ覚えでした。
補正すると、Font を Create して設定していたのは、OnInitialUpdate() ではなく、
OnCreate でした。
また、OnPaint() は override しておらず、CView の OnPaint から、OnDraw が呼ばれて
いました。
その後の経過ですが、プロジェクトを新しく作り直してやってみたところ、TextOut で文
字化けせず出力されるようになりました。
問題は解決したと言えば言えるのですが、原因が不明なので、ソースの差分を取ってみ
て、原因が解りましたら報告、その時点で解決にします。