2011-12-09 30 views
1

我试图从一个函数中访问一个对话框项目,它与对话框类不在同一个类中。我怎样才能做到这一点?如何从另一个类访问MFC中的对话框项?

例子:

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 
} 

我知道我可以使用“本”,如果超过该消息的同一个对话的项目,但我想访问另一个对话框项目。

感谢您的关注。

解决方案:

至于建议由武果汁,你可以简单地通过对话,当你实例化类。就我而言,我无法做到这一点。出于某种原因,子类化不能以这种方式工作。如果你面对这样的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; 
} 

在这个例子中,只是在创建对象时将它作为参数传递会更有意义。对于我所做的事情,这只是与我无关。

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

回答

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(); 
} 
+0

我没有完全没有你所说的,因为我不能错过的对话时,我实例化的类的方式。但你给了我一个好主意。我在OnInitDialog()的新类中将指针“this”传递给了我的新类的指针,但是我不得不将我的新类中的指针设置为public。谢谢 – Artie

相关问题