如何从另一个类访问MFC中的对话框项?

时间:2011-12-09 21:55:40

标签: mfc dialog

我正在尝试从与对话框类不在同一个类中的函数访问对话框项。我怎么能这样做?

示例:

class AnotherClass : CClas
{
  AnotherClass();
public:
  void MyFunction();
};

void AnotherClass::MyFunction() //Message overwriting, can't change parameters
{
  CClass* temp = (CClass*)GetDlgItem(IDC_ID); //Reference to dialog item IDC_ID
  temp->DoSomething(); //This gives me an assertion error
}

我知道如果它与消息相同,我可以使用“this”,但我想访问另一个对话框项。

感谢您的关注。

解决方案:

正如Moo-Juice所建议的那样,您可以在实例化类时简单地传递对话框。就我而言,我做不到。由于某种原因,子类化不起作用。如果在MFC中执行应用程序时遇到同样的问题,可以创建一个指向CDialog的指针,并将其传递给OnInitDialog()的主对话框:

示例(类):

class AnotherClass : CClass
{
  AnotherClass();
public:
  void MyFunction();
  CDialog * mainDialog;
};

void AnotherClass::MyFunction() //Message overwriting, can't change parameters
{
  CClass* temp = (CClass*)mainDialog->GetDlgItem(IDC_ID); //Reference to dialog item IDC_ID
  temp->DoSomething(); //This gives me an assertion error
}

示例(OnInitDialog()):

MyMainDialog::OnInitDialog()
{
  ...
  AnotherClass obj; //Instantiate class
  obj->mainDialog = this;
  return true;
}

在这个例子中,简单地在创建对象时将其作为参数传递更有意义。它对我所做的事情并没有起作用。

希望它可以帮助任何有类似问题的人。

1 个答案:

答案 0 :(得分:3)

实例化AnotherClass时,将对话框类传递给它:

class AnotherClass
{
private:
    CDialog& dialog_;

public:
    AnotherClass(CDialog& dialog) : dialog_(dialog) { }

    void MyFunction();
};


void AnotherClass::MyFunction()
{
    CClass* temp = (CClass*)dialog_.GetDigItem(IDC_ID);
    temp->doSOmething();
}