質問: vc++ mfcbutton マウスが通過するときの文字列を後から変更するには? お世話になります。 vc++ 2008で、cmfcbuttonをダイアログに貼り付けています。 マウスが上を通過したとき、ステータスバーに文字列が表示される しくみがあり、それを使っています。 文字列は、xxxxx\nyyyで、yyyがツールチップ、xxxxxがステータスバーに 表示される文字列としてリソースで定義してあります。 また、そのリソース名をボタンのリソース名としています。 ddxで、メンバーのボタンとリソースidを関連付けています。 (普通の使い方だと思います) 動作もうまくいっていますが、ステータスバーに表示する説明文を 起動後にダイナミックに変更する必要が出てきました。 ボタンの意味が変わる状況があるからです。 さて、マウスが通過するときの文字列を後から変更するには、どうしたらいいでしょうか?
回答: 当方は、mfcプログラミングはよく使いますが、2008を所有していないため、cmfcbuttonボタンなるクラスは初めて知りました。 mfcbuttonなりcbuttonのサブクラス化したクラスを作ることで万事解決だと思いますが。。 便利なクラスは開発効率を良くするけど、ちょっと違うことをやろうと思ったら、結局サブクラス化しないとできないことはよくあります。 もちろん、サブクラス化しないで済む方法があれば当然そちらを採用しますが。 2008を持ってないので、別バージョンのvc&mfcで似たようなことをするサンプルプログラムを作ってみました。 サブクラス化したクラスの中で、onmousemove()イベントハンドラを追加。 onmousemove()イベントハンドラは、マウスが動いている間、何度も呼ばれるから、ステータスバーやツールチップの文字列の変更は一度しか呼び出さない仕組みが必要。 ボタンに割り当てるステータスバーに表示する文字列をボタンもしくはその親であるダイアログなりに保持する。この文字列をaとすると ここで、ステータスバーの文字列を取得する(getpanetextを使う)なりして、aと比較して、異なれば、ステータスバーの表示を変更。 ステータスバーの文字列は、setpanetext()関数で変更。 ツールチップは、cmfcbutton::settooltipで変更。 サブクラス化したクラスを使うときは、リソースエディタでcmfcbuttonなりcbuttonクラスなりの変数を追加する。 すると、クラスのメンバ変数に、 cmfcbutton m_btn1; なりができているから、 これを cmfcbuttonex m_btn1; とするだけで、サブクラス化したクラスにメッセージがいきます。 わざわざsubclassdlgitem()は使わないでもok。 もちろん、そのヘッダーファイルの中で、サブクラス化したクラスのヘッダーファイルを#includeする必要があります。 文字列リソースを必要な分だけリソースエディタのstring tableで作って、 ボタンに割り当てるツールチップやステータスバーに対する文字列を変更する箇所で、 str1.loadstring(ids_text_btn1_statusbar_text1); とか str1.loadstring(ids_text_btn1_statusbar_text2); などとして、リソースから適切な文字列を取得。 mfcbuttonをサブクラス化したクラスに setstatusbartext(lpctstr); みたいな関数を定義して、 m_btn1.setstatusbartext(str1);みたいにボタンに割り当てるステータスバーに表示するテキストなりを設定する。 この関数はサブクラス化したクラスのユーザー定義メンバ関数で、 void setstatusbartext(lpctstr lpszstatusbartext){m_strsetstatusbartext = lpszstatusbartext;} のような感じ。 こんな感じでうまくいくと思うんですが。。 ご参考まで。。