CHtmlView で独自のドラッグ&ドロップする方法
CHtmlViewを使っている場合、そのままでは自分のViewクラスの OnDragEnter や OnDrop が呼ばれない。
以下のように、OnGetDropTarget をオーバーライドして、自分が管理している IDropTarget を返してやればよい。
class CMyView : public CHtmlView
{
・・・省略・・・
virtual HRESULT OnGetDropTarget(LPDROPTARGET pDropTarget, LPDROPTARGET* ppDropTarget);
COleDropTarget* m_pDropTarget;
};int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
・・・省略・・・(後始末なども省略)
m_pDropTarget = new COleDropTarget;
m_pDropTarget->Register(this);
}// この OnGetDropTarget をオーバーライドするのがポイントだ
HRESULT CMyView::OnGetDropTarget(LPDROPTARGET pDropTarget, LPDROPTARGET* ppDropTarget)
{
*ppDropTarget = (LPDROPTARGET)m_pDropTarget->GetInterface(&IID_IDropTarget);
if (*ppDropTarget == NULL) {
return E_FAIL;
}
// 呼び出し側でReleaseするようなので、ここでAddRefしたままで良い。
// (自分でReleaseするとおかしなことになる)
(*ppDropTarget)->AddRef();
return S_OK;
}
これにより、 CMyView の OnDragEnter とか OnDrop が呼び出されるようになる。
CDhtmlDialog でも同様のやり方ができるかと思ったのだが、CDHtmlDialog には OnGetDropTarget がない。
ということは同じやり方はできない。
別の記事で書いたが、CHtmlViewと同じ方法でドロップを受け付けるようにするためには、数百行程度のコードを追加する必要がある。