ダイアログベースアプリで、プロパティシートの1ページ目と2ページ目にダイアログリ
ソースを配置してアプリを作成してます。
プロパティーシート上のダイアログにあるエディットボックスにDrag Dropしてファイル
パスを入力したいのですが、できません。。
ダイアログ上に配置されているEditBoxの「ドラッグアンドドロップを許可する」にもチ
ェックしてますし、取得側のEditボックスクラス(ユーザー拡張)でも、
DragAcceptFiles()
を呼んでDrag Dropを有効にしてます。
コンパイルして実行すると、ファイルをDragしてもDropOKなアイコンに変化しません。
(もちろん、OnOnDropFilesも呼ばれず・・)
一番下のダイアログとプロパティーシートで「ドラッグアンドドロップを許可する」チ
ェックした場合は、Drag Dropできるアイコンに変化するのですが。。
どうやらプロパティシートより上に配置されたコントロールがDrag Dropできない感じで
す。
どなたか原因ご存知の方いませんでしょうか?
よろしくお願いいたします。
環境抜けてました。。
Visual Studio 6.0 MFCのダイアログベースアプリです。
よろしくお願いいたします
そうなんだよな。
グループボックスとかタブとか囲むやつが邪魔。
タブオーダ変えても表示がおかしくならなければ
タブオーダ変えればいいじゃん。
もしだめなら、タブで受け取ってEditBoxへ渡すとか。
だがEditBox以外のところでもカーソルが
ドロップできる形状になってしまう欠点。
タブにリージョンつけて非矩形ウィンドウにするとか。
面倒だし昔のWindowsでは使えないな。
ホント困るよね。
エディットをサブクラス化してそこで処理すればできたと思います。
>> 超初心者さん
回答、有難うございます。
下のタブシートにDnD許可を与えると、アイコンがタブシートになっちゃいますね。
今のところメッセージが届かない理由探してますが、さっぱりです。
>> リンクさん
レス有難うございます。
Editボックスのサブクラスを作成して、そこでOnOnDropFilesを捉えようとしてるのです
がダメっぽいです。
アイコンも変わりませんし、タブシートの上にある全てのコントロールでメッセージを
受け取れないようです。。。
メッセージを中継するしかないでしょうか。。
すみません、訂正です。
正しくはプロパティーシートではなくタブコントロールの上にダイアログリソースを
SW_SHOW/SW_HIDEしている、でした。。
今まさしくそのような感じでコンボにドロップできるプログラムを作っていましたが
コンボをサブクラス化して普通にできますよ。
コンボに「ドラッグアンドドロップを許可する」をしてサブクラス化しただけです。
タブコントロールとかに「ドラッグアンドドロップを許可する」などはしてません。
WM_DROPFILES以外のメッセージはサブクラス化のプロシージャに届いてますか?
Editボックスクラス(ユーザー拡張)というユーザー拡張というのがよくわかりません
が
普通のエディットでないのだとしたら普通のエディットにしたらどうなりますか?
また、試しにコンボにしたらどうなりますか?
それともMFCとSDKにより何か違うのかな?
推測なので質問者の状況とは違うかもしれません。
Qさんの発言見ると、プログラムが正しいかどうか以前に
DropOKなアイコンになってくれていないわけだし。
なお、私は実際にプログラムを作成しているわけではなくて、
記憶を頼りにしているので間違えているかもしれません。
たぶんウィンドウの親子と、兄弟順に影響されない?
プログラムのつくりを変えれば対策できるってことかな。
でも個人的にはそんなことしなくてもすむように
OSが出来ていて欲しかった。
それに細かい部分でUI動作が変わる可能性を危惧する。
そうですね。
自分の場合もサブクラス化しなくてもアイコンはDropOKなアイコンに変更します。
まず、そこからですね。
ダイアログのタブオーダーでは無いかと思います。
おそらく、タブコントロールのタブオーダーの値のほうが、
Editボックスのタブオーダーの値より小さいのではないでしょうか。
値の大小の関係をを逆にしてみてください。
はずしていたらごめんなさい。
リンクさん、超初心者さん、ketamifuさん回答有難うございます!!
皆様のヒントからいくらか進展ありましたので、現状報告させていただきますm(_ _)m
<状況>
タブシートで2ページのダイアログを交互に切り替えています。
それぞれのページにDrag&Drop対象のEditボックスがあります。
それぞれのEditボックスはサブクラス化し、DragDropを処理するようにしてあります。
超初心者さんの発言どおり、兄弟順に問題があったようです。
タブシートに貼り付けているダイアログの親がタブシートではなかったので、タブシー
トを親にしたところ2枚目のダイアログ(インデックス1のダイアログに)Drag&Dropでき
るようになりました!
が、1枚目のダイアログへのDrag&Dropはいまだアイコン変わらずです。。
タブシートのインデックスは1枚目が0、2枚目が1としてInsertしています。
インデックスを入れ替えたところ、インデックスの大きい方のEditがDrag&Dropできるよ
うです。
タブオーダまだ見てなかったです。
今から見てみます!
タブオーダを変更すると、Drag&Drop出来るアイコンに変化するようになりました。
同じダイアログリソース内ではタブオーダの修正でOKのようです。
TabCtrl上のダイアログは、メンバ変数として宣言したダイアログオブジェクトに、ダイ
アログリソースを指定してクリエイトしたものを使っているので、タブオーダではどう
にもできない感じです。。
SetWindowPosでZ順を変えてもダメでした。
仕方がないので、TabCtrlを親windowにしていますが、TabCtrlを親にすると、タブシー
トの上にあるダイアログのコントロールクリックで固まってしまうことが分かりまし
た。
メッセージが届かなくなるようです。
どうやらTabCtrlを親にするのは不味いかもしれません。。
かなり根が深いような気がします。
下記URLにtabコントロールの実装方法と、DragDropメッセージが来ない原因がが載って
いました。
http://home.a03.itscom.net/tsuzu/programing/tips28.htm
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200411/04110069.txt
DragDropメッセージが届くようにするためには、親をTabCtrlにしなければならないよう
です。
ただ、親をTabCtrlにすると、TabCtrl上に貼り付けたエディットボックスなどをクリッ
クしたとき無反応になります。
# メッセージ0x0087の無限ループになります。
これは別問題のようですので、別スレッドにて質問させていただこうと思います。
回答いただいた皆さん、ありがとうございました。
すみません、誤りです。
TabCtrl上に貼り付けたダイアログリソ-ス上のエディットボックスなどをクリッ
クしたとき無反応になります。
でした。
完全解決しました。
前出のタブ順の方法に加えて、上に乗るダイアログリソースとTabCtrlを「親ウィンドウ
管理」にする必要があります。
ダイアログリソースについては、親ウィンドウの管理にチェックをつければよいです
が、TabCtrlについてはリソース上で親ウィンドウ管理にすることはできず、
コード上で
pTabCtrl->ModifyStyleEx(0, WS_EX_CONTROLPARENT);
とする必要があります。