我在 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 拦截。
有谁知道如何解决这个问题?