CDC::TextOut で日本語が表示できない – プログラミング – Home

CDC::TextOut で日本語が表...
 
通知
すべてクリア

CDC::TextOut で日本語が表示できない


DOSKOI-PANDA
 DOSKOI-PANDA
(@DOSKOI-PANDA)
ゲスト
結合: 22年前
投稿: 55
Topic starter  

まだ、前の質問が片付いていませんが。

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 なら化けないのですが。

何か、設定がいるのでしょうか?


引用解決済
トピックタグ
DOSKOI-PANDA
 DOSKOI-PANDA
(@DOSKOI-PANDA)
ゲスト
結合: 22年前
投稿: 55
Topic starter  

あまりに状況説明が足りないので、回答しようないですね。

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 へのテキストを化けずに
出力するにはどーしたらよいか? です。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

OnInitialUpDate()内のCreateIndirectFont()をCreateFontIndirect()に変更して
やって見たたが、CreateFontIndirect()でアサートされる。無視して続行すると正し
く表示される。環境はWin2K(SP4) VC++2005 MFCだけど。

問題は、CDCではなく、フォントのほうじゃないの?


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

CreateFontIndirect()でアサートされるのは、
> m_oFont.CreatePointFont(90, TEXT(MS ゴシック));
したフォントをDeleteObject()してないから。

他にもつっこみどころ満載だが、
細かい間違いをすべてこちらで修正した上、実行してみたところ
文字化けは起こらず、きちんと表示されました。

まだ、情報が足りないようです。


返信引用
DOSKOI-PANDA
 DOSKOI-PANDA
(@DOSKOI-PANDA)
ゲスト
結合: 22年前
投稿: 55
Topic starter  

すみません。

職場からは直接書き込めず、内容がうろ覚えでした。

補正すると、Font を Create して設定していたのは、OnInitialUpdate() ではなく、
OnCreate でした。
また、OnPaint() は override しておらず、CView の OnPaint から、OnDraw が呼ばれて
いました。

その後の経過ですが、プロジェクトを新しく作り直してやってみたところ、TextOut で文
字化けせず出力されるようになりました。
問題は解決したと言えば言えるのですが、原因が不明なので、ソースの差分を取ってみ
て、原因が解りましたら報告、その時点で解決にします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました