怎样得到视图指针? 建一个多文档的MFC(model)程序后,在这个程序里有自动产生的CModelView,CModelDoc,CMainFrame几个类,新建一个Dialog,在这个Dialog的一个按钮事件里想要得到这个程序的几个view指针,也就是程序刚开始自动产生的那个view的指针,怎么得到? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 (CYourView*)GetActiveView();别忘了包含YourView.h和YourDoc.h。 可是这样获取的指针是空的啊!这是我的程序:CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;CModelView *pV = (CModelView *) pFrame->GetActiveView();if (pV == NULL){ AfxMessageBox("null pV"); return;}这样也是得到空指针:CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;CMDIChildWnd *pChild = (CMDIChildWnd *) pFrame->GetActiveFrame();CModelView *pV = (CModelView *) pFrame->GetActiveView();if (pV == NULL){ AfxMessageBox("null pV"); return;} 全局变量CModelView *pV;在CModelView的构造函数中pV=this,以后就可以在任何地方使用pV了。 为什么不能直接用了,现在AfxGetApp() 得到的是全局变量app的指针,我跟踪过是有这个指针,然后: AfxGetApp()->m_pMainWnd;也得到了,这个指针也存在,但是, 在通过 GetActiveView();会得到空指针。我认为的原因是,现在在对话框中时,没有一个View是激活的,也即GetActiveView()是没有的,为空。上面说用一个全局变量来,我同意,但是不妥。我建议在CYourApp中加上一个变量CYourView * pv, 由它来保存刚才的VIEW指针,这样就可将此信息封装,从而使得代码有很好的移植性。 上面我说的有的错了,我再次创建了一个DOC/VIEW机制,发现可以获得GetActiveView()指针,不需要任何变量。不过注意的是应该包含头文件:#include "MainFrm.h"#include "TestViewDoc.h"#include "TestViewView.h"例: CTestViewView *pv; pv= (CTestViewView *) ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView(); if(pv == NULL) AfxMessageBox("HILLO"); else pv->m_pPrintString(CString("I LOVE YOU"));其中:CTestViewView::m_pPrintString(CString &str);代码如下:void CTestViewView::m_pPrintString(CString &str){ CClientDC dc(this); CRect rect; GetClientRect(&rect); dc.DrawText(str, str.GetLength()+1, rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);}主要用来输出一些信息.我没发现任何错误。 TO:: wu4long() 我返回的还是null啊?! 这种做法不妨试一下1、向CModelApp类中添加一个CModelView类的成员变量 CModelView m_pMyView;2、在CModelView的构造函数中,添加如下语句 (CModelApp *)AfxGetApp()->m_pMyView = this;3、当需要使用View的指针时, (CModelApp *)AfxGetApp()->m_pMyView->XXXFunction(...); wu4long()说的在单文档程序中可以让指针不为空,但是在多文档中却为空的,我试过,为什么会出现这种情况呢? CMDIChildWnd * pChild = ((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive(); if ( !pChild ) return NULL; CView * pView = pChild->GetActiveView();我的程序一直这么用,没有问题的 View指针已得到。在定义CMyView* pV的文件中必须按顺序包含:MainFrm.h,myDoc.h,myView.h三个文件,否则定义pV会出错,按这个问题郁闷了半天! 用CButton的Create方法生成了一个按扭,如何添加事件呢? 写了一个小程序,怎么不行啊,急死了,请高手帮忙看下啊!!!谢谢。。。 怎么办啊!DeleteFile怎么找回来?? 问:程序运行的时候谁调用OnDraw()函数(解答越详细越好)? 也是线程同步的问题 留个QQ吧(我是学VC,不久) 谁能提供介绍汇编学习的好的网站 有关CListCtrl控件 請問有沒有線程的Hook? 有多少程序员是搞CAD开发的??? 了解内存的泄漏。 串口接受的小程序,请教
别忘了包含YourView.h和YourDoc.h。
这是我的程序:
CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
CModelView *pV = (CModelView *) pFrame->GetActiveView();
if (pV == NULL)
{
AfxMessageBox("null pV");
return;
}这样也是得到空指针:
CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
CMDIChildWnd *pChild =
(CMDIChildWnd *) pFrame->GetActiveFrame();
CModelView *pV = (CModelView *) pFrame->GetActiveView();
if (pV == NULL)
{
AfxMessageBox("null pV");
return;
}
在CModelView的构造函数中pV=this,以后就可以在任何地方使用pV了。
AfxGetApp()->m_pMainWnd;也得到了,这个指针也存在,但是,
在通过 GetActiveView();会得到空指针。
我认为的原因是,现在在对话框中时,没有一个View是激活的,也即GetActiveView()是没有的,为空。
上面说用一个全局变量来,我同意,但是不妥。
我建议在CYourApp中加上一个变量CYourView * pv, 由它来保存刚才的VIEW指针,这样就可将此信息封装,从而使得代码有很好的移植性。
不过注意的是应该包含头文件:
#include "MainFrm.h"
#include "TestViewDoc.h"
#include "TestViewView.h"例:
CTestViewView *pv;
pv= (CTestViewView *)
((CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
if(pv == NULL)
AfxMessageBox("HILLO");
else
pv->m_pPrintString(CString("I LOVE YOU"));其中:CTestViewView::m_pPrintString(CString &str);
代码如下:void CTestViewView::m_pPrintString(CString &str)
{ CClientDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.DrawText(str, str.GetLength()+1, rect,
DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
主要用来输出一些信息.我没发现任何错误。
1、向CModelApp类中添加一个CModelView类的成员变量
CModelView m_pMyView;
2、在CModelView的构造函数中,添加如下语句
(CModelApp *)AfxGetApp()->m_pMyView = this;
3、当需要使用View的指针时,
(CModelApp *)AfxGetApp()->m_pMyView->XXXFunction(...);
((CMDIFrameWnd*)(AfxGetApp()->m_pMainWnd))->MDIGetActive();
if ( !pChild )
return NULL;
CView * pView = pChild->GetActiveView();
我的程序一直这么用,没有问题的