在CView中如何得到CMainFrame的指针呢?狂送分 在同一个软件中,CView与CMainFrame对象都是在程序一开始就创建出来的,我想在CView中存取CMainFrame中一些数据,实现两个对象的通信,就像在CView中得到文档指针实现数据交换一样。那么我在CView中应怎样得到CMainFrame对象的指针呢?用GetParent()和GetParentFrame()都不行。谢谢了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 全局函数AfxGetApp可以得到CWinApp应用类指针 AfxGetApp()->m_pMainWnd为框架窗口指针 在框架窗口中:CFrameWnd::GetActiveDocument得到当前活动文档指针 在框架窗口中:CFrameWnd::GetActiveView得到当前活动视图指针 在视图中:CView::GetDocument得到对应的文档指针 在文档中:CDocument::GetFirstViewPosition,CDocument::GetNextView用来遍历所有和文档关联的视。 在文档中:CDocument::GetDocTemplate得到文档模板指针 在多文档界面中:CMDIFrameWnd::MDIGetActive得到当前活动的MDI子窗口 可以这样:CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();OK! CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd() AfxGetApp()->m_pMainWnd为框架窗口指针 CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd()或AfxGetApp()->m_pMainWnd CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd()或AfxGetApp()->m_pMainWnd 还是不行,其实如果在CView中包含MainFrm.h ,然后声明一个框架类成员变量的办法我也会,但因各种原因,我无法用这种方法。我在CMainFrame类中声明了一些成员变量,是想在CView 类中直接获取其框架窗口指针从而得到这些变量。 foxmail(萧遥) 的方法我用过了,也就是AfxGetApp()->m_pMainWnd。发现指向的都是其原有的变量与函数,而我定义的那些变量却一个都看不到,其效果与GetParent()或GetParentFrame()的效果一样。我怎样才能找回我的那些自定义变量啊!!! 怎么会看不到呢?你直接用就行了----只要你添加的变量不是private就可以了!!实在不行的话,你直接用自定义消息的方式去存取cmainframe中的变量 用以下语句:CMainFrame *pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);就可以获得CMainFrame的自定义成员了。顺便问一下,为什么不用MFC的Document/View框架,把一些属性定义在Document中,这样在view中访问则易如反掌。(用CView::GetDocument())。 注意,不能用AfxGetApp()->GetMainWnd()或AfxGetMainWnd(),他们只能获得CMainFrame父类的指针,而且可能是一个临时对象的指针,即使用CMainFrame*强制返回结果,也访问获取在CMainFrame中自定义的成员。 注意,不能用AfxGetApp()->GetMainWnd()或AfxGetMainWnd(),他们只能获得CMainFrame父类的指针,而且可能是一个临时对象的指针,即使用CMainFrame*强制返回结果,也无法访问获取在CMainFrame中自定义的成员。 你如果不想包含MainFrm.h头文件的话,你就只能用发送消息的方法了在CMainFrame中将你的数据组织成一个struct类型的变量,然后在消息响应函数中直接返回该变量的指针或者引用,从而在view中可以使用其中的数据了 CMainFrame *pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd); 不想说了,大家都说完了,其实在mfc的document ,view,frame中每一个都可以随便访问另一个的没有什么障碍的,就拿从CView来访问说:AfxGetApp() or theApp --》CWinAppAfxGetMainWnd()---》CMainFrameGetParentFrame()--》CChildFrameGetDocument()---》CDocument而且外部的任何一个类,也都可以通过以Afx打头的一些函数访问文档视结构中的任何一个类, 感谢各位的热心,其实我遇到的问题也正如 “khwidesea(阔海)”所说的:“ 不能用AfxGetApp()->GetMainWnd()或AfxGetMainWnd(),他们只能获得CMainFrame父类的指针,而且可能是一个临时对象的指针,即使用CMainFrame*强制返回结果,也无法访问获取在CMainFrame中自定义的成员。”而CFrameWnd::GetActiveDocument和CFrameWnd::GetActiveView,AfxGetMainWnd()等等,得到的都是各个类的父类的函数和变量,我自定义的统统不生效。 难道我只能包含MainFrame.h,然后再生成一个CMainFrm对象吗?可我觉得这好笨,明明已有了现成的CMainFrm对象,还要重新生成一个,而且这样我自定义的变量都要换成static型了(为了保持变量的值不随对象不同而变)。 TO: khwidesea(阔海):我在CMainFrm中定义变量也是不得已,因为我用到了CDialog Bar组件,要用CMainFrm来管理,其中一些变化只能放在CMainFrm中的,但我却取不出来了,好郁闷。我也想过把其中的变量又转存到CDocument中,但又遇到上述同样的问题,得到的文档指针却是其父类的指针,又没了自定义的变量,又存不了了。 TO:psusong(爱因思念):你说的发送消息的方法是怎么回事,我看不懂啊。 大家还有什么好的办法,说出来讨论吧。 CMainFrame* pMainFrame = new CMainFrame;// pMainFrame = (CMainFrame*)GetParentFrame(); 或者 pMainFrame = (CMainFrame *)AfxGetMainWnd(); MainFrm.h... CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame;.....#include "MainFrm.h"void youfuction(){..CMainFrame* m_p = (CMainFrame*)AfxGetApp()->m_pMainWnd;..} 不是太明白。因为,用GetParent()得到的 的确是临时指针,最好方法是用pWnd->m_hWnd 和 FromHandle()来存取 句柄。指针是临时的,句柄是不会变的。或许你的问题就解决了 ((CMainFrame *)AfxGetApp()->GetMainWnd())-> 虽然最终还是得把MainFrm.h #include 到CView中,但zswzwy(←圣骑士!帕迪拉斯)lovetsinghua(瞌睡♂工作虫) 的方法很对,变量传递有同步性。很感谢各位的热心,谢谢,明天结贴了,谁还有不同意见不妨提出来。 TCP连接时,一方如何知道另一方【异常断开连接】? 请教,如何用Install shield 制作一个patch? 怎样使对话框里输入的数据带入程序 求助:怎么编程实现拖放文件动作? thumbs.db的数据库类型 #ifndef ???还有好多,什么意思呢? 关于字符串和缓冲区转换的问题…… 请问怎样把Flexgrid中的数据以Excell的格式打印,给分。 vc中的ATL与.net中的ATL有何不同? VC++ 网络连接超时现象 Panr(光荣) 近来拿分 500分 COM问题 接口问题:怎样用一个统一的接口来驱动一系列检索
AfxGetApp()->m_pMainWnd为框架窗口指针
在框架窗口中:CFrameWnd::GetActiveDocument得到当前活动文档指针
在框架窗口中:CFrameWnd::GetActiveView得到当前活动视图指针
在视图中:CView::GetDocument得到对应的文档指针
在文档中:CDocument::GetFirstViewPosition,CDocument::GetNextView用来遍历所有和文档关联的视。
在文档中:CDocument::GetDocTemplate得到文档模板指针
在多文档界面中:CMDIFrameWnd::MDIGetActive得到当前活动的MDI子窗口
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();OK!
或
AfxGetApp()->m_pMainWnd
或
AfxGetApp()->m_pMainWnd
你直接用就行了----只要你添加的变量不是private就可以了!!
实在不行的话,你直接用自定义消息的方式去存取cmainframe中的变量
CMainFrame *pFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);
就可以获得CMainFrame的自定义成员了。
顺便问一下,为什么不用MFC的Document/View框架,把一些属性定义在Document中,
这样在view中访问则易如反掌。(用CView::GetDocument())。
在CMainFrame中将你的数据组织成一个struct类型的变量,然后在消息响应函数中直接返回该变量的指针或者引用,从而在view中可以使用其中的数据了
随便访问另一个的没有什么障碍的,就拿从CView来访问说:
AfxGetApp() or theApp --》CWinApp
AfxGetMainWnd()---》CMainFrame
GetParentFrame()--》CChildFrame
GetDocument()---》CDocument
而且外部的任何一个类,也都可以通过以Afx打头的一些函数访问文档视结构中
的任何一个类,
难道我只能包含MainFrame.h,然后再生成一个CMainFrm对象吗?可我觉得这好笨,明明已有了现成的CMainFrm对象,还要重新生成一个,而且这样我自定义的变量都要换成static型了(为了保持变量的值不随对象不同而变)。
TO: khwidesea(阔海):我在CMainFrm中定义变量也是不得已,因为我用到了CDialog Bar组件,要用CMainFrm来管理,其中一些变化只能放在CMainFrm中的,但我却取不出来了,好郁闷。我也想过把其中的变量又转存到CDocument中,但又遇到上述同样的问题,得到的文档指针却是其父类的指针,又没了自定义的变量,又存不了了。
TO:psusong(爱因思念):你说的发送消息的方法是怎么回事,我看不懂啊。
大家还有什么好的办法,说出来讨论吧。
CMainFrame* pMainFrame = new CMainFrame;
// pMainFrame = (CMainFrame*)GetParentFrame();
或者
pMainFrame = (CMainFrame *)AfxGetMainWnd();
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
.....
#include "MainFrm.h"
void youfuction(){
..
CMainFrame* m_p = (CMainFrame*)AfxGetApp()->m_pMainWnd;..
}
不是太明白。因为,用GetParent()得到的 的确是临时指针,最好方法是用pWnd->m_hWnd 和 FromHandle()来存取 句柄。指针是临时的,句柄是不会变的。或许你的问题就解决了
lovetsinghua(瞌睡♂工作虫) 的方法很对,变量传递有同步性。很感谢各位的热心,
谢谢,明天结贴了,谁还有不同意见不妨提出来。