ページ 11

エディットコントロールから文字を取得

Posted: 2014年3月29日(土) 13:23
by rozeo
こんにちは、rozeoといいます。

今回はwin32のエディットコントロールから文字列を取得する関数,GetwindowText関数についてしつもんさせていただきます。

エディットコントロールから文字列を取得するため、以下のような引数を記述して、標準ファイル出力関数(fopenしてfprintfしてfclose)

コード:

//hEditはエディットコントロールハンドル
//BufferはTCHAR Buffer[101];と定義済み
GetWindowText( hEdit1,Buffer,GetWindowTextLength( hEdit1) );

FILE *fp = fopen( "test.txt","w" );
if( fp == NULL )return -1;

//実際はconst TCHAR *がたで自作関数にわたして実行するがほぼ一緒なので省略
fprintf( fp,"%s\n",Buffer );
fclose( fp );
で、エディットコントロールに test と入力して作成させて
出力されたtest.txtを確認したところ
なぜか始め1byte分( t )歯科出力されませんでした(日本語をいれると文字化け)

ほかのページなどあさってみたりしましたが、別にかわったことはありませんでした。

こうなってしまう理由がわかりません。
教えていただけると幸いです

Re: エディットコントロールから文字を取得

Posted: 2014年3月29日(土) 13:27
by h2so5
GetWindowTextの第三引数はバッファのサイズなので

コード:

GetWindowText( hEdit1,Buffer,sizeof(Buffer) );
ではないでしょうか。

Re: エディットコントロールから文字を取得

Posted: 2014年3月29日(土) 13:32
by softya(ソフト屋)
マルチバイト文字とUNICODE文字の処理が混在している様に見えます。
GetWindowTextしたのがUNICODE文字だとするとfprintf( fp,"%s\n",Buffer );でマルチバイト文字として扱うと半角文字の場合最初の1バイトしか出力されません。

[解決方法]
すべてをマルチバイト文字の処理か、UNICODE文字の処理で統一します。
マルチバイト文字の処理に変更するには、コンパイルオプションから変更できます。
UNICODE文字の場合、fprintfではなく_ftprintfなどに切り替えてください。
※ TCHARは正確に言うとUNICODE文字専用では無いんですけどね。

【補足】
UNICODE文字は、言語処理系的にはワイド文字と呼びます。
「Programming Place Plus C言語編 第47章 ワイド文字」
http://www.geocities.jp/ky_webid/Progra ... c/047.html

Re: エディットコントロールから文字を取得

Posted: 2014年3月29日(土) 13:59
by rozeo
エディットコントロールからの入力はこちらで処理せずTransrateMessageに任せているので型がわかりません。こういう場合はどうするはいいでしょうか?

エディットコントロールの文字をUnicode形式に変換っていう処理を行うのでしょうか?
(ちなみにこちらでMessageBoxにかく文字列はTEXTマクロを使っていますのでおそらく問題はエディットコントロールの文字形式だと思われます

Re: エディットコントロールから文字を取得

Posted: 2014年3月29日(土) 14:05
by softya(ソフト屋)
扱うのがマルチバイト文字かUNICODE文字かは、プロジェクトのプロパティの構成で変更します。
実のところマルチバイト文字はWindowsに取ってはレガシーで、内部的にはUNICODE文字で扱われているのをわざわざマルチバイト文字に変換して処理するWindowsAPIを残しているのです。
マルチバイト文字用とUNICODE文字用でWindowsAPIが2種類あるのです。どちらを使うかは、プロジェクトのプロパティでこっそり切り替わります。

Re: エディットコントロールから文字を取得

Posted: 2014年3月29日(土) 16:58
by naohiro19

コード:

SendMessage(hEdit1, WM_GETTEXT, (WPARAM)Buffer, (LPARAM)sizeof(Buffer));
で取得できますね。

恐らくプロジェクトの設定がユニコードになっていると思うのでWideToMultibyteChar/MultibyteCharToWideChar関数を利用しないといけません。
MFC/ATLをサポートしたプロジェクトであればCStringを使えば楽にできます。
[hr]
誤植になっていたので修正しました。

Re: エディットコントロールから文字を取得

Posted: 2014年3月29日(土) 18:56
by rozeo
あ、プロジェクトの構成の文字コードがマルチバイト文字を使用するになってました

変更したらうまくいきました。マルチバイト用とUnicode用でAPIが2種類あるのか…知らなかった…

返答をくださった方ありがとうございます。解決とさせていただきます。
また質問があれば質問させていただくのでよろしくお願いします。