MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView)指针

MFC如何在文档(CXXXDoc)类或框架(CMainFrame)类中获得视类(CMyView)指针

在文档类中只要使用(多文档的,单文档的更简单一点儿)
POSITION pos=this->GetFirstViewPosition();//要写在文档类中,在其他类中把this换成文档指针就可以了
while(pos)
{
CView *pView=this->GetNextView(pos);
}
而在框架类中只要选取得文档对象,然后再使用上面的代码
以下是从一个对象得到另一个对象有方面(摘自MFC深入浅出)
从一个对象得到另一个对象的方法

本对象 要得到的对象 使用的成员函数
CDocument对象 视列表 GetFirstViewPosition,GetNextView
文档模板 GetDocTemplate

CView 对象 文档对象 GetDocument
边框窗口 GetParentFrame

CMDIChildWnd或
CFrameWnd 对象 活动视 GetActiveView
活动视的文档 GetActiveDocument
CMDIFrameWnd对象 活动文档边框窗口 MDIGetActive


在框架类中使用 GetActiveView();
在文档类中(CMainFrame*)(AfxGetApp()->m_pMainWnd))->GetActiveView();

MFC中怎么在CMainFrame下获得View类的指针
使用GetActiveView()函数

MFC中普通类如何获取view类的指针?
在普通类(Generic class)中怎么得到view类的指针?我试过这样:
CMainFrame *p=(CMainFrame*)AfxGetMainWnd();
CView *pv=p->GetActiveView();
按照你的用法应该就是可以的!
是不是在这样用时,View还没有创建完成啊,所以pv才是空的。

CMainFrame *m_pfm = (CMainFrame*)AfxGetApp()->m_pMainWnd;
...*m_pView = (...*)m_pfm->GetActiveView();

少一句:AfxGetApp()
CMainFrame *p=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CView *pv = (CView*)p->GetActiveView();

楼上的分析在理,楼主理一下函数调用顺序, 别是什么PreCreateWindow或是CXXXApp,CXXXFrame的构造函数,InitInstance里,模板主窗口都没建完就准备操纵这个CView了

asdfasdf


怎样在MFC中返回类的指针,比如cwin,view类等等!
在CView类中,调用this->GetDocument()得到doc。
在CDocument类中,调用GetFirstViewPosition()和GetNextView()得到所有的view。
在其它类中,一种方法先是把指针传进去,以备调用的时候使用。另外就要用AfxGetApp()得到CWinApp,然后再用GetFirstDocTemplatePosition()和GetNextDocTemplate()得到doc template,然后调用GetFirstDocPosition()和GetNextDoc()得到doc。


如何在OnDraw函数或***Dlg函数中获得View类的指针(this)或整个对话框的指针?
在单文档中你可以采用如下方法:
现在要获得指针的文件开始处包含两个文件:
视图的主框架类头文件,即#include "MainFrm.h"
视图类头文件,即#include "XXView.h"

然后在要访问m_pSet处添加如下语句
CMainFrame* frm=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CXXView* pView=(CXXView*)frm->GetActiveView();
pView即View类指针


不过你用this不是更简单吗?


mfc的单文档中从一个视图的treeview类中获取Ctestview产生的视图窗口句柄?
获取单文档框架中的那个视图的窗口句柄。求一段代码。网上查了一下,没弄出来。哪位兄弟有时间写一段。

你说的不明不白的。方法可谓多矣。
可以通过全局对象theApp获得视图指针,然后
视图指针->GetSafeHwnd();获得句柄。
还可以发送自定义消息把句柄发送到指定窗口类。
还可以在你的stdafx.h中定义一个Cview指针,在程序初始化过程使之指向View类,在你的treeview中使用。
还可以自己为treeview类定义方法接收句柄,在调用的时候传入。
注意处理好创建顺序问题,否则debug下会出断言错误。

方法真的很多。
如果你没有用到文档/视图结构,单文档是在创框架窗口中创建的。有一个变量m_wndView。这个就是那个句柄了。他是CWnd派生的。

如果你用到了文档/视图结构,直接GetActiveView就可以。

还有一种情况,如果你用了切分窗口。。。。。。。
忘了哪个函数了。Get***Pane好像。。查一下便知。


mfc单文档Ctestview产生的视图窗口初始标题如何获取?
你可以在资源文件里修改字符窜,具体怎么修改上网查,
另外一个方法是在view类的PreCreateWindow函数里return之前加入
m_strTitle = "单文档标题";


启动了另一个线程CMyApp,如何在CMyApp中访问我的 View类呢?
如果我是重新生成了一个WinApp类,并且调用AfxBeginThread((RUNTIME_CLASS)CMyApp)启动了另一个线程,那么我又如何在CMyApp中访问我的 View类呢?
这个问题我早上就问了,可是没有人给我答案。有哪位高手能赐教啊
1。你可以把该View的类作为参数传入进去,这是最简单的解决方法
2。你可以用如下方法得到
CWinApp * pA=AfxGetApp();
POSITION pos=pA->GetFirstDocTemplatePosition();
CDocTemplate * pDT=pA->GetNextDocTemplate(pos);
pos=pDT->GetFirstDocPosition();
CDocument * pD=pDT->GetNextDoc(pos);
pos=pD->GetFirstViewPosition();

CView * pV=pD->GetNextView(pos);
当然,原理是这样,如果你有多个View,或者有Doc,甚至有多个DocTemplate,可以适当调整
源代码我试过了,应该没什么问题了吧



mfc单文档中如何获取View视图(CmyView类实例产生的窗口)窗口的句柄?在另一个视图类中
通过App类来获取.
头文件定义:CmyView *GetmyView();
实现:
CmyView *CmyApp::GetmyView()
{
if(m_pDocManager)
{
POSITION pos1 = m_pDocManager->GetFirstDocTemplatePosition();
while (pos1)
{
CDocTemplate *pDocTemplate = m_pDocManager->GetNextDocTemplate(pos1);
if(pDocTemplate)
{
POSITION pos2 = pDocTemplate->GetFirstDocPosition();
while (pos2)
{

CDocument *pDoc = pDocTemplate->GetNextDoc(pos2);
if(pDoc)
{
POSITION pos3 = pDoc->GetFirstViewPosition();
while (pos3)
{
CView *pView = pDoc->GetNextView(pos3);
if(pView)
{
if(pView->IsKindOf(RUNTIME_CLASS(CmyView)))
return (CmyView*)pView;
}
}
}
}
}
}
}
return NULL;
}

补充一点,如果你是用静态分割产生的分割视图,可以充分利用CSplitterWnd的GetPane函数,比如,在CmylView中去获取CmyView的窗口句柄(假设CmyView在分割的0行0列):
CSplitterWnd *ps = (CSplitterWnd *)GetParent();
CmyView *pView = (CmyView *)(ps->GetPane(0,0));
pView - >m_hWnd即可获得该视图窗体的句柄

简单的很:因为你的view类不止一个,只有当你的view类活动时获取View视图(CmyView类实例产生的窗口)窗口的句柄才有意义!只要一个函数就可以解决。
CView* GetActiveView( ) const;

GetActiveView( )获得当前活动view类窗口句柄.

相关文档
最新文档