Как я могу получить доступ к элементу диалога в MFC из другого класса? - PullRequest
1 голос
/ 10 декабря 2011

Я пытаюсь получить доступ к элементу диалога из функции, которая не принадлежит к тому же классу, что и класс диалога. Как я могу это сделать?

Пример:

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», если это тот же элемент диалога, что и сообщение, но я хочу получить доступ к другому элементу диалога.

Спасибо за внимание.

Решение:

Как подсказал Му-Джус, вы можете просто пропустить диалоговое окно при создании экземпляра класса. В моем случае я не мог этого сделать. По какой-то причине создание подклассов не работает таким образом. Если вы сталкиваетесь с той же проблемой при выполнении приложения в 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 Ответ

3 голосов
/ 10 декабря 2011

Когда вы создаете экземпляр 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();
}
...