初めて投稿させて頂きます.hanaといいます.よろしくお願いします.
ダイアログベースを用いて,プログラムを作成しています.
ボタンの上にマウスカーソルが重なった場合に,その重なったという状態を認識したら,ボタンのキャプションを取得して表示するというものを作っています.
マウスをクリックしたときに以上の動作をすることはできるのですが,クリックせずに行うにはどのようにプログラムを組めばいいのでしょうか?
クリック,ダブルクリックせずに動作させるのは可能なのでしょうか?
メッセージハンドラにはクリックとダブルクリックしかなかったので
今回の質問をさせていただきました。
アドバイスお願い致します。
VC6で似たような事をやった時ですが、
1.派生クラスを作成
派生クラスのMouseMoveイベント内に処理を書く
(貼り付けている画面はGetParentで取得)
クラスウィザード-メンバ変数で作成したクラスと結び付け
2.GetWindowRectでボタンの位置&サイズ取得
貼付画面のMouseMoveイベントで領域内にあるかどうか判断して処理
のどっちかで対応したような…。
現在緊急休日出勤&トラブル対応中(^o^;)のため、どっちを使ったか&ソースはすぐには提示できませんが。
余裕ができた時に解決していないようであれば、また書き込みしま〜す!(ごめんなさい)
ふぃ〜。トラブルは解決してないけどちょっと余裕ができたんで、
数年前に作ったソース引っ張り出してきました。
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()が必要。
みいさんへ
お返事ありがとうございます.すごく丁寧にお返事をして頂いたのですが,まだ,解決できていません.ものすごく初心者でどうしてもまだ解決できないでいます.
ごめんなさい.
どこでキャプションの表示を取得してエディットに出力すればいいのですか?
教えて下さい.
お願い致します.
ボタンのキャプションを取得
> GetWindowText(str);
エディットに表示
> ((CXXXDlg*)GetParent())->SetDlgItemText(XXX, str);
> もっとスマートなやり方があると思うけど、とりあえずこれで動くはず。
個人的には、OnMouseHover, OnMouseLeave を使った方がいいと思う。
やっとトラブル対応終わった〜!!
旅に出ます。探さないで下さい(×_×)/ってな気分…。
pick様
> > もっとスマートなやり方があると思うけど、とりあえずこれで動くはず。
> 個人的には、OnMouseHover, OnMouseLeave を使った方がいいと思う。
そうですね。
このソースを書いた頃(7年くらい前かな?)はクラスウィザードに出てくるメッセージが
全てと思ってソースを書いていました。あの頃は若かった…。
hana様
コメントのないソースでごめんなさい。
自分で見ても分かりにくいし。
> ((CXXXDlg*)GetParent())->SetDlgItemText(XXX, str);
CXXXDlg : ボタンの貼り付いているダイアログのクラス名
XXX : ダイアログに貼り付いているエディットのID
> ((CXXXDlg*)GetParent())->表示を元に戻す関数
ボタンの貼り付いているダイアログのクラス内にエディットの表示を戻す関数を作成して呼び出して下さい。
これがないとボタンからマウスが離れてもボタンのキャプションが表示されたままになってしまうので。
pickさん,みいさん,ありがとうございました.
何とか,動きました.
本当に親切に詳しく記述していただき感謝の言葉が見つかりません.
お忙しい中,本当にありがとうございました.
また,わからないことがあったら投稿しますので,そのときは,よろしくお願いしますm(__)m
ツイート | ![]() |