VS2005单SDI MFC DLL中获取Cc2viewDoc指针求助
获取Cc2viewDoc指针的可行方案
方案一:从主窗口指针获取视图与文档
既然你已经拿到主窗口指针(假设为CMainFrame* pMainFrame),SDI框架中主窗口的GetActiveView()方法可直接返回当前激活的视图指针,再通过视图的m_pDocument成员即可拿到文档类指针:
// 假设pMainFrame是已获取的主窗口指针 Cc2viewView* pView = dynamic_cast<Cc2viewView*>(pMainFrame->GetActiveView()); if (pView != nullptr) { Cc2viewDoc* pDoc = dynamic_cast<Cc2viewDoc*>(pView->m_pDocument); if (pDoc != nullptr) { // 此处可更新文档成员变量,例如 pDoc->m_a = a; pDoc->m_b = b; } }
注:若在非MFC线程环境调用,需确保先进入MFC线程上下文(SDI通常为单线程,大概率无需额外处理)。
方案二:通过应用程序对象获取文档模板与文档
之前用AfxGetApp()失败,可能是未正确遍历文档模板。SDI应用仅含一个文档模板,直接获取第一个即可:
CWinApp* pApp = AfxGetApp(); if (pApp != nullptr) { POSITION pos = pApp->GetFirstDocTemplatePosition(); CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(pos); if (pDocTemplate != nullptr) { POSITION docPos = pDocTemplate->GetFirstDocPosition(); Cc2viewDoc* pDoc = dynamic_cast<Cc2viewDoc*>(pDocTemplate->GetNextDoc(docPos)); if (pDoc != nullptr) { // 操作文档成员变量 } } }
SDI结构下GetNextDoc仅会返回一个文档对象,该方法可靠性较高。
方案三:通过窗口类名查找视图窗口
若主窗口指针获取存在问题,可通过视图类的窗口类名查找视图窗口,再转换为视图指针:
// 先用Spy++获取视图窗口的准确类名,替换下方的类名字符串 HWND hViewWnd = FindWindow(_T("Cc2viewView"), nullptr); if (hViewWnd != nullptr) { Cc2viewView* pView = dynamic_cast<Cc2viewView*>(CWnd::FromHandle(hViewWnd)); if (pView != nullptr) { Cc2viewDoc* pDoc = dynamic_cast<Cc2viewDoc*>(pView->m_pDocument); // 操作文档成员变量 } }
内容的提问来源于stack exchange,提问作者bill g
相关产品推荐
相关产品推荐

