2011-12-09 34 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

相關問題