以前の記事、非同期ドラッグ&ドロップ非実在ファイルをエクスプローラにD&Dするの続きです。

CFSTR_FILECONTENTSとCFSTR_FILEDESCRIPTORによるドラッグ&ドロップ操作で、1度に複数のファイルを送り出すようにするのが今回の話です。早速サンプルコードです。Gistへのリンクです。

1ファイル限定だった前回までと比べ、以下の点が変わっています。

  • FILEGROUPDESCRIPTORのメンバー変数FILEDESCRIPTOR fgd[]は可変長配列の構造なので、要素数をファイルの数まで増やす。
  • IDataObject::GetDataでCFSTR_FILEDESCRIPTORが要求されたとき、FORMATETC::lindexで何番目の要素か識別する。これはFILEGROUPDESCRIPTOR::fgdのインデックスと一致する。MSDNライブラリのShell Clipboard FormatsのCFSTR_FILECONTENTSのところに記載されている。

このような実装はSystem.Windows.Forms.DataObjectでは無理そうだったので、Windows Forms版のコードもIDataObjectを実装した独自のクラスを作るようにしました。ぱっと見た感じ、lindexに関する処理がほとんどなさそうでした。

このほか、EnumFormatEtcの実装にCreateFormatEnumeratorを使うように変えています。前回まではこの関数のことを知らなかったので、自前実装していました(と言ってもATL::CComEnumImplを使っていましたが)。

スポンサード リンク

この記事のカテゴリ

  • ⇒ 非実在ファイルのD&Dで複数ファイルを送り出す
  • ⇒ 非実在ファイルのD&Dで複数ファイルを送り出す
  • ⇒ 非実在ファイルのD&Dで複数ファイルを送り出す
  • ⇒ 非実在ファイルのD&Dで複数ファイルを送り出す
  • ⇒ 非実在ファイルのD&Dで複数ファイルを送り出す