ページ 11

【VC++】特定のエディットコントロールだけD&Dを許可したい。

Posted: 2016年6月12日(日) 14:28
by kame
お世話になります。

VS2015 VC++ ダイアログGUI作成において、
特定のエディットコントロールにだけファイルのD&Dを許可し、
どのエディットコントロールにD&Dされたか検出する方法で、一番ベターな方法は何でしょうか?
(PreTranslateMessageを使う方法しかないでしょうか?)

ネットでよくある以下方法だとダイアログすべてに対してD&Dが許可され、どこにD&Dされたか検出できないですよね?
・クラスウィザードでダイアログクラスに「WM_DROPFILES」メッセージのハンドラーを追加する。
・OnInitDialogでDragAcceptFiles()をコールする。
 ↑リソースエディター上で[Accept Files]をTrueしてもいいが、エディットコントロールだけTrueにしても、
  親ダイアログもTrueじゃないとイベントが検出されない。→結果ダイアログすべてがD&D許可される。
・OnDropFiles上で任意の処理を記述する。

よろしくお願いします。

Re: 【VC++】特定のエディットコントロールだけD&Dを許可したい。

Posted: 2016年6月12日(日) 20:19
by Bull
まず最初に確認したいのですが、MFC を使用しているのですよね。
質問の内容から何となく MFC を使用している感じがしました。

以前に特定のコントロールのみのドラッグ&ドロップをするプログラムを
作った記憶があったので、古いソースを漁ってみたら、VC6のソースが
見付かりました。バージョンもかなり前ですし、エディットコントロールに
ではなく、コンボボックスが対象ですが基本的には変わらないのでは
ないかと思います。

大雑把に言いますと、リソースエディタでドラッグドロップを許可する
にして、コントロール(コンポボックス)をサブクラス化していました。
MFC でしたらコントロールのサブクラス化はそんなに面倒ではない
と思いますが、最近は MFC ベースのプログラムを作ってないので、
かなり無責任モードです。

サブクラス化がベターな方法かどうかはわかりませんが、派生した
エディットコントロールのクラスでいろいろできますので、
PreTranslateMessageを使うよりは、小回りがきくのではないかと
と思います。

Re: 【VC++】特定のエディットコントロールだけD&Dを許可したい。

Posted: 2016年6月13日(月) 23:15
by kame
Bullさん

仰る通りMFCです。
コントロールのサブクラス化、試してみたところ割と簡単にできました。
PreTranslateMessageでやるよりこちらのほうが良さそうですね。
ありがとうございました。