请VC++的高手进来指点下,MFC中视图的指针
请高手指点一下,VC++里面,我建了一个SDI工程,点击某个菜单,会调出一个对话框,在对话框中我选中一些设置。这时候我希望View的视图波形作出相关变化。我把CMyVie...
请高手指点一下,VC++里面, 我建了一个SDI工程,点击某个菜单,会调出一个对话框,在对话框中我选中一些设置。
这时候我希望View的视图波形作出相关变化。
我把CMyView这个类 ,加入到我新建的对话框中,做一个 CMyView *m_pView.
的类类型成员变量 然后 m_pView->invalidate(); 这个要出现断言错误。
而方法二:CMyView *pView = pMain->GetActiveView(); 然后再pView->invalidate(); 就会正确,这是为什么?
我们通常在A类中访问B类的函数,不就是把B类对象作为一个 成员加到A中么?
补充一下, 我在代码里是写了 CMyView *m_pView = new CMyView()的;
然后程序在 m_pView->invalidate(); 这一行报错。 展开
这时候我希望View的视图波形作出相关变化。
我把CMyView这个类 ,加入到我新建的对话框中,做一个 CMyView *m_pView.
的类类型成员变量 然后 m_pView->invalidate(); 这个要出现断言错误。
而方法二:CMyView *pView = pMain->GetActiveView(); 然后再pView->invalidate(); 就会正确,这是为什么?
我们通常在A类中访问B类的函数,不就是把B类对象作为一个 成员加到A中么?
补充一下, 我在代码里是写了 CMyView *m_pView = new CMyView()的;
然后程序在 m_pView->invalidate(); 这一行报错。 展开
6个回答
展开全部
首先你那个指针没有初始化,他会乱指一通,不知指向什么地址
其次你的想法我觉得有些不妥,一般情况下一个单文档都有一个活动的视图,与一个窗口关联,即m_hWnd变量有值,即使你为你的方法一NEW了一个对象,如果没有与一个窗口关联,我想也会出错,单文档也可以动态切换视图,但是我想这与你的问题没什么关系,嘿嘿,汗!
其次你的第二个做法是完全正确的,你使用框架类指针得到了位于框架之上活动视图的指针(GetActiveView),这个东西才是实实在在的你想要的!,利用这个指针才能调用invalidate()让你的视图刷新,想想如果一个视类对象没有与一个窗口关联,你想让他去刷新啥!
哦,我也是菜鸟,嘿嘿,选择性理解哈
其次你的想法我觉得有些不妥,一般情况下一个单文档都有一个活动的视图,与一个窗口关联,即m_hWnd变量有值,即使你为你的方法一NEW了一个对象,如果没有与一个窗口关联,我想也会出错,单文档也可以动态切换视图,但是我想这与你的问题没什么关系,嘿嘿,汗!
其次你的第二个做法是完全正确的,你使用框架类指针得到了位于框架之上活动视图的指针(GetActiveView),这个东西才是实实在在的你想要的!,利用这个指针才能调用invalidate()让你的视图刷新,想想如果一个视类对象没有与一个窗口关联,你想让他去刷新啥!
哦,我也是菜鸟,嘿嘿,选择性理解哈
展开全部
很简单,在你的对话框类的构造函数中添加一个参数,或者在你的对话框类中添加一个SetView的成员函数,用以设置视图指针,就没问题了。
如下:
CYourDialog::CYourDialog( CMyView * p , CWnd * pParent /*=NULL*/)
: m_pView( p )
, CDialog( pParent )
{
// ......
}
或者:
CYourDialog::SetView( CMyView * p )
{
m_pView = p;
}
用的时候:
CYourDialog dlg( this );
dlg.DoModel();
或者:
CYourDialog dlg;
dlg.SetView( this );
dlg.DoModel();
如下:
CYourDialog::CYourDialog( CMyView * p , CWnd * pParent /*=NULL*/)
: m_pView( p )
, CDialog( pParent )
{
// ......
}
或者:
CYourDialog::SetView( CMyView * p )
{
m_pView = p;
}
用的时候:
CYourDialog dlg( this );
dlg.DoModel();
或者:
CYourDialog dlg;
dlg.SetView( this );
dlg.DoModel();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针对象是要初始化的
要不new一个对象给这个指针
要不就用别的对象的指针赋值给这个指针
否则会出现错误
A类访问B类的函数
一般是把B类的对象指针传递到A类中
作为A类的成员变量
B类的对象一定要先初始化
==========================================
呵呵 没有源码我也帮不了你咯~~~
要不new一个对象给这个指针
要不就用别的对象的指针赋值给这个指针
否则会出现错误
A类访问B类的函数
一般是把B类的对象指针传递到A类中
作为A类的成员变量
B类的对象一定要先初始化
==========================================
呵呵 没有源码我也帮不了你咯~~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
假设A是主窗口,B是弹出窗口,
在B是中申明 A *m_pWnd;
在A中申明 B *m_sWnd;
在B创建时,一般是在A中被创建 如果对象*m_Swnd = new B;
m_sWnd->create(......);
然后m_sWnd->m_pWnd = this;
然后B中操作时
this->m_pWnd->invalidate();才行
在B是中申明 A *m_pWnd;
在A中申明 B *m_sWnd;
在B创建时,一般是在A中被创建 如果对象*m_Swnd = new B;
m_sWnd->create(......);
然后m_sWnd->m_pWnd = this;
然后B中操作时
this->m_pWnd->invalidate();才行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一种方法中的m_pView指针悬空了,即没有初始化,没有让它指向一个真正的CMyView的对象。你可以在对话框的构造函数或InitInstance函数里面加上下面的代码,然后下面就可以像第一种方法那样直接使用这个指针了:
m_pView= pMain->GetActiveView(); (也就是你第二种方法中的代码,不过我不知道你的pMain是哪来的...)
总之,你的类之间的访问方式没问题,是成员变量(指针m_pView)没有正确初始化。
m_pView= pMain->GetActiveView(); (也就是你第二种方法中的代码,不过我不知道你的pMain是哪来的...)
总之,你的类之间的访问方式没问题,是成员变量(指针m_pView)没有正确初始化。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-04-08
展开全部
方法一:关键错误所在是声明了指针(CMyView *m_pView
),但指针(m_pView)没有指向任何空间,俗称野指针,所以调用m_pView->invalidate()就出错了。
方法二:CMyView *pView = pMain->GetActiveView(); 在声明指针的时候同时给指针赋值,GetActiveView()返回的就是一个CView*的指针,所以就不存在前面的问题了。
A类中访问B类的函数, 可以B类对象作为一个 成员加到A中,也可以用发送消息的方式。
),但指针(m_pView)没有指向任何空间,俗称野指针,所以调用m_pView->invalidate()就出错了。
方法二:CMyView *pView = pMain->GetActiveView(); 在声明指针的时候同时给指针赋值,GetActiveView()返回的就是一个CView*的指针,所以就不存在前面的问题了。
A类中访问B类的函数, 可以B类对象作为一个 成员加到A中,也可以用发送消息的方式。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询