2011-03-23 8 views
3

MFC에는 현재 선택된 ComboBox 항목의 색인을 가져 오는 DDX_CBIndex이라는 기능이 있습니다. 하지만 대부분의 경우 색인에 관심이 없으며 대신 32 비트 응용 프로그램 제공 값을 얻고 자합니다. GetItemData을 호출 할 때 얻을 수 있습니다. 따라서 항상 OnOk을 무시하고 GetCurSelGetItemData을 사용하여이 값을 검색해야합니다.CComboBox 컨트롤에서 DDX (데이터 교환)를 올바르게 사용하는 방법은 무엇입니까?

CComboBox 항목을 가져 오거나 설정하는 더 우아한 방법은 색인에 의존하지 않고 응용 프로그램에서 제공하는 32 비트 값에 따라 다릅니 까?

감사합니다.

답변

3

이 문제의 부분적인 해결책이 있지만 @taspeotis의 제안을 사용하여이 코드를 작성했습니다.이 코드는 잘 작동하는 것으로 보입니다.

template <class T> 
void DDX_CBData(CDataExchange* pDX, int nIDC, T& data) 
{ 
    HWND hWndCtrl = pDX->PrepareCtrl(nIDC); 
    if (pDX->m_bSaveAndValidate) 
    { 
     int index = static_cast<int>(::SendMessage(hWndCtrl, CB_GETCURSEL, 0, 0L)); 
     data = (index == CB_ERR ? NULL : reinterpret_cast<T>(::SendMessage(hWndCtrl, CB_GETITEMDATA, index, 0L))); 
    } 
    else 
    { 
     int count = static_cast<int>(::SendMessage(hWndCtrl, CB_GETCOUNT, 0, 0L)); 
     for (int i = 0; i != count; ++i) 
     { 
      if (reinterpret_cast<T>(::SendMessage(hWndCtrl, CB_GETITEMDATA, i, 0L)) == data) 
      { 
       ::SendMessage(hWndCtrl, CB_SETCURSEL, i, 0L); 
       return; 
      } 
     } 
     ::SendMessage(hWndCtrl, CB_SETCURSEL, -1, 0L); 
    } 
} 
+0

잘 작동합니다. –

2

왜 구현 하나를 작성한 다음 DoDataExchange에 사용 하시겠습니까? 예 : MyDDX_CBUserData?

관련 문제