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.1
- 回答日時:
動作確認したわけではありませんが、
> SetWindowText( hWndEdit, (LPCTSTR)(strOut.c_str()) );
の部分ですが、
strOut.c_str() のデータ型は、LPCTSTR ではありませんので、このキャストは
良くありません。
SetWindowTextA( hWndEdit, strOut.c_str() );
とすると良いかもしれません。
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用のキャストにしましょう
お探しの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#
-
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
-
-
4
CString から LPCTSTRの型に変換
C言語・C++・C#
-
5
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
6
画面を強制的に再描画させる方法
C言語・C++・C#
-
7
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
8
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
9
Win32APIで作るコンボボックスの高さの調整
C言語・C++・C#
-
10
この <windows.h> はどこに在る? また、参考資料を見たいのですが。
C言語・C++・C#
-
11
適切な変換関数が存在しない???
C言語・C++・C#
-
12
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
13
char*を初期化したいのですが
C言語・C++・C#
-
14
charからLPTSTRへの変換方法
C言語・C++・C#
-
15
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
16
CString型の文字列連結について
C言語・C++・C#
-
17
最大化と最小化ボタン
C言語・C++・C#
-
18
SetWindowText関数について
C言語・C++・C#
-
19
エディットボックスのフォントを変えたい
C言語・C++・C#
-
20
0除算して、落ちるプログラムと落ちないプログラム
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
C言語の入力した文字を反転させ...
-
fgetsなどのときのstdinのバッ...
-
間接操作のレベルとは
-
strchr() の第2引数はなぜ int ...
-
文字列から空白を取り除きたい...
-
charでの計算?
-
Win32APIでのエディットボック...
-
ITです。早速ですがwinsockでUR...
-
c++ 文字列を入力して、一文字...
-
プログラムの動作
-
TCP/IP通信型大文字・小文字変...
-
CStringをwchar_tに変換したい
-
charからLPTSTRへの変換方法
-
数字文字の出現回数を表示する...
-
干支のプログラム
-
プログラムを作成(c言語)
-
C言語プログラミングについて(...
-
英単語をアルファベット順に
-
C言語のsendとrecv
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報