请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(); 这一行报错。
展开
 我来答
tpzy123456
2010-04-08 · 超过10用户采纳过TA的回答
知道答主
回答量:26
采纳率:0%
帮助的人:0
展开全部
首先你那个指针没有初始化,他会乱指一通,不知指向什么地址
其次你的想法我觉得有些不妥,一般情况下一个单文档都有一个活动的视图,与一个窗口关联,即m_hWnd变量有值,即使你为你的方法一NEW了一个对象,如果没有与一个窗口关联,我想也会出错,单文档也可以动态切换视图,但是我想这与你的问题没什么关系,嘿嘿,汗!
其次你的第二个做法是完全正确的,你使用框架类指针得到了位于框架之上活动视图的指针(GetActiveView),这个东西才是实实在在的你想要的!,利用这个指针才能调用invalidate()让你的视图刷新,想想如果一个视类对象没有与一个窗口关联,你想让他去刷新啥!
哦,我也是菜鸟,嘿嘿,选择性理解哈
百度网友1d8e8b9
2010-04-08 · TA获得超过913个赞
知道小有建树答主
回答量:589
采纳率:60%
帮助的人:322万
展开全部
很简单,在你的对话框类的构造函数中添加一个参数,或者在你的对话框类中添加一个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();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hgreminem
2010-04-08 · TA获得超过724个赞
知道小有建树答主
回答量:350
采纳率:0%
帮助的人:376万
展开全部
指针对象是要初始化的
要不new一个对象给这个指针
要不就用别的对象的指针赋值给这个指针
否则会出现错误
A类访问B类的函数
一般是把B类的对象指针传递到A类中
作为A类的成员变量
B类的对象一定要先初始化
==========================================
呵呵 没有源码我也帮不了你咯~~~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友0974edce8
2010-04-08 · TA获得超过490个赞
知道小有建树答主
回答量:381
采纳率:0%
帮助的人:252万
展开全部
假设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();才行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
changhao513
2010-04-08 · TA获得超过797个赞
知道小有建树答主
回答量:285
采纳率:0%
帮助的人:0
展开全部
第一种方法中的m_pView指针悬空了,即没有初始化,没有让它指向一个真正的CMyView的对象。你可以在对话框的构造函数或InitInstance函数里面加上下面的代码,然后下面就可以像第一种方法那样直接使用这个指针了:
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中,也可以用发送消息的方式。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式