拖放我的MDI被CRichEditView拦截并在CRichEditView::GetDocument中崩溃 - 如何覆

Drag and drop in my MDI is intercepted by CRichEditView and crashes in CRichEditView::GetDocument - how do I override it?

本文关键字:CRichEditView GetDocument 崩溃 何覆 MDI 我的 拖放      更新时间:2023-10-16

我在MFC中编写了一个MDI应用程序,其中文档窗口包含CRichEditView等内容。 当我将文件拖到文档窗口中,到CRichEditView上时,它在这里崩溃(来自afxrich.inl(:

_AFXRICH_INLINE CRichEditDoc* CRichEditView::GetDocument() const
{
AFXASSUME(m_pDocument != NULL);
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRichEditDoc)));   <<< crash!
return (CRichEditDoc*)m_pDocument;
}

崩溃的发生是因为m_pDocument不是CRichEditDoc(它是由CDocument派生的一类我的(。

但是,我不关心 RichEditView/Ctrl,我想要的是当我将文件拖放到应用程序中时,它只是作为文档打开。如果我的 MDI 应用为空,则已发生这种情况:我将文件拖放到应用中,然后它就会打开。如果我在文档窗口已经打开时尝试相同的拖放,它会如上所述崩溃而不是打开它。 我尝试了多种解决方案来覆盖此行为,但没有一种有效:

  • 拦截 OnDragEnter 从(我的扩展(CRichEditView
  • 使用 ON_NOTIFY_REFLECT(EN_DROPFILES,OnEnDropFiles(
  • 从 CRichEditView 在 CRichEditCtrl 上调用 DragAcceptFiles(false(
  • 在 CRichEditCtrl 和 CRichEditView 句柄上调用 RevokeDragDrop((
  • 从 CMainFrame/CMDIFrameWndEx 调用 DragAcceptFiles(true(

这些都无法阻止 RichEdit 执行删除操作(并崩溃(,它们似乎根本没有效果。 我想要的只是让CRichEditView/CRichEditCtrl不拦截丢弃的文件,而是让它从CMainFrame/CMDIFrameWndEx拦截。

有谁知道如何解决这个问题?

CRichEditView需要CRichEditDoc

如果您不需要CRichEditView请使用您自己的CView实现并包含所需的消息。

这是一个很好的MFC拖放示例。

这是另一个详细的描述。

经过大量的试验和错误,这就是最终对我有用的:

  • 使用CRichEditDoc而不是xMRI建议的CDocument,这摆脱了一些问题
  • 在扩展 CRichEditView 的类的OnCreate中添加DragAcceptFiles(false(
  • 在扩展 CRichEditView 的类中实现QueryAcceptData,并让它返回S_FALSE
  • 在扩展 CRichEditView 的类中添加OnDropFiles处理程序 (WM_DROPFILES(

现在,每当我将文件放入应用程序中时,所有这些都已到位,即使它们在 RichEdit 上,它们仍然会被主框架截获并在 MDI 中作为新文档打开。这也禁止在不删除文件的位置拖放(例如,从记事本拖放一些文本(。