应用程序类怎样获取文档类的指针?

removefile 2013-02-01 02:55:56
CtestDoc* pdoc =(CtestDoc*) ((CMainFrame*)(AfxGetApp()->m_pMainWnd ))->GetActiveDocument();

ASSERT_VALID(pdoc);

这句代码在应用程序类中,编译通过,运行到断言处就出错,这是怎么回事啊?我是新手,到底怎样在应用类调用文档类指针呀?求高手指点
...全文
145 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
RedSunIT 2013-02-02
  • 打赏
  • 举报
回复
sha_jinhao 正解
rxguoblp 2013-02-01
  • 打赏
  • 举报
回复
GetActiveDocument();
removefile 2013-02-01
  • 打赏
  • 举报
回复
问题解决了!多谢sha_jinhao了,本人刚学MFC,不知有没什么好教材推荐?
jimette 2013-02-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/sha_jinhao/article/details/8473434 、获取应用程序指针   CMyApp* pApp=(CMyApp*)AfxGetApp(); 2、获取主框架指针   CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针   CMainFrame* pMainFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);   或者   CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); 3、获取菜单指针   CMenu* pMenu = AfxGetMainWnd()->GetMenu(); 4、获取工具栏、状态栏指针   主框架中可以直接使用m_wndToolBar、m_wndStatusBar   其他:   CToolBar* pToolBar = (CToolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);   CStatusBar* pStatusBar = (CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR); 5、获取控件指针   先用 GetDlgItem() 再转换,如:   CButton* pButton = (CButton*)GetDlgItem(IDC_MYBUTTON); 6、获取文档、视图指针 SDI: CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); CYourDoc* pDoc = (CYourDoc*)pMainFrame->GetActiveDocument(); CYourView* pView = (CYourView*)pMainFrame->GetActiveView(); MDI: CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); CChildFrame* pChildFrame = (CChildFrame*)pMainFrame->GetActiveFrame(); CYourDoc* pDoc = (CYourDoc*)pChildFrame->GetActiveDocument(); CYourView* pView = (CYourView*)pChildFrame->GetActiveView(); 7、文档、视图 从视图获取文档指针: CYourDoc* pDoc = GetDocument(); 从文档获取视图指针: 利用成员函数 GetFirstViewPosition() 和 GetNextView() 遍历 virtual POSITION GetFirstViewPosition() const; virtual CView* GetNextView(POSITION& rPosition) const; SDI: CYourView* pView; POSITION pos = GetFirstViewPosition(); pView = GetNextView(pos); MDI: 定义函数 CView* CYourDoc::GetView(CRuntimeClass* pClass) { CView* pView; POSITION pos=GetFirstViewPosition(); while(pos!=NULL) { pView=GetNextView(pos); if(!pView->IsKindOf(pClass)) break; } if(!pView->IsKindOf(pClass)) { AfxMessageBox("Connt Locate the View."); return NULL; } return pView; } 使用如下: CYourView* pView=(CYourView*)GetView(RUNTIME_CLASS(CYourView)); 8、文档模版、文档 从文档获取文档模版指针: CDocTemplate* GetDocTemplate() const; 从文档模版获取文档指针: viaual POSITION GetFirstDocPosition( ) const = 0; visual CDocument* GetNextDoc(POSITION & rPos) const = 0; 9、获取分割视图中各个视图的指针 主框架中定义:CSplitterWnd m_wndSplitter; 定义两个View类:CView1、CView2 框架类中重载: BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext) { VERIFY(m_splitter.CreateStatic(this,2,1)); //分割成两行一列 VERIFY(m_splitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100),pContext)); VERIFY(m_splitter.CreateView(1,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext)); return TRUE; } 获取分割视图指针 CView1* pView1 = (CView1*)m_wndSplitter.GetPane(0,0); CView2* pView2 = (CView2*)m_wndSplitter.GetPane(1,0); 10、通过鼠标获得子窗口指针 CWnd* ChildWindowFromPoint(POINT point) const; CWnd* ChildWindowFromPoint(POINT point,UINT nFlags) const; 用于确定包含指定点的子窗口 如果指定点在客户区之外,函数返回NULL; 如果指定点在客户区内,但是不属于任何一个子窗口,函数返回该CWnd的指针; 如果有多个子窗口包含指定点,则返回第一个子窗口的指针。 还要注意的是,该函数返回的是一个伪窗口指针,不能将它保存起来供以后使用。 对于第二个参数nFlags有几个含义: CWP_ALL file://不忽略任何子窗口 CWP_SKIPNIVSIBLE file://忽略不可见子窗口 CWP_SKIPDISABLED file://忽略禁止的子窗口 CWP_SKIPRANSPARENT file://忽略透明子窗口 在获取视类的指针时,需要在需要获取类的cpp文件前面加入#include "***View.h",这样编译时会报错,解决方法是在视类的cpp文件前面加入#include "***Doc.h

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧