ツリービューでの右クリックによるドラッグアンドドロップでポップアップメニューを表示するには?

解決


saru  2004-08-12 09:30:34  No: 54190

タイトルの通り、ツリービューでドラッグアンドドロップ(右クリックによる)
した際、エクスプローラのようにドロップ時にポップアップメニュー("ここ
に移動"、"ここにコピー"、"キャンセル"等)を表示させて項目を選択できる
ようにしたいと考えています。

質問1:
まず右クリックでドラッグアンドドロップを出来るようにしようと思い
ました。左クリックによる通常のドラッグアンドドロップ状態は
OnBeginDragでハンドル出来るのですが、右クリックのドラッグアンド
ドロップ場合のメッセージはハンドルしていないようで同ハンドラは
呼ばれていません。どのように右クリックのドラッグアンド


saru  2004-08-12 09:46:54  No: 54191

以下上記"質問1"の続きです(書き途中で送信してしまいました、
失礼しました)

...
どのように右クリックのドラッグアンドドロップ状態をハンドルすれば
良いのでしょうか?ご指導宜しくお願い致します。

質問2:
ポップアップメニューをリソースエディタで作り表示は出来たのですが
(テストとしてOnRButtonUp(右クリックを離した時に呼ばれる)で表示する
ようにした)キャプションに入力したメニューの項目が選択された際に
その項目に対応する動作を起こしたいのですが、その場合の方法がよく
分かりません。ご指導宜しくお願い致します。

初めて質問を書くので説明不足な点や間違った用語等が含まれているかと
思います。説明の追記、訂正等致しますのでご指摘ください。
宜しくお願い致します。


とおり  2004-08-12 22:30:20  No: 54192

TVN_BEGINRDRAGでは?

メニュー項目に対するCOMMANDメッセージを処理すればよいかと
思います。

#VCのバージョンよって操作方法が異なってくると思うので
#OSやVCのバージョン・MFCの使用等も書いておいたほうが良いかと
#思います
#自分は.netだと答えられませんが。


saru  2004-08-13 06:59:42  No: 54193

とおりさん、ご指導ありがとうございます。
また、返信が遅くなってしまい誠に申し訳ありません。
開発環境はWindowsXP , VC++6.0 , MFC使用です。

質問1の対処:
右クリックでのドラッグは教えて頂いたとおりTVN_BEGINRDRAGでした。
メッセージマップに追加してハンドラを実装したところ動作を確認
出来ました。

質問2の対処と追加の質問:
OnCommandを追加し、ポップアップメニューの項目を
選択するとハンドラが呼ばれることを確認出来ました。
さらに初歩的な質問なのですが、メニューの項目を識別しそれぞれの処理を
行いたい場合は引数の"WPARAM wParam"の値とメニュー項目のIDと同じかどうかをチェックし、それによってどのメニューが選択されたかを判定し、
同関数内でやりたい処理をやるというやり方で良いのですか?
VCでの開発が初めての為、実装の仕方がよく分からずにこんな質問を
しています。くだらなかったら流してください。
もうひとつ聞きたいのですが、OnCommandの第二引数のlparamの説明を
MSDNで見ると"コントロールからメッセージが送られるときの
コントロールを識別します。それ以外のときは、lParam は 0 です。"
と書いてあるのですが意味がよく判りません。
識別されるコントロールというのは私の場合はポップアップメニューの
ことだと思うのですが、そのメニューのIDが渡されてくるのでしょうか?
デバッカで追うとLParamには0が渡ってきています。この0は何を意味
しているのですか?
ご指導宜しくお願い致します。


とおり  2004-08-14 02:13:03  No: 54194

VC6で私がいつも利用している方法です。
#新規でプロジェクト作ってみると確認しやすいです。

リソースにメニュー追加
ID(例えばID_MENUTEST)・キャプションを設定

クラスウィザードを起動(ctrl +w)
クラスの追加ウィンドウで「既存クラスの選択」選択
クラスの選択で、CxxxDlgを選択
#使いまわすなら新規で

MFC ClassWizardが表示されます。
オブジェクトIDにID_MENUTESTが追加されているはずなので選択
メッセージ「COMMAND」「UPDATE_COMMAND_UI」のうち
「COMMAND」を選択して関数の追加
→OnMenuTest()が作成される

関数内に実行したい処理を記述
ex:
AfxMessageBox("test");

OnCommandの方はよくわかりません。すいません


とおり  2004-08-14 03:58:22  No: 54195

追加です。
ダイアログベースで作成している前提で書いてます。

ダイアログのリソースのプロパティの一般タブ「メニュー」のコンボから
先ほど作成したメニューを選択して実行です。
#これやらないと確認できないですね。

ポップアップで表示した場合も同じように出来ると思います。


saru  2004-08-14 10:08:47  No: 54196

とおりさん、詳細な説明ありがとうございます、とても助かりました。
教えて頂いた通りの方法でテストしてみたらばっちりでした。
また質問をしても良いでしょうか?クラスウィザードを起動してクラスの
選択のところでCxxxDlgを選択する理由はなぜでしょうか?
テストとしてCxxxDlg以外のクラスを指定して関数を作ったのですが、
メニューの項目選択時に項目のIDに対応する関数が正常に呼び出され
ました(私がCxxxDlgを指定しなかった理由は今回このCxxxDlgクラスを
何もいじっていなかった為、出来ればいじる箇所をまとめておきたい
という理由からです。)
CxxxDlgを指定する理由を教えて頂けますか。非常に初心者らしい質問で
恐縮ですが宜しくお願い致します。


saru  2004-08-17 20:16:39  No: 54197

やりたかったことは教えて頂いた内容で出来ましたので、
『解決』です。
とおりさんご親切にありがとうございました。
最後の疑問点は引き続き調査致します。
どうもありがとうございました。


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

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






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