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と同じ方法でドロップを受け付けるようにするためには、数百行程度のコードを追加する必要がある。