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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
rozeo
記事: 86
登録日時: 11年前
住所: 広島 呉 (学生寮
連絡を取る:

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

#1

投稿記事 by rozeo » 11年前

こんにちは、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 )歯科出力されませんでした(日本語をいれると文字化け)

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

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 11年前

GetWindowTextの第三引数はバッファのサイズなので

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#3

投稿記事 by softya(ソフト屋) » 11年前

マルチバイト文字と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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

rozeo
記事: 86
登録日時: 11年前
住所: 広島 呉 (学生寮
連絡を取る:

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

#4

投稿記事 by rozeo » 11年前

エディットコントロールからの入力はこちらで処理せずTransrateMessageに任せているので型がわかりません。こういう場合はどうするはいいでしょうか?

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 11年前

扱うのがマルチバイト文字かUNICODE文字かは、プロジェクトのプロパティの構成で変更します。
実のところマルチバイト文字はWindowsに取ってはレガシーで、内部的にはUNICODE文字で扱われているのをわざわざマルチバイト文字に変換して処理するWindowsAPIを残しているのです。
マルチバイト文字用とUNICODE文字用でWindowsAPIが2種類あるのです。どちらを使うかは、プロジェクトのプロパティでこっそり切り替わります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

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

#6

投稿記事 by naohiro19 » 11年前

コード:

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

恐らくプロジェクトの設定がユニコードになっていると思うのでWideToMultibyteChar/MultibyteCharToWideChar関数を利用しないといけません。
MFC/ATLをサポートしたプロジェクトであればCStringを使えば楽にできます。
[hr]
誤植になっていたので修正しました。
最後に編集したユーザー naohiro19 on 2014年3月29日(土) 22:36 [ 編集 1 回目 ]

rozeo
記事: 86
登録日時: 11年前
住所: 広島 呉 (学生寮
連絡を取る:

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

#7

投稿記事 by rozeo » 11年前

あ、プロジェクトの構成の文字コードがマルチバイト文字を使用するになってました

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る