ボタンの上にマウスポインタがきたときにボタンのキャプションを取得して表示するには?

解決


hana  2005-01-23 09:41:17  No: 56123

初めて投稿させて頂きます.hanaといいます.よろしくお願いします.

ダイアログベースを用いて,プログラムを作成しています.

ボタンの上にマウスカーソルが重なった場合に,その重なったという状態を認識したら,ボタンのキャプションを取得して表示するというものを作っています.
マウスをクリックしたときに以上の動作をすることはできるのですが,クリックせずに行うにはどのようにプログラムを組めばいいのでしょうか?
クリック,ダブルクリックせずに動作させるのは可能なのでしょうか?

メッセージハンドラにはクリックとダブルクリックしかなかったので
今回の質問をさせていただきました。
アドバイスお願い致します。


みい  2005-01-24 00:22:33  No: 56124

VC6で似たような事をやった時ですが、

1.派生クラスを作成
  派生クラスのMouseMoveイベント内に処理を書く
  (貼り付けている画面はGetParentで取得)
  クラスウィザード-メンバ変数で作成したクラスと結び付け
2.GetWindowRectでボタンの位置&サイズ取得
  貼付画面のMouseMoveイベントで領域内にあるかどうか判断して処理

のどっちかで対応したような…。
現在緊急休日出勤&トラブル対応中(^o^;)のため、どっちを使ったか&ソースはすぐには提示できませんが。
余裕ができた時に解決していないようであれば、また書き込みしま〜す!(ごめんなさい)


みい  2005-01-24 01:52:34  No: 56125

ふぃ〜。トラブルは解決してないけどちょっと余裕ができたんで、
数年前に作ったソース引っ張り出してきました。

2.はプロパティを「通知」にしても駄目だったんでした。

1.の方法で
CButtonをベースにした派生クラスを作成

#include <XXXDlg.h>
int  flg = 0;
void CXXXButton::OnMouseMove(UINT nFlags, CPoint point) 
{
  CString  str;
  CRect  rectW;
  if (flg == 0)
  {
    ::SetCapture(this->GetSafeHwnd());
    GetWindowText(str);
    ((CXXXDlg*)GetParent())->SetDlgItemText(XXX, str);
    flg = 1;
  }
  else
  {
    GetClientRect(rectW);
    // 領域外
    if ((point.x < 0) || (point.y < 0) ||
      (point.x > rectW.Width()) || (point.y > rectW.Height()))
    {
      ReleaseCapture();
      ((CXXXDlg*)GetParent())->表示を元に戻す関数
      flg = 0;
    }
  }
  CButton::OnMouseMove(nFlags, point);
}

 クラスウィザード-メンバ変数でボタンを作成したクラスと結び付け

もっとスマートなやり方があると思うけど、とりあえずこれで動くはず。
領域外に出たら表示を戻すとこがポイントです。
領域外認識のためにSetCapture()、ReleaseCapture()が必要。


hana  2005-01-25 14:04:38  No: 56126

みいさんへ

お返事ありがとうございます.すごく丁寧にお返事をして頂いたのですが,まだ,解決できていません.ものすごく初心者でどうしてもまだ解決できないでいます.
ごめんなさい.

どこでキャプションの表示を取得してエディットに出力すればいいのですか?
教えて下さい.
お願い致します.


pick  2005-01-25 23:32:49  No: 56127

ボタンのキャプションを取得
> GetWindowText(str);

エディットに表示
> ((CXXXDlg*)GetParent())->SetDlgItemText(XXX, str);

> もっとスマートなやり方があると思うけど、とりあえずこれで動くはず。
個人的には、OnMouseHover, OnMouseLeave を使った方がいいと思う。


みい  2005-01-26 00:29:23  No: 56128

やっとトラブル対応終わった〜!!
旅に出ます。探さないで下さい(×_×)/ってな気分…。

pick様
> > もっとスマートなやり方があると思うけど、とりあえずこれで動くはず。
> 個人的には、OnMouseHover, OnMouseLeave を使った方がいいと思う。
そうですね。
このソースを書いた頃(7年くらい前かな?)はクラスウィザードに出てくるメッセージが
全てと思ってソースを書いていました。あの頃は若かった…。

hana様
コメントのないソースでごめんなさい。
自分で見ても分かりにくいし。
> ((CXXXDlg*)GetParent())->SetDlgItemText(XXX, str);
CXXXDlg : ボタンの貼り付いているダイアログのクラス名
XXX : ダイアログに貼り付いているエディットのID
> ((CXXXDlg*)GetParent())->表示を元に戻す関数
ボタンの貼り付いているダイアログのクラス内にエディットの表示を戻す関数を作成して呼び出して下さい。
これがないとボタンからマウスが離れてもボタンのキャプションが表示されたままになってしまうので。


hana  2005-01-30 05:34:24  No: 56129

pickさん,みいさん,ありがとうございました.
何とか,動きました.

本当に親切に詳しく記述していただき感謝の言葉が見つかりません.
お忙しい中,本当にありがとうございました.

また,わからないことがあったら投稿しますので,そのときは,よろしくお願いしますm(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加