ページ

2009年11月9日月曜日

[.NET] IDataObject を使ってドラッグ&ドロップとコピー&ペーストを実装

Creating something from nothing [Developer-friendly virtual file implementation for .NET!] より。
ネイティブコードでは IDataObject やら IDropSource やらといった COM インターフェースを使ってドラッグ&ドロップやコピー&ペーストを実装します。
WPF では System.Windows.DataObject が用意されていますが、これは存在するファイルしか扱えなかったり、DoDragDrop() メソッドが同期的だったりとネイティブコードでできることの一部の機能しか提供されていません。
この DataObject クラスは sealed なので拡張もできそうにありません。
System.Windows.IDataObject インターフェースは上記の DataObject クラスと同じメソッドしかないのでこれを使ってもどうにもなりそうにありません。

というわけで、System.Runtime.InteropServices.ComTypes.IDataObject インターフェースを実装するクラスを作ってフル機能のドラッグ&ドロップとコピー&ペーストを実装しよう、というのが上記の記事です。
こちらの IDataObject インターフェースは、まんま COM の IDataObject インターフェースです。(ネームスペースでわかるでしょうが)
こいつを実装しようとすると、FORMATETC だとか何だとかと 「ドラッグ&ドロップ程度のことが何でこんなにややこしいんだよ」 と思うくらい面倒だったりします。
記事中にあるリンクからサンプルプログラムをダウンロードできますが、ちょっと見てみたところ、IDataObject とそれに必要なものをだいたい一式実装しているようです。
もちろん、一つのクラスでドラッグ&ドロップとコピー&ペーストの両方に対応できるようになっています。(まぁ、もともとどちらも IDataObject を使うんですが)
Action<Stream> を渡しておいてドロップ時にファイルを生成したりといったこともできるようになっています。

ちなみに、サンプルプログラムは、左クリックでドラッグ&ドロップ、右クリックでクリップボードへのコピーになっています。

あと、
Creating something from nothing, asynchronously [Developer-friendly virtual file implementation for .NET improved!]
こちらの記事で、コンストラクタに Action を渡しておくとドラッグ&ドロップの開始時と終了時にその Action を呼び出してくれるという機能が追加されています。


0 件のコメント:

コメントを投稿