![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- C言語・C++・C# このプログラミング誰か教えてください。 2 2022/04/22 18:48
- Visual Basic(VBA) エクセルから、パワーポイントのスライドを複数作成する。 1 2022/07/08 09:40
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
MFCのコントロールにUTF-8の文字を表示したい
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
-
4
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
5
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
6
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
-
7
WindowsAPIプログラムをgccでコンパイルしたら...
C言語・C++・C#
-
8
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
9
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
10
最大化と最小化ボタン
C言語・C++・C#
-
11
エディットボックスのフォントを変えたい
C言語・C++・C#
-
12
SetWindowText関数について
C言語・C++・C#
-
13
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
14
エラーの原因は?「この関数の定義が見つかりません」
C言語・C++・C#
-
15
エディットボックスの入力制限について
C言語・C++・C#
-
16
wsprintf関数の使い方について
C言語・C++・C#
-
17
CString から LPCTSTRの型に変換
C言語・C++・C#
-
18
wsprintf( ポインタ , %d" , "123" );"
C言語・C++・C#
-
19
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
20
char*を初期化したいのですが
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
間接操作のレベルとは
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
C言語 バイナリファイルをfloa...
-
charでの計算?
-
C言語のプログラミングで文字コ...
-
OpenCVで32bit ヘッダ無しRaw画...
-
C言語の入力した文字を反転させ...
-
構造体の各メンバにfor文からア...
-
C++のCreateFile関数で、ASCII...
-
配列をnビットシフトする
-
文字コードから文字列への変換
-
AnsiPos相当の関数はありません...
-
-'0'の意味について
-
c言語プログラミング実行時エラ...
-
double型の値をchar配列に変換...
-
「char* p」と「char *p」は何...
-
VC++2010 MFC 16進数を10進数...
-
sprintfに同じ変数は使えるか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
テキストデータをそのままバイ...
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
2曲同時再生するにはどうした...
-
C言語の入力した文字を反転させ...
-
配列をnビットシフトする
-
3桁区切(コンマ)記号をつけ...
-
int main()の・・・
-
型変換
-
CStringをwchar_tに変換したい
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
c++ 文字列を入力して、一文字...
-
絶対パスからのファイル名の切...
おすすめ情報