VC++ MFCButton マウスが通過するときの文字列を後から変更するには?

このQ&Aのポイント
  • VC++ 2008のダイアログでCMFCButtonを使用しています。マウスが通過すると、ステータスバーに文字列が表示される仕組みを利用しています。文字列はリソースで定義されており、ツールチップとステータスバーに表示されます。ただし、起動後にボタンの意味が変わる場合には、マウスが通過するときの文字列をダイナミックに変更する必要があります。
  • マウスが通過するときの文字列を後から変更する方法について教えてください。
  • マウスが通過するときの文字列はリソースで定義されており、ステータスバーに表示されます。起動後にボタンの意味が変わる場合は、この文字列をダイナミックに変更する必要があります。どのようにすれば変更できるのでしょうか?
回答を見る
  • ベストアンサー

VC++ MFCButton マウスが通過するときの文字列を後から変更するには?

お世話になります。 VC++ 2008で、CMFCButtonをダイアログに貼り付けています。 マウスが上を通過したとき、ステータスバーに文字列が表示される しくみがあり、それを使っています。 文字列は、XXXXX\nYYYで、YYYがツールチップ、XXXXXがステータスバーに 表示される文字列としてリソースで定義してあります。 また、そのリソース名をボタンのリソース名としています。 DDXで、メンバーのボタンとリソースIDを関連付けています。 (普通の使い方だと思います) 動作もうまくいっていますが、ステータスバーに表示する説明文を 起動後にダイナミックに変更する必要が出てきました。 ボタンの意味が変わる状況があるからです。 さて、マウスが通過するときの文字列を後から変更するには、どうしたらいいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

当方は、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;} のような感じ。 こんな感じでうまくいくと思うんですが。。 ご参考まで。。

sekinegoo
質問者

お礼

ご丁寧な回答ありがとうございました。

関連するQ&A

  • VC++2010 ボタンなどのレイアウト大きさ変更

    VC++2010のMFCで現在開発しているんですが、 ボタン、スタティックテキスト、エディットボックスの文字の大きさを変更したいんですが どのようにすればいいかわかりません。よろしくお願いします。 またステータスバーに色を付けたいんですがどのようにすれば色を付けることができますか? よろしくお願いします。

  • ダイアログへ文字列を表示させる方法(API)

    TCHAR s[80] = "Test"; MessageBox(NULL, s, "題名", MB_YESNO); としてダイアログを表示させるのと同じように、 ダイアログボックスをリソースエディタで作成し 作成したダイアログ内に、文字列を表示させるには どのようにしたら良いでしょうか? 作成したダイアログは、MessageBox関数で作成されるものと同じ。 表示させたい文字列は、MessageBox関数の第2パラメータのTCHAR型変数sと同じ。 ダイアログ内の表示させたい所の識別子は、IDC_STATIC。 MS VC++ & Win98 の環境で作成してます。

  • ステータスバーに文字列を表示するには?

    えっと、タイトルそのまんまなのですが、 ステータスバーに任意の文字列を表示させるにはどうしたらいいのでしょう? リンク先のときはonmouseoverを使えばいいことはわかったんですけど、リンクにマウスを乗せていないときにも表示させるには(別の文字列を)どうしたらいいのでしょう? 流すやり方はわかったのですが、流しているとリンクにマウスを乗せたとき、一瞬しか表示されなくなってしまうので、できれば静止したままにしたいです。 なんかわかりにくい説明ですみません。 関連URLなど教えていただけると有り難いです。 よろしくおねがいします。

    • ベストアンサー
    • HTML
  • リストボックスの文字列の取得

    VC++でダイアログのリストボックスに文字列を入れました。この文字列を別のエディタボックスに同じ内容を表示したいのですが、その方法がわかりません。誰か教えてください。お願いします

  • $XXX を含んだ文字列の評価

    '$XXX + $yyy' という文字列($XXXと$yyyは単なる文字列)を評価したものを別の変数に格納したいのですがどうすればいいでしょう。 <?php $XXX = 10 ; $yyy = 5 ; $str = '$XXX + $yyy' ; $ans = なんとか文字列を評価; echo $ans ; ?> 表示 -- 15

    • ベストアンサー
    • PHP
  • UpdateData( FALSE); による文字列データの表示更新(VC++6.0)

    VC++の超初心者です. UpdateData( FALSE ); を用いてエディットボックスの文字列の表示の更新を 試みているのですが,たとえば,以下のコードのようにボタンをクリックした際に文字列表示の更新を複数回行おうとするとうまくいきません. 具体的には一回目のUpdateData( FALSE );が反映されず二回目のUpdateData( FALSE );のみ反映されるという症状です. なおm_mojiretsuはCstring型でエディットボックスのDDX用の変数です. void CMyDlg::OnButton1() { DWORD p; m_mojiretsu=_T("mojirstu1"); UpdateData( FALSE ); /*5秒の待ち*/ p=timeGetTime(); while(1){if((timeGetTime()-p)>5000) break;} m_mojiretsu=_T("mojirstu1\r\nmojirstu2"); UpdateData( FALSE ); } 何か別の処理を行わなければいけないのでしょうか. どこかに根本的なミスがあるのでしょうか. VC歴3日程度で,右も左も分からず大変困っております.よろしくお願いします.

  • VC++でツリーコントロールの文字色変更

    VC++.NETを使い始めたばかりの初心者です。 ツリーコントロールで登録した文字列を 行ごとに文字色の変更をしたいのですが やり方がわからなく困っています。 WM_NOTIFYメッセージを横取りして clrTextメンバに色を設定をしてみたのですが、 アイテムのダブルクリックやマウス右クリック メニューが使えなくなってしまいました。 ほかのやり方でもかまいませんので ご存知の方は、ご教授をよろしくお願いします。

  • 終了していない文字列型の定数です・・・と出ます。

    javaScript使用可能・不可能の表示 ↓ 「OK」「キャンセル」ボタン付きのダイアログボックスの表示 ↓ OK→次のページへ キャンセル→ダイアログボックスを閉じる というようなスクリプトを作ったのですが、最初は上手く動いたのですが、すこしダイアログボックスの文字を変更すると、終了していない文字列型の定数です・・・ というエラーを吐いてきます。 どうやらここの文字が多すぎるとエラーを吐くのですがどうなのでしょうか。 http://mekipedia.cocolog-nifty.com/test.txt これがタグのデータです。 このテキストデータでは表示できるようなので、文字コードか何かでしょうか・・・。 では、よろしくお願いします。

  • VC# 境界線のないウィンドウフレームのサイズ変更

    VC#を勉強しています。 質問内容ですが、ウィンドウフレームのプロパティの FormBorderStyle がありますよね。 これを、[none]に設定するとウィンドウフレームが消えます。 このフレームのサイズ変更をマウスを使って行いたいのですが、どうもやり方がわかりません。 境界線がないので、ステータスバーをウィンドウ下部へつけて、ステータスバーの右下のサイズ変更用の部分にマウスカーソルを当ててドラッグしてみても、サイズが変更されません。 何かいい方法があれば、教えて頂きたいです。 どうかよろしくお願いいたします。

  • 特定の文字列の入力を必要とするフォーム

    特定の文字列を入力し、「確定」などのボタンを押すことによって「送信」ボタンを表示させるようにしたいのです。 また、特定の文字列が違っていた場合、「間違っている」などと書かれたダイアログを表示させたいです。 しかし、私の力ではできません。 何方か詳しくソースを教えていただけないでしょうか。 お願いします。

専門家に質問してみよう