普通に(ファイルの)ドラッグ&ドロップを行うときは、プロジェクトを作るときにオートメーションを有効にしておき、
CWinAppクラスの中にCOleDataSource ods を作成(何故かアプリケーション終了時に破棄しないとASSORTが出たりメモリリークするので…)
構造体HDROPDataを定義。これはファイル1つだけの簡易版で、複数のファイルをドラッグするときはDROPFILES構造体の直後にNULL終端文字列でファイル名を並べ、最後にもう1つNULLを置きます(従って全データの終端はNULL2連続になります)。
#pragma pack(push,1)
struct _HDROPData {
DROPFILES df;
TCHAR fname[_MAX_PATH+1];
BYTE endofData;
};
#pragma pack(pop)
ドラッグ元のOnLButtonDownあたりで
struct _HDROPData HDROPData;
memset(&HDROPData,0,sizeof(HDROPData));
HDROPData.df.pFiles=sizeof(DROPFILES);
HDROPData.df.pt.x=0;
HDROPData.df.pt.y=0;
HDROPData.df.fNC=FALSE;
HDROPData.df.fWide=FALSE;
_tcsncpy(HDROPData.fname,ファイル名,長さ);
HGLOBAL hMem=GlobalAlloc(GHND|GMEM_ZEROINIT,sizeof(HDROPData));
if(hMem==NULL){return;};
LPVOID vp=GlobalLock(hMem);
if(vp==NULL){GlobalFree(hMem);return;};
memcpy(vp,&HDROPData,sizeof(DROPFILES)+ファイル名の長さ+2);
GlobalUnlock(hMem);
theApp.ods.CacheGlobalData(CF_HDROP,hMem);
DROPEFFECT result=theApp.ods.DoDragDrop(DROPEFFECT_COPY);
theApp.ods.Empty();
GlobalFree(hMem);
などとやってやればいいのですが(こんなOnLButtonDownを実装したCDragButtonクラスでも派生させておくといいでしょう)、なんか別スレッド立ててやると上手く行きません。
メイン以外のスレッドで同じ事をやるには、
CWinThreadクラスをオートメーションOnで作成し、
CWinThread::InitInstance内でAfxInit()を実行し(超強引… もっとましな手があったら教えてください)
COleDropSourceの派生クラス(CCustomDropSourceとしますが)を作成し、CWnd* pSourceWndメンバを作ってあらかじめドラッグ元のCWndのポインタを設定しておき、
BOOL CCustomDropSource::OnBeginDrag(CWnd *pWnd)
{
if(pSourceWnd==NULL){return COleDropSource::OnBeginDrag(AfxGetMainWnd());};
return COleDropSource::OnBeginDrag(pSourceWnd);
}
としておき、
CCustomDropSource cds;
DROPEFFECT result=theApp.ods.DoDragDrop(DROPEFFECT_COPY,NULL,&cds);
とDoDragDropの第3引数でポインタを渡してやればOKです。
2007-06-17 14:43:26[プログラミング]
この記事へのトラックバックURL: https://www.asmusic.jp/ASHARD/score/tb.cgi/yu-oishi/20070616_2
手動トラックバック