まりです。
お世話になります。
以前、初心者レベルから抜け切れず状態で
過去ログも調べて同じようなものを見つけましたが、そこから習得できませんでした。
( http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200205/02050023.txt)
ご面倒おかけしますが宜しくお願いします。
WinXP, VC++ MFC利用
<状況>
------------------------------
1)新規ダイアログを作成
2)そこへプッシュボタンを1つ置く(IDC_Button1)
3)クラスウィザードよりクラスを作成(CSample.cpp/CSample.h)
4)メンバ変数を追加(OnLButtonDown,OnLButtonUp)
------------------------------
<質問>
ダイアログ上でマウス(左)ダウン/アップは認識できますが(デバッグで確認済み)、
プッシュボタン上だとダウン/アップが認識できません。
プッシュボタンのイベントではクリックかダブルクリックしかなく、
ダウン/アップの切り分けができません。
部品(プッシュボタン)の上はもうダイアログ上とは認識しないのでしょうか?
プッシュボタン上でのマウス(左)ダウン/アップの認識ができなことには何も始まらな
いとは思うのですが、それがよくわかりません。
過去ログにて「サブクラス化」という言葉が出てきました。
IDC_Button1にメンバ変数(m_Button1とします。)を追加することでその「サブクラス
化」になるとも。。
サブクラス化したところで処理を追加しないとプッシュボタン上でのマウスダウン/ア
ップの認識ができないということでしょうか??
そのあたりの関係がよくわかっていません。
どうぞ宜しくお願いしますm(__)m
> 部品(プッシュボタン)の上はもうダイアログ上とは認識しないのでしょうか?
Yes
ボタンもウィンドウの一種ですので、前面のウィンドウはダイアログではなくボタンです。
> プッシュボタン上でのマウス(左)ダウン/アップの認識ができなことには
> 何も始まらないとは思うのですが、それがよくわかりません。
多分、「単純にボタンが押されたときの処理が書きたい」だけ?なんでしょうか。
であれば、Windows UIの基本ルールでは、
・ボタン上でマウスをダウンし、
・アップされたときにそのボタン上にマウスがあれば、
押されたと認識します。
そして、この判定は、自分でわざわざやらなくてもボタンが勝手にやってくれます。
ボタン用のハンドラ(OnButton1みたいな奴。追加の具体的な方法はVCのバージョンで違う)を
作っておくと、ボタンが押された際にこっちに通知がきますので、
通常はボタンのUP/DOWNをプログラマが直接捕まえる必要はありません。
# ダウンした際に何か特別なことをしたいときとか、そういうときにしか要らない。
> サブクラス化したところで処理を追加しないとプッシュボタン上での
> マウスダウン/アップの認識ができないということでしょうか??
サブクラスの中(ボタンの方)では判断できますが、ダイアログとは直接関係ないです。
Banさん、早速のご回答ありがとうございます。
>ボタンもウィンドウの一種ですので、前面のウィンドウはダイアログではなくボタンで
す。
プッシュボタンもダイアログも同等の立場ということですね。
プッシュボタンはダイアログの中の部品だと思っていました。
>多分、「単純にボタンが押されたときの処理が書きたい」だけ?なんでしょうか。
最終的にしたいことは(細かくは書きませんが。。)
ButtonダウンでA=ONの処理、ButtonアップでA=OFFの処理
です。
Buttonダウン/アップの認識ができれば後は難しくないと思っています。
プッシュボタンもダイアログも同等であるとすれば、プッシュボタンの上でButtonダウ
ン/アップをとればいい。と言う考えですよね。。
となると、今のCSample.cppの中ではイベントがとれないので、
CButton1を1つのクラスとして処理すればOnLButtonDown/Upのイベントが処理できると
いうことでしょうか・・?
CSample.cppの中でさらにCButton1のクラスを生成させることができるのかな・・
このあたりを調べてみようと思います。
> CSample.cppの中でさらにCButton1のクラスを生成させることができるのかな
できるよ。
> IDC_Button1にメンバ変数(m_Button1とします。)を追加する
そうです。このことですよ。
class CSample : public CDialog
{
--略--
CButton m_Button1;
};
上記を下記のように変える。
#include button1.h
class CSample : public CDialog
{
--略--
CButton1 m_Button1;
};
無論CButton1を用意し、OnLButtonDown/Upのイベントが処理を作る。
後は過去ログにもあるように
ダイアログのボタン上で
マウスのボタンダウンしたまま
ダイアログやボタンからマウスがはみ出た場合ちゃんと
対策できているかどうかだな。(念のため)
> プッシュボタンもダイアログも同等の立場ということですね。
> プッシュボタンはダイアログの中の部品だと思っていました。
御意。コントロールの一つ一つも、HWNDを持つれっきとしたウィンドウです。
> ButtonダウンでA=ONの処理、ButtonアップでA=OFFの処理です。
押してる間だけON、離すとOFFということですね。
> プッシュボタンもダイアログも同等であるとすれば、
> プッシュボタンの上でButtonダウン/アップをとればいい。と言う考えですよね。。
御意。
私同じようなことをやっていたとき失敗しました
(1)CButton型のクラスをつくってそのなかにLButtondownやLButtonUpの
messageハンドラをつくってインスタンスつくっても はたらかないのです
ヒント:要するに作ったクラスをIDC_BUTTON1に関連づけていなかったのです
(2)プログラム閉じようとしても閉じられない
これには超初心者さんアドバイスの
>ダイアログやボタンからマウスがはみ出た場合ちゃんと
>対策できているかどうかだな。(念のため)
が役立ちます
もう解決されているかもしれませんがご参考までに
超初心者さん、Banさん、aharenさん、アドバイスありがとうございます。
1日外出していたため返事が遅れてしまいました。。
みなさんのご助言をもとに考えは正しい方向に進んでいることがわかりましたので、
明日、実際にソースで実践してみたいと思います。
経過は明日以降ご報告させていただきます。
まずは御礼まで、、ありがとうございました。
まりです。解決しましたのでご報告いたします。
<実装方法>
1)クラスウィザードから新規クラスを追加
基本クラス:CButton
クラス名:CButton1(.cpp/.h)
2)CSample.h内でCButton1.hを宣言
3)以下のように修正
------------------------------------------
class CSample : public CDialog
{
// CButton m_Button1; <-元の定義
CButton1 m_Button1; <-修正後の定義
}
------------------------------------------
4)CButton1.cpp内のOnLButtonDown/OnLButtonUpでイベントを検知する
上記↑を見直して見ると、皆さんからご助言いただいた内容そのもの・・・
報告するのも恥ずかしいっ(> <)
ご助言いただいた皆様、本当にありがとうございました。