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

[戻る]
はっぱ 2005/04/20(水) 17:37:21
MFC VC6.0を使用してプログラム作成しています。

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

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

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

はっぱ 2005/04/20(水) 17:54:12
追加です
2の処理でメンバ変数m_nstrNumに文字数を入れます
5のOnPaintでm_nstrNumをGetします。
分かりにくくてすいませんでした。

はっぱ 2005/04/20(水) 17:55:42
たびたびすいません
5のOnPaintではなく、6のOnPaintです

たま 2005/04/20(水) 18:02:07
敢えて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);
}
こんな感じだと思うんですが。

はっぱ 2005/04/20(水) 18:38:03
たまさん、ありがとうございます。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 2005/04/20(水) 19:05:07
>こうなるとラベルもサブクラス化したほうがよいのでしょうか?

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


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

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

はっぱ 2005/04/20(水) 19:24:45
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 );
}

いかがでしょうか?

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

古いスレッドには追加発言できません。