2012-07-19 2 views
0
class MyApp : public CWinApp { 
     afx_msg OnPrefrences(); 
    }; 

사용자가 메뉴 모음에서 도구 -> 환경 설정을 선택하면 OnPrefrences()가 호출됩니다.클래스 인스턴스간에 변수 공유

이제 한 대화 상자 (Say DlgX)에 하나의 버튼이 있습니다.이 대화 상자를 열려면 실제로 많은 패널이있는 환경 설정 대화 상자를 열어야합니다. 그러나 여기에서 이러한 창 중 하나를 선택하여 환경 설정 대화 상자를 열어야합니다. 유효한. 또한 특정 창에서 메뉴를 통하지 않고 대화 상자를 열 때만 일부 컨트롤을 숨길 필요가 있습니다.

그래서 MainFrm 클래스에서 하나의 변수 (Say m_varX)를 만들었습니다.

void DlgX::OnButtonXClick() 
{ 
    CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); 
    if(pFrame) 
    { 
     pFrame->m_varX = TRUE; 
     ((CMyApp*)(AfxGetApp()))->OnPrefrences(); 
     pFrame->m_varX = FALSE; 
    } 
} 

그리고이 m_varX가 TRUE 만들어지고 OnPreference을 (호출 한 DlgX의 단추 처리기에서) 내가 m_varX의 FALSE 만든이 환경 설정 대화 상자의 폐쇄 후

.

이 모든 것이 잘 작동합니다 ...하지만 문제는 일들이 mainFrm에서 혼란 스럽다는 것입니다. 또한 제가 작업하고있는 프로젝트는 레거시 프로젝트이므로 많은 변화를 줄 수 없습니다.

이러한 사례를 처리하는 데 사용할 수있는 패턴이 있습니까?

감사 때로는 더 이상 패턴을 고려하더라도

답변

1

당신은

사용자 정의 대화 상자가이 문제를 해결 할 수있다. ctor가 몇 가지 인수를 취하는 사용자 정의 대화 상자를 수행해야합니다.

예 :

enum { all, part }; 

void MainFrame::OnPreferences() 
{ 
    CMyPreferences dlg(GetDocument(), all); 
    dlg.DoModal(); 
} 

하지만 대화 상자에서 호출 할 때 필요한 부분 만 채울 수 있습니다.

void YourDialog::OnPreferences() 
{ 
    CMyPreferences dlg(GetDocument(), part); 
    dlg.doModal(); 
} 

인수는 편집/표시 할 항목을보다 세밀하게 조정할 수있는보다 정교한 형식 일 수 있습니다.

+0

괜찮습니다. 변경하는 것이 좋습니다. 현재 수행중인 작업입니다. void OnPreferences (BOOL bShowAll = TRUE); MFC에서 일과 같은 몇 가지 유틸리티 클래스를 제공하는 경우 궁금합니다 ... – dearvivekkumar

1

나는 특별한 경우에 생각의 singleton pattern 당신을 위해 작동합니다. (당신이 이미 그것을 가지고 있겠지 경우) 메인 메뉴 즉 onPreferences() 당신이 작성하고 모든 '창'을 보여에서 대화 상자를 표시 할 때

관련 문제