
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] が、'*'となっている)
どこか確認したらよい場所をアドバイスいただけますか?
No.2ベストアンサー
- 回答日時:
まずは環境を書きましょう
と言っても思い当たる原因から考えると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
となります。
内容を理解しました。
丁寧にご回答いただきましてありがとうございました。
別のプログラムで、MFC版で、
mEdit.SetWindowText((LPCTSTR)strOut.c_str());
でうまく行っていたので、何も考えずにコピーしたのですが、
MFCの方は、マルチバイト文字の設定となっていたので、”たまたま”うまく行っただけだったのですね。。。
ご指摘のとおり「理解してキャストする」ことを心がけます。
No.3
- 回答日時:
WinXP上のVC6.0で確認しましたが 文字化けは起きないようですよ
マルチラインのテキストボックスに改行を挿入する場合
『\r\n』で追加した方がいいでしょう
実行環境、開発環境などを明示してみましょう
#1の回答のように『Unicode/マルチバイト』の問題なら
SetWindowTextA等のANSI実装を呼ぶなどをしてみましょう
その場合 第2引数のキャストは(LPCSTR)など ANSI用のキャストにしましょう
No.1
- 回答日時:
動作確認したわけではありませんが、
> SetWindowText( hWndEdit, (LPCTSTR)(strOut.c_str()) );
の部分ですが、
strOut.c_str() のデータ型は、LPCTSTR ではありませんので、このキャストは
良くありません。
SetWindowTextA( hWndEdit, strOut.c_str() );
とすると良いかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列をnビットシフトする
-
Visual Studio strcpyについて
-
コンパイルエラー invalid ope...
-
atoi( ) の反対をやりたい
-
文字列から空白を取り除きたい...
-
入力された文字列から整数だけ...
-
TCHAR文字列?の特定部分の数字...
-
DxLibについて質問です
-
Win32APIでのエディットボック...
-
for next文、do while文、if文...
-
fgetsなどのときのstdinのバッ...
-
2進数でのシリアル通信
-
引数の渡し方と受け方(argv)
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
既定のコンストラクタがありま...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
a^2の√=a が成り立たない場合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
ネットワークにつながっている...
-
fgetsなどのときのstdinのバッ...
-
double型の値をchar配列に変換...
-
atoi( ) の反対をやりたい
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
c言語プログラミング実行時エラ...
-
c++ 文字列を入力して、一文字...
-
【C言語】構造体内の領域解放(...
-
間接参照のレベルが異なっています
-
C言語の入力した文字を反転させ...
-
構造体のアライメント調整
-
strncpyと_tcsncpy_sのヌルの扱...
-
TCP/IP通信型大文字・小文字変...
-
char型からのバイト数取得
おすすめ情報