ドラッグ・アンド・ドロップの概要
クラス: wxDataObject, wxTextDataObject, wxDropSource, wxDropTarget, wxTextDropTarget, wxFileDropTarget
wxWidgets でドラッグ・アンド・ドロップを使用するには、setup.h で wxUSE_DRAG_AND_DROP を定義する必要があることに注意してください。
参照: wxDataObject の概要 と ドラッグ・アンド・ドロップのサンプル
クリップボードへの/からのデータ転送はドラッグ・アンド・ドロップによるデータ転送と非常に似ており、これらを実装するコードもほとんど同じです。特に、両方のデータ転送の仕組みとも、ある種の wxDataObject にデータを格納し、wxDataFormat クラスを使用してフォーマットを識別します。
ドラッグ元 になる、つまり、ユーザが他の場所へドラッグするデータを提供するには次の手順を実装します:
- 準備: まず最初に、データオブジェクトを作成し、ドラッグしたいデータで初期化する必要があります。以下に例を示します:
wxTextDataObject my_data("This text will be dragged.");
- ドラッグの開始 : (一般的にはマウスクリックに応じて) ドラッグ処理を開始するには、このように wxDropSource::DoDragDrop を呼び出す必要があります:
wxDropSource dragSource( this );
dragSource.SetData( my_data );
wxDragResult result = dragSource.DoDragDrop( TRUE );
- ドラッグ: (GiveFeedback 関数をオーバーライドして特別なことをさせない限り) DoDragDrop() を呼び出すと、ユーザがマウスのボタンを放すまでプログラムがブロックされます。同じ ドラッグ・アンド・ドロップ プロトコルを解釈するプログラム (Windows の任意のプログラム、もしくは X ウィンドウの XDnD プロトコルに対応しているプログラム) のウィンドウ内へマウスが入ると、対応する wxDropTarget 関数が呼ばれます。以下を参照してください。
- 結果の処理 : DoDragDrop() は wxDragResult 列挙型のいずれかの値を 影響コード (effect code) として返却します:
switch (result)
{
case wxDragCopy: /* データをコピーする */ break;
case wxDragMove: /* データを移動する */ break;
default: /* 何もしない */ break;
}
ドロップ先 になる、つまり、ユーザのドロップしたデータを受け付けるためには次の手順を実施します:
- 初期化 : ウィンドウをドロップ先にするには、ウィンドウを wxDropTarget オブジェクトへ関連付ける必要があります。通常はドロップ先へ関連付けるウィンドウの作成中に wxWindow::SetDropTarget を呼び出します。また、ドロップ先になるには wxDropTarget を継承し、純粋仮想関数をオーバーライドする必要があります。もしくは、wxTextDropTarget や wxFileDropTarget を継承し、それらのクラスの OnDropText() 関数や OnDropFiles() 関数をオーバーライドするようにしてください。
- ドロップ : ユーザがウィンドウ上でマウスを放すと、wxWidgets は関連付けられた wxDropTarget オブジェクトへ、そのデータを受け付けるか問い合わせます。このため、wxDataObject はドロップ先に関連付けられている必要があり、このデータオブジェクトはドラッグ元とドラッグ先で調整したフォーマットに従ったものになります。すべてがうまく行くと OnData が呼び出され、ドロップ先に所属する wxDataObject にデータが引き渡されます。
- 終了 : ドロップ時の <Ctrl>、<Shift>、<Alt> キーの状態に応じて、データ処理のあとに DoDragDrop() は wxDragCopy または wxDragMove のいずれの値かを返却します。今のところ、ドロップ先でこの戻り値を変更することはできません。