·
OLE Drag&Dropで画面をロックさせない実装
OLE ドラッグ&ドロップ(以下D&D)の実装を見直し中。
VC++(MFC)で何も考えずにD&Dを実装すると、D&D中はアプリケーションがロックされる。
普通のアプリケーションならロックされる時間は短いので気にならない。
但し、dddavのようなドロップ後に時間のかかる処理(ファイル転送)をしている場合にはそれが気になるのでロックされないように考える必要がある。
具体的には次の点をdddavでは実装していた。
- 時間のかかる処理(ファイル転送等)はスレッド処理する。
- ドロップ後は自前でメッセージループを回す。
但し、これだけだとD&Dを開始したコントロール(リストビュー)がロックされる。
これはWM_NOTIFYメッセージで受け取ったドラッグ開始の処理中の中でドロップ後の処理を行うため、コントロールに次のメッセージが送られてこないせいであるためと考えられる。
よって、この対策として次の点も現在実装中である。
- ドラッグの開始と同時に非表示のダミーウインドウにメッセージを投げ、そちらでドラッグを開始させる。
この他に、オートメーションのスレッドを立ててそちらでドラッグを開始する試みもしてみたが失敗した。
MFCのコード中で、メインスレッドかどうかのチェック判定をしているため別スレッドではドラッグが開始できないためである。
具体的にはmfc\oledrop1.cppのCOleDropSource::OnBeginDrag()の中に書いてある下記コードで判定していた。
// some applications steal capture away at random times
if (CWnd::GetCapture() != pWnd)