とっておきの手土産を教えて

Win32APIでウィンドウズプログラムを組んでいます。

以下のコードで、エディットボックスへの文字列表示が文字化けします。

<エディットボックスの作成>
hWndEdit =
CreateWindowEx( WS_EX_CLIENTEDGE, _T("EDIT"), NULL,
ES_LEFT | ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY | ES_AUTOHSCROLL |
WS_TABSTOP | WS_VISIBLE | WS_CHILD,
(int)(WINDOW_W * 0.01), 30, (int)(WINDOW_W * 0.8),
(clientRect.bottom-clientRect.top) - 35,
hWndMain, (HMENU)IDC_EDITLOG, hInstance, NULL );

<フォントの設定>
HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage( hWndEdit, WM_SETFONT, (WPARAM)hFont, TRUE );

<出力文字列の設定>
std::ostringstream stream;
stream << "************ Start TEST ************\n";
std::string strOut = stream.str();

<出力>
SetWindowText( hWndEdit, (LPCTSTR)(strOut.c_str()) );

デバッガでの、strOutは、文字化けせずに表示されます。(strOut[0] が、'*'となっている)

どこか確認したらよい場所をアドバイスいただけますか?

A 回答 (3件)

まずは環境を書きましょう


と言っても思い当たる原因から考えるとVisual C++ 2005か2008でしょうけど

文字列を扱うWindows APIは多くがchar*を扱うAとwchar_t*を扱うWが有ります
SetWindowTextもSetWindowTextAとSetWindowTextWが存在します
string.c_str()、ostringstream.str()
の返り値の型はconst cahr *です
一方UNICODEビルド時のLPCTSTRはconst wchar_t *です
まず不要なはずのLPCTSTRへのキャストを外しましょう(想定しているはずのconst char *であればキャストは必要ないはずですよね)
SetWindowTextW(HWND, (const wchar_t *)const char *)
これ↑がいくらなんでも文字化けして当然だというのは理解できますよね
なぜキャストが必要になるのか考えてからキャストしましょう
wchar_tに対するtypedef basic_string<wchar_t> std:wstringとか有るけどcharとwchar_tを切り替えるTCHARに対するtypedefは無いので自分で相当の物をtypedefするなりすればVC++の設定でなくソース側で対応できます

http://gurigumi.s349.xrea.com/programming/visual …
http://www.google.co.jp/search?q=TCHAR+site:msdn …

この回答への補足

環境について補足させていただきます。
OS:Windows XP、Vista
環境:VC++2005 Express + WinSDK
となります。

補足日時:2009/03/02 22:53
    • good
    • 0
この回答へのお礼

内容を理解しました。
丁寧にご回答いただきましてありがとうございました。

別のプログラムで、MFC版で、
mEdit.SetWindowText((LPCTSTR)strOut.c_str());
でうまく行っていたので、何も考えずにコピーしたのですが、
MFCの方は、マルチバイト文字の設定となっていたので、”たまたま”うまく行っただけだったのですね。。。

ご指摘のとおり「理解してキャストする」ことを心がけます。

お礼日時:2009/03/02 23:09

WinXP上のVC6.0で確認しましたが 文字化けは起きないようですよ



マルチラインのテキストボックスに改行を挿入する場合
『\r\n』で追加した方がいいでしょう

実行環境、開発環境などを明示してみましょう

#1の回答のように『Unicode/マルチバイト』の問題なら
SetWindowTextA等のANSI実装を呼ぶなどをしてみましょう
その場合 第2引数のキャストは(LPCSTR)など ANSI用のキャストにしましょう
    • good
    • 0

動作確認したわけではありませんが、



> SetWindowText( hWndEdit, (LPCTSTR)(strOut.c_str()) );
の部分ですが、
strOut.c_str() のデータ型は、LPCTSTR ではありませんので、このキャストは
良くありません。

SetWindowTextA( hWndEdit, strOut.c_str() );
とすると良いかもしれません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A