2016-08-23 3 views
0

확인란과 편집 컨트롤이 있습니다. 확인란이 선택되지 않은 경우 편집 컨트롤을 사용하지 않도록 설정하고 확인란을 선택하면 컨트롤 편집을 사용하려고합니다.체크 상자 컨트롤 (MFC)의 도움으로 편집 상자 활성화/비활성화

확인란을 선택/선택 취소하면 OnBnClickedCheck1이 호출됩니다. m_CHECK1_VARIABLE은 확인란이 선택되어 있는지 여부를 알려줍니다. If-else 부분은 올바르게 실행되지만 m_TEXT1_CONTROL.EnableWindow (FALSE/TRUE)는 작동하지 않습니다.

다음은 코드입니다.

void CPreparationDlg::OnBnClickedCheck1() 
{ 
    UpdateData(TRUE); 
    if (m_CHECK1_VARIABLE) 
    { 
     m_TEXT1_CONTROL.EnableWindow(TRUE); 
    } 
    else if (m_CHECK1_VARIABLE) 
    { 
     m_TEXT1_CONTROL.EnableWindow(FALSE); 
    } 

} 

2 가지 경우가 있습니다.

  1. 대화 상자가 열릴 때 기본적으로 편집 상자가 비활성화됩니다.

대화 상자 속성에서 '사용 안 함'동작을 '거짓'으로 설정 한 경우 기본적으로 편집 상자가 활성화되어있는 경우 편집 작업 중에는 편집 상자가 활성화 된 상태로 유지됩니다. (확인란의 선택 및 선택을 취소하십시오)

  1. 대화 상자가 열릴 때 기본적으로 편집 상자가 활성화됩니다. 나는 기본적으로 편집 상자를 사용하지 않으면

은 편집 박스가 체크 상자의 '확인' '첫 번째'활성화된다 (I '는 진정한'하는 대화 속성에서 '사용 안 함'동작을 설정) 만 유지 나머지 작업 전체에서 활성화됩니다. (체크 박스에서 체크 및 체크 해제).

내가 여기에없는 것은 무엇입니까?

+0

디버거로 코드를 실행하면 도움이되었습니다. –

답변

1

다음 코드 예제는 필요한 논리를 구현합니다.

헤더 파일 :

public: 
    int m_Check; 
    CEdit m_EditBox; 
    afx_msg void OnBnClickedCheck1(); 

클래스 구현 소스 :

CMfcApplicationDlg::CMfcApplicationDlg(CWnd* pParent /*=NULL*/) 
    : CDialog(CMfcApplicationDlg::IDD, pParent) 
    , m_Check(0) // Default checkbox state 
{ 
    // ... 
} 

void CMfcApplicationDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
    DDX_Control(pDX, IDC_EDIT1, m_EditBox); 
    DDX_Check(pDX, IDC_CHECK1, m_Check); 

    m_EditBox.EnableWindow(m_Check); 
} 

void CMfcApplicationDlg::OnBnClickedCheck1() 
{   
    UpdateData(); 
} 

필요한 모든 기능은 있는 DoDataExchange() 방법 내에서 구현 될 수있다. 처음에는 편집 상자 컨트롤 상태가 m_Check 기본값에 따라 설정되었습니다. 다음 번에 OnBnClickedCheck1() 이벤트에 의해 편집 상자 컨트롤 상태가 트리거됩니다.

+0

아 .. 여기 바보 같은 실수를 저질렀습니다. 훨씬 더 아프다 : D. 내 'If'문과 'Else'문은 동일하므로 다른 곳으로 이동하지 않습니다! 어쨌든 귀하의 의견에 감사드립니다. 나는 당신이했던 방식대로 구현할 수있었습니다. – legameeternoforall

1

대화 상자의 상태를 유지하기 위해 DoDataExchange (..)를 사용하는 IMHO는 최고입니다. UdateState()와 같은 멤버를 추가하고이를 사용하십시오. OnInitDialog()에서 대화 상자를 생성자에서 쉽게 초기화하지 않고 UpdateState()를 호출합니다.

DoDataExchange (..)를 사용하여 대화와 개체간에 데이터를 교환하는 것처럼 들리십시오. Dialog가 진화하면 당신은 자신을 구석에 그리지 않을 것입니다.

//....h 
    CEdit m_EditBox; 
    CButton m_CheckBox; 

//...cpp  
BOOL MyDialog::OnInitDialog() 
{ 
    if(! CDialogEx::OnInitDialog()) 
     return FALSE; 
    //do more stuff then 
    UpdateState(); 
    return TRUE; 
} 

void MyDialog::UpdateState() 
{ 
    m_EditBox.EnableWindow(m_CheckBox.GetCheck() == BST_CHECKED); 
    //more state stuff... 
} 

void MyDialog::OnBnClickedCheck1() 
{   
    UpdateState(); 
}