1

我在 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 应用程序是空的,这已经发生:我将文件拖放到应用程序中并打开它。如果我在文档窗口已经打开时尝试相同的拖放操作,它会如上所述崩溃而不是打开它。我尝试了多种解决方案来覆盖此行为,但没有一个有效:

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

这些都不能阻止 RichEdit 进行放置操作(和崩溃),它们似乎根本没有效果。我想要的只是让 CRichEditView/CRichEditCtrl 不拦截删除的文件,而是让它从 CMainFrame/CMDIFrameWndEx 拦截。

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

4

2 回答 2

1

ACRichEditView需要CRichEditDoc.

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

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

而这里又进行了详细的说明

于 2019-12-31T10:09:12.850 回答
0

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

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

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

于 2020-01-02T23:22:30.127 回答