如何访问父类mfc上的变量

时间:2015-07-07 07:46:08

标签: c++ mfc

我在MFC应用程序上有一个Dialog。

MyDialog :
{
 int variable1;
 int variable2;
 Class1 cls = new Class1();
}

在class1()

 Class1() 
 {
     void Function1()
     void Function2()
 }

-

那么如何访问并返回到Class1中的variable1 :: Function1()

Class1::Function1()
{
  MyDialog dlg = new MyDialog ();
  Get x = dlg->variable1; //if like this, variable1 alway=0, because in above line, i'm define new myDialog()
}

我认为委托.NET,但在MFC应用程序中,我无法完成它?

3 个答案:

答案 0 :(得分:3)

你可以

  1. "延伸"您的构造函数,通过在子对话框中添加指向父级的指针并访问您的变量或调用公共函数(需要父级的标题)
  2. 使用SendMessage并处理父对话框中的消息
  3. 就地使用GetParent并将dynamic_cast用于您的父对话框(需要父网址标题)
  4. 1

    Class1::Class1(MyParent *parent)
    {
        m_parentPointer = parent;
    }
    void Class1::Function1(void)
    {
        m_parentPointer->myPublicVariable;
    }
    

    2

    void Class1::Function1(void)
    {
        CWnd *parent = GetParent();
        if (parent)
            parent->SendMessage(WM_YOUR_MESSAGE, yourWPARAM, yourLPARAM);
    }
    
    //MessageMap of parent
    ON_MESSAGE(WM_YOUR_MESSAGE, ParentClassHandler)
    
    LRESULT Parent::ParentClassHandler(WPARAM wp, LPARAM lp)
    {
        //Process
    }
    

    3

    void Class1::Function1(void)
    {
        CWnd *parent = GetParent();
        if (parent)
        {
            Parent *p = dynamic_cast<Parent*>(parent);
            if (p)
            {
                //Process
            }
        }
    }
    

答案 1 :(得分:2)

在深入研究之前,你必须从基础C ++课程开始。但这是如何完成的:

MyDialog dlg = new MyDialog ();

dlg->variable1 = 1; //set the variable

if (IDOK == dlg->DoModal()) //wait for user to click OK
{
    int x = dlg->variable1; //get the variable
}

但是,dlg->variable1除非您驾驶自己的课程并做一些改变,否则不会更改variable1

例如,您可以使用Dialog Data Exchangevoid MyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Check(pDX, IDC_CHECK1, variable1); } 分配给复选框。

IDC_CHECK1

要尝试它,请使用Visual Studio的对话框向导创建一个复选框和一个编辑框。它可能会创建一个包含资源ID IDC_EDIT1的复选框,这是一个资源ID设置为OnInitDialog的编辑框。

另一种选择:

  • 使用OnOK()将变量分配给对话框控件

  • 使用BOOL MyDialog::OnInitDialog() { //put `CString m_string1;` in class declaration BOOL result = CDialog::OnInitDialog(); SetDlgItemText(IDC_EDIT1, m_string1); return result; } void MyDialog::OnOK() { GetDlgItemText(IDC_EDIT1, m_string1); CDialog::OnOK(); } 从对话框控件中获取变量:

function 3d(x, y, z, rotateX, rotateY, rotateZ){
  var m = Matrix3D.create();
  Matrix3D.translateX(m, x);
  Matrix3D.translateY(m, y);
  Matrix3D.translateZ(m, z);

  Matrix3D.rotateX(m,this.data.rotateX);
  Matrix3D.rotateY(m,this.data.rotateY);
  Matrix3D.rotateZ(m,this.data.rotateZ);

  return Matrix3D.toTransform3D(m);
}

答案 2 :(得分:2)

如果Class1::Function1()需要访问该对话框,则需要指向Function1中对话框的指针。

void Class1::Function1(MyDialog *dlg) {
}

如果要永久存储对话框指针,请调整Class1的构造函数。

class Class1 {
public:
    Class1(class MyDialog *dlg_) : dlg(dlg_) {}
    class MyDialog *dlg;
}

实现它的另一种可能更好的方法是将需要访问Class1和MyDialog的代码移动到全局函数或MyDialog成员函数中。但是走哪条路取决于课程的作用以及你想要的设计。