
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#
-
エディットボックスの入力制限について
C言語・C++・C#
-
-
4
WindowsAPIプログラムをgccでコンパイルしたら...
C言語・C++・C#
-
5
画面を強制的に再描画させる方法
C言語・C++・C#
-
6
ダイアログボックスで指定したサイズどおり表示されない
C言語・C++・C#
-
7
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
8
LPCWSTRとchar
C言語・C++・C#
-
9
文字列の置換をCStringで(C++)
C言語・C++・C#
-
10
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
11
エディットコントロールへのUnicodeの入力
C言語・C++・C#
-
12
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
13
作成したウインドウのサイズを固定するには?
C言語・C++・C#
-
14
Win32APIでウィンドウを中央に配置する関数の仕組みを教えてください。
C言語・C++・C#
-
15
C言語win32api、エディットボックスから文字列を取得しメッセージ
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストデータをそのままバイ...
-
問題のあるポインタ変換
-
c言語配列の結合についてです。...
-
atoi( ) の反対をやりたい
-
配列をnビットシフトする
-
型変換
-
charからLPTSTRへの変換方法
-
文字列がNULLか空文字列かの判定
-
secが・・確認お願いできません...
-
c言語strchrのキャスト...
-
strtol関数 自作
-
絶対パスからのファイル名の切...
-
ローマ字変換アルゴリズムを教...
-
strncpyと_tcsncpy_sのヌルの扱...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
const unsigned char *Ptn
-
文字列から空白を取り除きたい...
-
fgetsなどのときのstdinのバッ...
-
<>で囲まれた文字列を文字列の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
c++ 文字列を入力して、一文字...
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
WORDをcharに変換する方法
-
strncpyと_tcsncpy_sのヌルの扱...
-
型変換
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
Win32APIでのエディットボック...
-
間接参照のレベルが異なっています
-
c言語配列の結合についてです。...
-
【C言語】テキストファイル内の...
-
double型の値をchar配列に変換...
-
switch文で文字を比較すること...
-
C言語のfor文です。 繰り返しの...
おすすめ情報