ドロップ時の処理について。

[戻る]
匿名san 2005/07/22(金) 13:54:15
昨日から、質問責めで申し訳ありませんがまた一つ教えてください。
こんなUIを持つアプリを作ってます。(少しズレてますがご容赦を。)
┏━━━━━━━━━━━━━━━━┓
┃メイン画面(ダイアログ)        ┃
┃┏━┳━┳━┳━┓↓CTabCtrl    ┃
┃┏━━━━━━━━━━━━━┓   ┃
┃┃┏━━━━━━━━━━━┓┃   ┃
┃┃┃ダイアログ              ┃┃  ┃
┃┃┃ (タブ数分貼り付け)   ┃┃  ┃
┃┃┗━━━━━━━━━━━┛┃  ┃
┃┗━━━━━━━━━━━━━┛  ┃
┗━━━━━━━━━━━━━━━━┛
メイン画面(ダイアログ)にTabCtrlを張りTabCtrlの各タブには
子ダイアログを貼り付けております。子ダイアログではそれぞれ別
の拡張子のファイルを扱う画面です。
メイン・子ダイアログのプロパティの設定により、各クラスで
「OnDropFiles(HDROP hDropInfo)」が呼ばれる様に出来ましたが、
この関数を各クラスで呼ばれるのでは無く、常にどの画面でドロップ
しようとも、メイン画面(クラス)のOnDropFiles()が呼ばれる様に
したいです。
動作は全て同じ(どの画面であろうとドロップされた拡張子のファイルを
編集するタブを表示する。)なので、メンテ性等を考慮すると、
一元で管理するのが当然と思うのですが・・・。

この様に各クラスで同じメッセージを受け取り同じ関数で同じ処理をしたい
場合に一元で管理する方法はどのようにすれば良いのでしょうか?
他の場合(各ダイアログで同じ動作をするボタンが押された場合等)にも
応用が出来ると思ってますが、何かMFC特有の方法はあるのでしょうか?

各ダイアログとは別に自前でクラスを作って、その関数を呼ぶしかないのでしょうか?
MFC故にそのあたり簡単に出来るような方法が用意されてるのではないかと思って
質問させて頂きました。

VC6.0 Win2Kです。宜しくお願いします。

dairygoods 2005/07/22(金) 14:56:48
1. CDialogを派生して、共通部分だけを実装したオリジナルダイアログクラス
 を作ります。
2. 各子ダイアログは、CDialogの代わりに1で作ったオリジナルダイアログ
 クラスを派生して作ります。

これは、MFCの機能ではなく、C++の機能です。
クラスウィザードは手伝ってくれませんので、
自力でコードを書くことになります。

class C共通Dialog : public CDialog {
 ...
  afx_msg void OnDropFiels(...);  // 共通機能
};

class C子1Dialog : public C共通Dialog {
  ...
};

class C子2Dialog : public C共通Dialog {
  ...
};

PATIO 2005/07/22(金) 14:58:37
受け取った子ダイアログが親にウインドウメッセージを投げてやれば
解決しそうな気もしますが、だめですか?
ヒント程度に扱ってもらえれば、幸いです。

tib 2005/07/22(金) 14:59:24
・全ての子ダイアログに親ダイアログへのポインタを持たせておいて、
 子ダイアログのOnDropFiles()は親ダイアログのOnDropFiles()を
 呼ぶようにする。

・全ての子ダイアログは、親ダイアログの派生クラスという構成にする。

匿名san 2005/07/22(金) 15:48:11
楽して出来るわけでは無さそうですね。
でも難しい事をする訳ではないみたいなので・・・。

◎dairygoodsさん
子は「共通部分だけを実装した」クラスを見に行きますが、
親クラスもそのクラスを見に行けば良いって事でいいですか?
(結局は自作クラスをみんなで呼ぶって事ですね。)

◎PATIOさん
なるほど・・・子がWM_DROPFILESを受け取ったら、そのまま
SendMessage()で、親に送ってしまえと・・・。
子が受けた「HDROP hDropInfo」を引数で送れば良いって事ですね。

◎tibさん
>全ての子ダイアログに親ダイアログへのポインタを持たせておいて
これやりました。親クラスで、自分自身のクラスのポインタ持たせて、
ヘッダでextern宣言して子に使わせたのですが、関数がprotectedの為
呼べませんでした。。が

>全ての子ダイアログは、親ダイアログの派生クラスという構成にする。
「派生」って事をすっかり忘れてました。これいけそうですね。

色々方法ありますね・・・。どれも正しいのでしょうけども、
どれを使えばいいのか迷います。それぞれにメリットデメリットが
ありそうですが、まずはやってみます。
連発での質問ですが、ありがとうございました。m(__)m

試してみて出来たら報告後解決にします。

ゆう 2005/07/22(金) 16:02:38
コントロールの"ドラッグドロップを許可"のチェックをはすしておけば
普通にダイアログのOnDropFiles呼ばれますけど...

CTabCtrlは違うんですかね。

匿名san 2005/07/22(金) 16:21:35
◎ゆうさん
・・・ホントですね。。あっさり出来ました。
子ダイアログへのDROPも問題なく親が受けてます。
チェックボックスは自分でONにしたんだろうけど
いつ、何のためにやったのか思い出せない・・・(--;)

ちなみに、CTabCtrlでここをONにするとどういう動作になるんでしょうか?
TabCtrlがWM_DROPFILESを受けると思っていいのでしょうか?
受けた後どのような振る舞いをする/受けた後の処理の方法が気になります。


また、最初に・・・

>各クラスで「OnDropFiles(HDROP hDropInfo)」が呼ばれる様に出来ました

と、書きましたが、急に子ダイアログでWM_DROPFILESが受け付けなくなりました。
もうちょっと落ち着いてコーディングしないと・・・(--ゞ
取り合えず出来たので「解決」とさせて頂きます。
腑に落ちない点もありますが・・・。

皆さんありがとうございました。

ゆう 2005/07/22(金) 17:19:47
>チェックボックスは自分でONにしたんだろうけど
>いつ、何のためにやったのか思い出せない・・・(--;)

ONにしないとOnDropFilesは受け取れません。

逆にOFFにするとWM_DROPFILESがそのコントロールでは無視され、
その後ろにあるウィンドウに渡されるのだとと思います。

>ちなみに、CTabCtrlでここをONにするとどういう動作になるんでしょうか?
>TabCtrlがWM_DROPFILESを受けると思っていいのでしょうか?
そうなると思います。

>>各クラスで「OnDropFiles(HDROP hDropInfo)」が呼ばれる様に出来ました
>と、書きましたが、急に子ダイアログでWM_DROPFILESが受け付けなくなりました。
OFFにしているから当然そうなります。
これを受けつつ親でも受け付ける為には皆さんの説明するような方法になります。

匿名san 2005/07/23(土) 01:02:07
[[解決]]
なるほど。そういうことですか・・・
いろいろゃってみます。

皆さんありがとうございました。

古いスレッドには追加発言できません。