非実在ファイルのD&Dで複数ファイルを送り出す
カテゴリ: C++, C++/CLI, COM, VC++, シェルAPI. タグ: ATL, IDataObject, IDataObjectAsyncCapability, IDropSource, OLE, WTL.
コメントなし
以前の記事、非同期ドラッグ&ドロップと非実在ファイルをエクスプローラに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を使っていましたが)。
スポンサード リンク |