EditBoxの文字数の取得と貼り付け – プログラミング – Home

EditBoxの文字数の取得と貼り付け
 
通知
すべてクリア

EditBoxの文字数の取得と貼り付け


はっぱ
 はっぱ
(@はっぱ)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

MFC VC6.0を使用してプログラム作成しています。

ダイアログでEditBox内の文字数を文字入力直後で取得し
ラベルにその文字数を表示するプログラムを作っています。

作成イメージ
1.EditBoxをサブクラス化
2.サブクラスのOnCharでthis->GetWindowText( str )し文字数を数える
3.親ハンドル(ダイアログ)を取得
CWnd* hWnd = GetParent();
4.親ウインドウにメッセージ送信
5.親ウィンドウでメッセージ取得しウインドウ再描画
6.OnPaintでラベルに文字数をセット

とやりたいのですが4、5のメッセージ処理が分かりません
どなたか教えていただけないでしょうか?
それと直感的にこの方法はよくない気がします。
他にいい方法があれば教えてください


引用解決済
トピックタグ
はっぱ
 はっぱ
(@はっぱ)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

追加です
2の処理でメンバ変数m_nstrNumに文字数を入れます
5のOnPaintでm_nstrNumをGetします。
分かりにくくてすいませんでした。


返信引用
はっぱ
 はっぱ
(@はっぱ)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

たびたびすいません
5のOnPaintではなく、6のOnPaintです


返信引用
たま
 たま
(@たま)
ゲスト
結合: 23年前
投稿: 50
 

敢えて1から6の方法でやりたいなら駄目かもしれませんが

1.ラベル(スタティック)のIDをIDC_STATIC以外に変更(重要)

2.EN_CHANGEで書込み
void ChogehogeDlg::OnChangeEdit1()
{
CString str;
GetDlgItem(IDC_EDIT1)->GetWindowText(str);
// m_nstrNum = str.GetLength(); 文字数が必要なら
GetDlgItem(IDC_STATIC1)->SetWindowText(str);
}
こんな感じだと思うんですが。


返信引用
はっぱ
 はっぱ
(@はっぱ)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

たまさん、ありがとうございます。EN_CHANGEていうのがあったんですね。
おかげでできました。ただEditBoxはどうしてもサブクラス化をしたいのです。(説明不足です
いません)

その場合
void CEditSubClass::OnChange()
{
CString str, strNum;
this->GetWindowText(str);
m_nstrNum = str.GetLength();
strNum.Format( %d, m_nstrNum );
* GetDlgItem(IDC_STATIC1)->SetWindowText(strNum);
}
となりますが、この場合実行すると*でエラー発生(アクセスバイオレーション)しますが、
こうなるとラベルもサブクラス化したほうがよいのでしょうか?


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

>こうなるとラベルもサブクラス化したほうがよいのでしょうか?

いいえ、おそらく無駄な労力に終わります。

CEditSubClassの中に、兄弟コントロールのIDが即値で出てきては汎用性がありません。

何のためのサブクラスなのか分からないので、必ずしも正しいとは言えませんが、
当初の予定通りに共通の親であるダイアログクラスで処理するのが妥当です。
場合によっては、スタティックコントロールをCEditSubClassに関連付ける方がいいこと
もあります。


返信引用
はっぱ
 はっぱ
(@はっぱ)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

REEさん、レスありがとうございます。

>何のためのサブクラスなのか分からないので
将来的にEditBoxとラベルを複数作り配列にするためです

その結果こういうふうになりました
CXXXDlg::OnInitDialog()
{



   m_edSub.SubclassDlgItem( IDC_EDIT1, this );
   m_lbNum.SubclassDlgItem( IDC_LABEL, this );
   m_edSub.SetLbel( &m_lbNum );
}

CEditSubClassの処理
追加変数
CLabelSubClass* m_plbNum;

関数
void SetLbel( CLabelSubClass* lb )
{
   m_plbNum = lb;
}

void CEditSubClass::OnChange()
{
   CString str, strNum;
   int num;
   this->GetWindowText( str );
   num = str.GetLength();
   strNum.Format( %d, num );
   m_plbNum->SetWindowText( strNum );
}

いかがでしょうか?

>当初の予定通りに共通の親であるダイアログクラスで処理するのが妥当です
そうなるとやはりメッセージ処理になるのでしょうか?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました