ここの過去ログ検索でドラッグ&ドロップのやり方を見て画像のドラッグ&ドロップのやり方は分かりましたが、このままだとどこにでもドロップしてしまいます。
ドロップする場所を指定したい場合は、座標指定をしなければならないのでしょうか?良い方法、もしくはサンプルなどありましたらよろしくお願い致します。
> ドロップする場所を指定したい場合は、
場所を指定…ですか?
位置決めは、ユーザーがマウス操作で行うものですよね。
プログラムから制御するようなものでは無いと思いますけれども。。。
> 良い方法、もしくはサンプルなどありましたらよろしくお願い致します。
質問の意図が良く分からなかったので、回答になっているかどうかは分かりませんが…。
VB5/VB6向け
http://www.microsoft.com/japan/developer/library/jptech/MSDNNews/drgdrp.htm
VB.NET向け
http://www.microsoft.com/japan/msdn/library/ja/Vbcon/html/vbcondragdropchangesinvisualbasic70.asp
説明が下手ですいません・・・。(謝
画像のドラッグの移動は
「ドラッグで移動・サイズ変更可能なコントロールを作成するには?」の過去ログを見てできましたが、
この過去ログにのっているサンプルを実行すると画像はどこにでも移動してしまいます。それを指定した場所にしか画像を移動できないようにしたいのです。
指定外のところに画像を移動させようとすると×のマークがでるみたいに・・・。
う〜ん・・・説明むずかしいですねぇ〜・・・。
ペイント(ブラシ)の画像選択時のような状況で、
キンバスから画像がはみ出たときに、カーソルを×にしたい…ということでいいでしょうか?
ドラッグしながら画像を表示する方法は、わかっているものとして省略しますが、
マウスカーソルが移動するたびにカーソル位置を調べ、ドラッグ可能領域かどうか検査、
もしドラッグ禁止領域ならばカーソルを変更して×印に…ということでいいんじゃないでしょうか?
ここのサンプルにあったと思いますが、一時的にAPIでマウスカーソルの移動を制限するのも手…かな。
環境がわからないので、とりあえずVB6を例に挙げてみます。
VB6でのドラッグ処理には、
(1) MouseMoveイベントを使って、自力でドラッグ処理を実装する。
(2) DragDropイベントを使って、旧式のドラッグ処理を実装する。
(3) OLEDragDropイベントを使って、OLEドラッグ処理を実装する。
という、3種類の実装パターンがあります。
ここでは、先に示したURLにある「OLEドラッグ」について解説してみます。
> 指定外のところに画像を移動させようとすると×のマークがでるみたいに・・・。
例えば、Image1 の画像をドラッグする際に、Picture1 にはドロップ可能、
Picture2 には不可、とするなら、以下のようになります。
-----------
新規プロジェクトで、FormにPictureBoxを2つ、Imageを1つだけ貼ってください。
そして、Image1にだけ画像を指定しておき、さらに以下のように設定します。
Image1 …… OLEDragMode は [自動] にしておいてください。
Picture1 …… OLEDropMode を [自動] に設定しておいてください。
Picture2 …… OLEDropMode を [なし] のままにしておいてください。
# Image がドロップ元(ソース)、PictureBoxがドロップ先(ターゲット)となります。
# なお、「OLEDragMode」と「OLEDropMode」を混同しないように注意してください。
# 前者はドラッグ元(ソース)に指定し、後者はドロップ先(ターゲット)に指定します。
-----------
設定が完了したら、それを実行してみてください。
[Ctrl]を押しながらドラッグすれば、Image1の画像がPicture1にコピーされ、
[Ctrl]無しでドラッグすれば、Image1の画像がPicture1に移動されます。
これは、自動ドラッグモードを利用した、簡易的なドラッグ処理です。
融通がきかないので、細かい設定には不向きですが、プログラムを
1行も書く事無く、ドラッグ動作を実装できます。とても簡単ですね。
しかし、自動モードでは細かい指定ができません。
そういう時には、手動モードの出番です。
# 長くなるので、投稿を2回に分けます。m(_ _)m
# 先の投稿の続きです。
OLEドラッグに関しては、クリップボードを想像してもらうと
理解しやすいかも知れません。たとえば、ワードパッドで適当な文書を書き、
太字や色付けなど、任意の書式設定を施したとします。
これをクリップボードに「コピー」すると、クリップボードには
「テキスト形式」と「リッチテキスト形式」の2つのデータが含まれます。
この場合、
・[メモ帳]に貼り付けると、テキストが出力される。
・[ワードパッド]に貼ると、書式付のテキストが出力される。
・[ペイント]には貼れない。(画像形式が含まれていないので)
という事になります。(ここまではわかりますよね)
OLEドラッグの場合も、これと同じ事が行われています。
データ形式によって、ドロップ可能かどうかが判断されるのです。
手動OLEドラッグを開始する(OLEDragMode=手動で、OLEDragメソッドを呼びだす)と、
ドラッグ元(ソース)のOLEDragDropイベントが発生します。
このイベントで、「データ形式」を Data As DataObject に渡してあげます。
また、コピー/移動のどちらかを示すための Effect 引数も指定します。
(なお、クリップボード同様、DataObjectには複数のデータ形式を同時に格納できます)
そうすると、それぞれのドロップ先(ターゲット)では、DataObject の内容を判断して、
『処理できるデータ形式が含まれている』→ドラッグ可能なカーソルアイコンになる
『処理できるデータ形式が含まれていない』→カーソルが進入禁止アイコンになる
という処理が、Windowsによって自動的に行われる事になるのです。
ターゲットが自動ドロップ(OLEDropMode=自動)になっているなら、
・PictureBoxなら、DataObjectに画像形式のデータがあるとき
・TextBoxなら、DataObjectにテキスト形式のデータがあるとき
などに「ドロップ可能」となり、それ以外は「ドロップ不可」となります。
そしてターゲットが手動ドロップ(OLEDropMode=手動)になっている場合、
マウスが重なった時に、ターゲットでOLEDragOverイベントが発生します。
OLEDragOverで、DataObjectの中身を判断する事で、データをドロップ可能か
どうかを、ソースに伝えることができます。
サポートしていないデータだったなら、Effect引数にvbDropEffectNoneを
指定すれば、自動的に「×」の進入禁止カーソルが表示されます。
なお、手動ドラッグ/手動ドロップを使ったOLEドラッグ&ドロップの
コーディング方法は、先にも書いた、下記のURLを参照してください。
http://www.microsoft.com/japan/developer/library/jptech/MSDNNews/drgdrp.htm
なお、DataObjectには独自定義のデータ形式を渡すこともできます。
その場合、DataObjectのメソッド(SetDataやGetFormat)に渡すデータ形式として、
標準の vbCFText や vbCFBitmap などといった定数の替わりに、
RegisterClipboardFormat APIを使って定義した値を使うことができます。
ユーザー定義形式でのデータのやり取りに関しては、MSDNライブラリの
『ユーザー定義のデータ形式の作成』の項を参照してみてください。
[Visual Studio 6.0 ドキュメント]
└[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
└[プログラミング ガイド]
└[Visual Basic を使ってできること]
└[マウス イベントおよびキーボード イベントへの応答]
└[OLE ドラッグ アンド ドロップ]
└[ユーザー定義のデータ形式の作成]