在MFC工程中如果有2个视图类,其中一个视图类A访问另一个视图类B的成员函数时,为什么必须要先得到B视图类的指针呢? 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 但是如果我已经定义了B的对象 myView,直接在A中用myView来引用B的成员为什么不可以呢? “但是如果我已经定义了B的对象 myView,直接在A中用myView来引用B的成员为什么不可以呢?”?不可以?能把源码帖上来看一下吗? “但是如果我已经定义了B的对象 myView,直接在A中用myView来引用B的成员为什么不可以呢?”? 如果是这样的话,那就是类和对象之间的关系问题了。一个类可以有多个对象的啊,你在A中定义了B的对象myView实际上是生成了另外一个B类的对象,跟你前面的B视图已经是两回事情了。他们针对的是两个不同的内存块了。就像是声明INT类型的 M,然后再声明一个INT类型的K;去M的值能用K来完成么?而且视图类声明对象好像不太可能吧,那后续的初始化工作可多了去了,没那么容易吧。 但是如果我已经定义了B的对象 myView,直接在A中用myView来引用B的成员为什么不可以呢?=======================================================可以啊,问题是你在A中能不能得到myView呢?比如,你定义的myView是一个全局变量,那么当然可以用它, 简单的说,你必须要保证你在A中处理的B类实例和相关地方的B类是同一个实例,只要保证这一点,管你怎么处理都可以 但是如果我已经定义了B的对象 myView,直接在A中用myView来引用B的成员为什么不可以呢?可以 public就可以了。。 呵呵,看大家讨论的这么热烈,我把源代码贴出来大家帮我看下吧:class CTree_TestDlg : public CDialog{// Constructionpublic: CTree_TestDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data //{{AFX_DATA(CTree_TestDlg) enum { IDD = IDD_TREE_TEST_DIALOG }; CTreeCtrl m_TreeCtrl;//这是我定义的树形控件 //}}AFX_DATA ....... .......}定义了另一个对话框,在对对话框初始化的时候要用到m_TreeCtrl:BOOL CViewInformation::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here CTree_TestDlg* pParent = (CTree_TestDlg*)m_pParentWnd; CTreeCtrl* m_TreeCtrl = &(pParent->m_TreeCtrl); HTREEITEM hSel = m_TreeCtrl->GetSelectedItem();//取得选项句柄; HTREEITEM hPar = m_TreeCtrl->GetParentItem(hSel); if(hSel==NULL) return FALSE;//无任何选项则返回 CString cText=m_TreeCtrl->GetItemText(hSel);//取得数据项名 CString cPtext = m_TreeCtrl->GetItemText(hPar);//取得数据项的父节点 ......... .........}当我在这段代码中直接用m_TreeCtrl的时候就会出错,如:m_TreeCtrl.GetItemText(hSel),只能取到控件的指针之后才可以用,这是为什么呢? 为什么打印预览时,点放大和缩小按钮时候预览的图片没有变化 而只有图片的背景变大变小? 自定义窗口 来看看:) 请教一个简单的问题 高手们帮我看一下下面这段代码怎么执行不起来! 如何访问局域网中的共享资源 毕设急用,热切期望你的解答,请高手一定要看看! 关于抄书的辩解! newhand的问题 送分了!UPDATEDATA()的小问题。嫌自己专家分多的就不用来看了! 新手求助:关于读取时序文件绘制波形图的问题 CTreeCtrl实现目录树,如何编码实现添加“我的文档”“我的电脑”“网上邻居”“回收站”这4个节点 指定内存不能为Written错误!
如果是这样的话,那就是类和对象之间的关系问题了。一个类可以有多个对象的啊,你在A中定义了B的对象myView实际上是生成了另外一个B类的对象,跟你前面的B视图已经是两回事情了。
他们针对的是两个不同的内存块了。就像是声明INT类型的 M,然后再声明一个INT类型的K;
去M的值能用K来完成么?而且视图类声明对象好像不太可能吧,那后续的初始化工作可多了去了,没那么容易吧。
=======================================================
可以啊,问题是你在A中能不能得到myView呢?比如,你定义的myView是一个全局变量,那么当然可以用它,
可以 public就可以了。。
class CTree_TestDlg : public CDialog
{
// Construction
public:
CTree_TestDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data
//{{AFX_DATA(CTree_TestDlg)
enum { IDD = IDD_TREE_TEST_DIALOG };
CTreeCtrl m_TreeCtrl;//这是我定义的树形控件
//}}AFX_DATA
.......
.......
}
定义了另一个对话框,在对对话框初始化的时候要用到m_TreeCtrl:BOOL CViewInformation::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CTree_TestDlg* pParent = (CTree_TestDlg*)m_pParentWnd;
CTreeCtrl* m_TreeCtrl = &(pParent->m_TreeCtrl);
HTREEITEM hSel = m_TreeCtrl->GetSelectedItem();//取得选项句柄;
HTREEITEM hPar = m_TreeCtrl->GetParentItem(hSel);
if(hSel==NULL) return FALSE;//无任何选项则返回
CString cText=m_TreeCtrl->GetItemText(hSel);//取得数据项名
CString cPtext = m_TreeCtrl->GetItemText(hPar);//取得数据项的父节点
.........
.........
}
当我在这段代码中直接用m_TreeCtrl的时候就会出错,如:m_TreeCtrl.GetItemText(hSel),只能取到控件的指针之后才可以用,这是为什么呢?