请教:在多文档程序中 在CMyView 中画图,建立了一个类CMyClass,要传入参数CMyView怎么传,传入后怎么用,详细见贴内容
请问:在多文档程序中 在CMyView 中画图,建立了一个类CMyClass,要传入参数CMyView如何传,传入后如何用,详细见贴内容
在多文档程序中。
在CMyView 中画图,建立了一个类CMyClass
在CMyView 中引用了CMyClass类,在头文件中#include "MyClass.h "
在CMyClass中的方法要调用CMyView中的方法,所以要将CMyView以参数传过去,但编译老过不去,在CMyClass中加#include "MyView.h "或不加都有错误。
请问应该如何使用?
前面问人说如下这样:
例如
class CMyView;
void CMyClass::DoSomething(CMyView* view)
{
.....
}
int CMyView::TestFun()
{
CMyClass pA;
pA.DoSomething(this);
}
我结贴太快,如果在CMyClass::DoSomething方法中,执行
int itmp = view-> iVal;
就会提示
error C2027: use of undefined type 'CMyView '
error C2227: left of '-> iVal ' must point to class/struct/union
------解决方案--------------------
一般不能通过传递view类指针来实现操作view
你可尝试如下方式:
#include "CMyView.h "
#include "MainFrm.h "
void CMyClass::DoSomething()
{
CMyView *pView=(CMyView*)((CMainFrame*)AfxGetApp()-> m_pMainWnd)-> GetActiveView();
}
CMyClass头文件中不用包含CMyView.h
------解决方案--------------------
方法1:把CMyView的窗口句柄传过去.然后在CMyClass里发消息.在CMyView里收到消息,调用函数.
方法2:在CMyClass的CPP文件里包含CMyView的头文件.然后搞个全局的CMyView的指针,并在CMyClass的构造函数中把它初始化就行了.
*:不过,一般来说,出现这种情况,反映出这个程序的设计是不对的.类与类之间的偶合太多了.
试试改变下设计思路,重新控制下数据和消息的流动,要尽量避免这种类与类相互调用的情况.
------解决方案--------------------
cmyview应该是动态生成的,这样调用是不行了。
CMyView *pView=(CMyView*)((CMainFrame*)AfxGetApp()-> m_pMainWnd)-> GetActiveView();
这样调用需要myview 为当前活动 view
你判断以下是不是为空
ASSERT(pView);
你确保当前为活动view是 myview 可以用上面的方法调用
------解决方案--------------------
我可以告诉搂住 当pView==0x0000000时 你是无法访问他们的变量的
你应该考虑绕开这个问题
------解决方案--------------------
to he_hawk
在Myclass.cpp文件中加入 "MyView,h "编译是通不过,因为引用声明影响到MyView的一些预定义。在MyView.h文件中增加声明就可以了。
------解决方案--------------------
cmyview应该是动态生成的,这样调用是不行了。
CMyView *pView=(CMyView*)((CMainFrame*)AfxGetApp()-> m_pMainWnd)-> GetActiveView();
这样调用需要myview 为当前活动 view
你判断以下是不是为空
ASSERT(pView);
你确保当前为活动view是 myview 可以用上面的方法调用
在多文档程序中。
在CMyView 中画图,建立了一个类CMyClass
在CMyView 中引用了CMyClass类,在头文件中#include "MyClass.h "
在CMyClass中的方法要调用CMyView中的方法,所以要将CMyView以参数传过去,但编译老过不去,在CMyClass中加#include "MyView.h "或不加都有错误。
请问应该如何使用?
前面问人说如下这样:
例如
class CMyView;
void CMyClass::DoSomething(CMyView* view)
{
.....
}
int CMyView::TestFun()
{
CMyClass pA;
pA.DoSomething(this);
}
我结贴太快,如果在CMyClass::DoSomething方法中,执行
int itmp = view-> iVal;
就会提示
error C2027: use of undefined type 'CMyView '
error C2227: left of '-> iVal ' must point to class/struct/union
------解决方案--------------------
一般不能通过传递view类指针来实现操作view
你可尝试如下方式:
#include "CMyView.h "
#include "MainFrm.h "
void CMyClass::DoSomething()
{
CMyView *pView=(CMyView*)((CMainFrame*)AfxGetApp()-> m_pMainWnd)-> GetActiveView();
}
CMyClass头文件中不用包含CMyView.h
------解决方案--------------------
方法1:把CMyView的窗口句柄传过去.然后在CMyClass里发消息.在CMyView里收到消息,调用函数.
方法2:在CMyClass的CPP文件里包含CMyView的头文件.然后搞个全局的CMyView的指针,并在CMyClass的构造函数中把它初始化就行了.
*:不过,一般来说,出现这种情况,反映出这个程序的设计是不对的.类与类之间的偶合太多了.
试试改变下设计思路,重新控制下数据和消息的流动,要尽量避免这种类与类相互调用的情况.
------解决方案--------------------
cmyview应该是动态生成的,这样调用是不行了。
CMyView *pView=(CMyView*)((CMainFrame*)AfxGetApp()-> m_pMainWnd)-> GetActiveView();
这样调用需要myview 为当前活动 view
你判断以下是不是为空
ASSERT(pView);
你确保当前为活动view是 myview 可以用上面的方法调用
------解决方案--------------------
我可以告诉搂住 当pView==0x0000000时 你是无法访问他们的变量的
你应该考虑绕开这个问题
------解决方案--------------------
to he_hawk
在Myclass.cpp文件中加入 "MyView,h "编译是通不过,因为引用声明影响到MyView的一些预定义。在MyView.h文件中增加声明就可以了。
------解决方案--------------------
cmyview应该是动态生成的,这样调用是不行了。
CMyView *pView=(CMyView*)((CMainFrame*)AfxGetApp()-> m_pMainWnd)-> GetActiveView();
这样调用需要myview 为当前活动 view
你判断以下是不是为空
ASSERT(pView);
你确保当前为活动view是 myview 可以用上面的方法调用