2013-02-14 2 views
1

MFC 대화 상자에서 작업 중이며 멤버가 아닌 멤버의 멤버 변수 (컨트롤, 버튼, 체크 상자 편집 등)에 액세스하는 방법을 모르겠습니다. 기능.비 멤버 함수에서 MFC 대화 상자의 멤버 변수에 액세스하기

객체가 어떤 통화 당에서 생성되기 때문에

, 모든 오브젝트 이벤트가 whateverDlg.cpp으로 처리하고, 후자의 #include의 전자를, 나는 기존의 방법으로 굴림의 멤버에 액세스 할 수 없습니다. 설명에 대한

예 : 즉

void BlahDlg::OnBnClickedblah() 
{ 
    //... 
    CString text = L"blahblahblah"; 
    m_bEditControl.SetWindowTextW(text.GetBuffer()); //works fine 
    //... 
} 

void nonMember() 
{ 
    //... 
    CString text = L"blahblahblah"; 
    m_bEditControl.SetWindowTextW(text.GetBuffer()); //m_bEditControl is unknown 
    //... 
} 

: 나는 비 멤버 함수에서 m_bEditControl (또는 다른 대화의 멤버)에 액세스하려면 어떻게해야합니까? 당신이 논리에서 분리 된 GUI를 유지하려면

답변

5

, 당신은 기본적으로 그냥 (등 onBtnSomethingClick, onPaint, onCancel) 발생하는 이벤트를 인식하는, 매우 얇은 대화 상자 클래스를 유지하고 책임을 져야합니다 클래스를 만들 수 있습니다 일단 이러한 이벤트가 발생하면이를 처리합니다.

class MainDlg : public CDialog 
{ 
public: 
    BOOL MainDlg::OnInitDialog() 
    { 
     //... 
     myClass_ = new MyClass(*this); 
     return TRUE; 
    } 
    ~MainDlg() 
    { 
     //... 
     delete myClass_; 
    } 

private: 
    MyClass* myClass_; 
}; 
: 클래스의 객체를 생성 할 수

class MyClass 
{ 
public: 
    MyClass(MainDlg& dlg) : dlg_(dlg) { } 

private: 
    MainDlg& dlg_; 
}; 

그리고 대화 상자 클래스 : 가장 간단한 솔루션

하나는 생성자를 참조하여 대화 상자를 전달하여 클래스의이 종류를 구축하는 것입니다

GUI 클래스에 대한 참조를 더 이상 확산시키지 마십시오. 대화 상자의 일부 구성원을 직접 액세스해야하는 경우 코드 재 설계를 고려할 수 있습니다. 예를 들어 새로운 User을 작성하는 방법을 작성하고 대화 상자의 일부 텍스트 필드에 액세스하려고 생각하는 경우 대화 상자 멤버로부터 입력을 "수집"하여 대화 상자 클래스에서 독립적으로 이러한 종류의 함수에 전달하는 것이 훨씬 더 좋습니다. 문제에 대한


: 당신이 대화의 CEdit 멤버를 사용해야 헬퍼 비 멤버 함수가있는 경우 멤버 함수를 호출 할 때, 당신은 void nonMember(CEdit& m_bEditControl)void nonMember()을 변경하고이 멤버에 대한 참조를 전달할 수 있습니다 nonMember(m_bEditControl); 그러나 그런 종류의 접근법은 잘못되었음을 주목하십시오. 즉

:이은 나쁜 디자인 것 같다 :

void nonMember(CEdit& m_bEditControl) 
{ 
    CString text = L"something"; 
    m_bEditControl.SetWindowTextW(text.GetBuffer()); 
} 

void MainDlg::someMethod() 
{ 
    nonMember(m_bEditControl); 
} 

이 훨씬 더 나은 것 같다 :

CString nonMember2() 
{ 
    return L"something"; 
} 

void MainDlg::someMethod() 
{ 
    CString str = nonMember2(); 
    m_bEditControl.SetWindowTextW(str.GetBuffer()); 
} 

희망이 도움이 :)

관련 문제