webbrowserview是我定义的视图,继承自CHtmlView,默认的,构造函数是保护类的。我需要在CMainframe下的一个函数中
调用Navigate函数,它好像是CHtmlView的虚函数,我的webbrowserview下的保护函数OnRefresh()可以调用它的,但是
我现在希望mainframe下的函数能够调用Navigate函数,或者OnRefresh函数,但是由于webbrowserview的构造函数是保护
类的,所以,在mainframe下,webbrowserview a;a.OnRefresh();这样也不可以,所以,我在browserview下的共有定义了
view,就是标号1的地方,结果报错如下:
error C2460: 'view' : uses 'CWebbrowserView', which is being defined
webbrowserview.h(14) : see declaration of 'CWebbrowserView'
class CWebbrowserView : public CHtmlView
{
protected: // create from serialization only
CWebbrowserView();
DECLARE_DYNCREATE(CWebbrowserView)// Attributes
public:
CWebbrowserDoc* GetDocument();
CWebbrowserView view;---------------(1)
问题1:这是为什么?为什么报错,还有,报的错是什么意思?which is being defined ,什么意思?
问题2:我想在CMainframe下的一个函数中调用Navigate函数或者OnRefresh函数,具体怎么做?
调用Navigate函数,它好像是CHtmlView的虚函数,我的webbrowserview下的保护函数OnRefresh()可以调用它的,但是
我现在希望mainframe下的函数能够调用Navigate函数,或者OnRefresh函数,但是由于webbrowserview的构造函数是保护
类的,所以,在mainframe下,webbrowserview a;a.OnRefresh();这样也不可以,所以,我在browserview下的共有定义了
view,就是标号1的地方,结果报错如下:
error C2460: 'view' : uses 'CWebbrowserView', which is being defined
webbrowserview.h(14) : see declaration of 'CWebbrowserView'
class CWebbrowserView : public CHtmlView
{
protected: // create from serialization only
CWebbrowserView();
DECLARE_DYNCREATE(CWebbrowserView)// Attributes
public:
CWebbrowserDoc* GetDocument();
CWebbrowserView view;---------------(1)
问题1:这是为什么?为什么报错,还有,报的错是什么意思?which is being defined ,什么意思?
问题2:我想在CMainframe下的一个函数中调用Navigate函数或者OnRefresh函数,具体怎么做?
2、视图是动态创建的,构造函数是保护类型的用意就是不让你这样构造,你在创建单文档项目的最后一步时,指定你的View继承自CHtmlView就可以了,程序会自动创建你定义的视图,在你的视图类初始化时可以调用你想要调的函数。
但是你还没有回答我的问题2,那具体怎么在mainframe中调用navigate函数呢?
照你的方法试了试,结果报错;
'OnRefresh' : is not a member of 'CView'
microsoft visual studio\vc98\mfc\include\afxwin.h(3542) : see declaration of 'CView'换成navigete,也报一样的错,它是chtmlview的虚函数,OnRefresh是webbrowserview的保护类成员
OnRefresh是你定义的保护函数,如果要在CMainFrame中调用,必须声明友员才行。
我也按照你说的贴了,的确是不行啊。
不过还是要谢谢你这么热心。
我说的是:((CWebbrowserView*)GetActiveView())->Navigate
你写成了:(CWebbrowserView*)GetActiveView()->Navigate->操作符的优先级高于强制类型转换。
friend class CMainFrame;
顺便再提一下,这类函数是事件(消息)的响应函数,定义为虚函数是为了让子类可以重载此函数来响应事件;定义为保护成员是为了让子类重载后,在做完相应的处理后,可以调用基类的这个函数,所以不能定义为私有成员,而这个函数又不是提供给外部调用的,所以不能定义为公有成员。
CWebbrowserView a;
a.OnRefresh(); 一切OK,编译通过,但是在程序调用这个函数时,(已经顺利运行了),显示,该内存不能为读,然后关闭了,很郁闷。
((CWebbrowserView*)GetActiveView())->OnRefresh();
a.OnRefresh(); 是这样吗?
你需要把类和类的实例区分开。
假设有一个类
class c
{
public:
int i;
};
定义了两个实例
c c1, c2;
c1.i和c2.i是不同变量,两个没有任何关联。
在程序界面中显示的视图是在初始化时已经创建好了的视图类的实例,要对其操作你必须获得它的指针,GetActiveView函数就是获得当前活动视图的指针,用这个指针指向类的成员来操作。