mfc中不同的类要怎么互相调用变量。。

时间:2022-04-21 20:20:30
就是view里面能用mainframe里面的变量。
有没有比较全面地介绍下这个问题。谢谢哈。。
我想有一种是都相应地设置一个全局变量,然后每个类的变量都对应过去,这样就可以了。不过很浪费资源的说。

7 个解决方案

#1


把MainFrame的this指针设置给View.

#2


可以考虑通过app类来中转

#3


n种办法
1、可以在stdafx.h中声明extern int xxx;
然后在MainFrame里面定义它int xxx;
最后就可以到处用了
2、定义你的app的公有变量,CxxxApp里,至于使用时对theApp强制转换成CxxxApp即可
3、定义一个外部类,比如Cxx类,然后在这个类里用static成员
4、无聊的搞法,写个文件啊
5、最无聊的搞法,可以试试SendMessage啊

#4


第二种方法说错了,不能用theApp,好像是使用getapp还是个什么函数得到一个CWinApp的指针,然后强转

#5


变量定义为public成员,在视图类中用GetParentFrame可以获得框架类指针,强制转换成CMainFrame*类型,然后就可以用指针指向变量了。

#6


获得CWinApp:
    -在CMainFrame,CChildFrame,CDocument,CView中直接调用AfxGetApp()或用theApp
    -在其它类中只能用AfxGetApp()

获得CMainFrame:
    -在CMinApp中用AfxGetMainWnd()或者m_pMainWnd
    -在CChildFrame中可用GetParentFrame()
    -在其它类中用AfxGetMainWnd()

获得CChildFrame:
    -在CView中用GetParentFrame()
    -在CMainFrame中用MDIGetActive()或GetActiveFrame()
    -在其它类中用AfxGetMainWnd()->MDIGetActive()或AfxGetMainWnd()->GetActiveFrame()

获得CDocument:
    -在CView中用GetDocument()
    -在CChildFrame中用GetActiveView()->GetDocument()
    -在CMainFrame中用
        -if SDI:GetActiveView()->GetDocument()
        -if MDI:MDIGetActive()->GetActiveView()->GetDocument()
    -在其它类中
        -if SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()
        -if MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()

获得CView:
    -在CDocument中 POSITION pos = GetFirstViewPosition();GetNextView(pos)
    -在CChildFrame中 GetActiveView()
    -在CMainFrame中
        -if SDI:GetActiveView()
        -if MDI:MDIGetActive()->GetActiveView()
    -在其它类中
        -if SDI:AfxGetMainWnd()->GetActiveView()
        -if MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()

#7


我的习惯是把所有可能用到的全局变量集中到一个类,
在其它要调用到的类中声明一个指针,在构造函数时分配内存,析构时收回内存,如:
class CGlobFunc  
{
public:
CGlobFunc();
virtual ~CGlobFunc();
public:
CString GetCountyName(long iCountyID);
...
}
在要使用的类中
class CSampleplotDlg : public CDialog
{
public:
CSampleplotDlg(CWnd* pParent = NULL);   // standard constructor
...
CGlobFunc *m_pglobFunc;
}
...
CSampleplotDlg::CSampleplotDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSampleplotDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSampleplotDlg)
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pglobFunc = new CGlobFunc();//分配内存
}

使用时:
m_pglobFunc->GetCountyName(id);
其它的使用可以类推.

#1


把MainFrame的this指针设置给View.

#2


可以考虑通过app类来中转

#3


n种办法
1、可以在stdafx.h中声明extern int xxx;
然后在MainFrame里面定义它int xxx;
最后就可以到处用了
2、定义你的app的公有变量,CxxxApp里,至于使用时对theApp强制转换成CxxxApp即可
3、定义一个外部类,比如Cxx类,然后在这个类里用static成员
4、无聊的搞法,写个文件啊
5、最无聊的搞法,可以试试SendMessage啊

#4


第二种方法说错了,不能用theApp,好像是使用getapp还是个什么函数得到一个CWinApp的指针,然后强转

#5


变量定义为public成员,在视图类中用GetParentFrame可以获得框架类指针,强制转换成CMainFrame*类型,然后就可以用指针指向变量了。

#6


获得CWinApp:
    -在CMainFrame,CChildFrame,CDocument,CView中直接调用AfxGetApp()或用theApp
    -在其它类中只能用AfxGetApp()

获得CMainFrame:
    -在CMinApp中用AfxGetMainWnd()或者m_pMainWnd
    -在CChildFrame中可用GetParentFrame()
    -在其它类中用AfxGetMainWnd()

获得CChildFrame:
    -在CView中用GetParentFrame()
    -在CMainFrame中用MDIGetActive()或GetActiveFrame()
    -在其它类中用AfxGetMainWnd()->MDIGetActive()或AfxGetMainWnd()->GetActiveFrame()

获得CDocument:
    -在CView中用GetDocument()
    -在CChildFrame中用GetActiveView()->GetDocument()
    -在CMainFrame中用
        -if SDI:GetActiveView()->GetDocument()
        -if MDI:MDIGetActive()->GetActiveView()->GetDocument()
    -在其它类中
        -if SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()
        -if MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()

获得CView:
    -在CDocument中 POSITION pos = GetFirstViewPosition();GetNextView(pos)
    -在CChildFrame中 GetActiveView()
    -在CMainFrame中
        -if SDI:GetActiveView()
        -if MDI:MDIGetActive()->GetActiveView()
    -在其它类中
        -if SDI:AfxGetMainWnd()->GetActiveView()
        -if MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()

#7


我的习惯是把所有可能用到的全局变量集中到一个类,
在其它要调用到的类中声明一个指针,在构造函数时分配内存,析构时收回内存,如:
class CGlobFunc  
{
public:
CGlobFunc();
virtual ~CGlobFunc();
public:
CString GetCountyName(long iCountyID);
...
}
在要使用的类中
class CSampleplotDlg : public CDialog
{
public:
CSampleplotDlg(CWnd* pParent = NULL);   // standard constructor
...
CGlobFunc *m_pglobFunc;
}
...
CSampleplotDlg::CSampleplotDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSampleplotDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSampleplotDlg)
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pglobFunc = new CGlobFunc();//分配内存
}

使用时:
m_pglobFunc->GetCountyName(id);
其它的使用可以类推.