在使用DropDown类型的ComboBox时,如果使用者输入非ComboBox中列出的值,那么ComboBox的GetCurSel()的值是CB_ERR,相关的GetLBText()和GetLBTextLen()因为没有index也就无法工作。
在DDX时,可以把ComboBox和CString对应起来,采用它的原理,就可以自己来得到或设置DropDown ComboBox的文字了。
//得到ComboBox的文字 void GetComboBoxString(HWND hWndCtrl, CString& value) { // just get current edit item text (or drop list static) int nLen = ::GetWindowTextLength(hWndCtrl); if (nLen > 0) { // get known length ::GetWindowText(hWndCtrl, value.GetBufferSetLength(nLen), nLen+1); } else { // for drop lists GetWindowTextLength does not work - assume // max of 255 characters ::GetWindowText(hWndCtrl, value.GetBuffer(255), 255+1); } value.ReleaseBuffer(); }
//设置ComboBox的文字 void SetComboBoxString(HWND hWndCtrl, const CString& value) { // set current selection based on model string OutputDebugString("SetComboBoxString:" + value); if (::SendMessage(hWndCtrl, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)(LPCTSTR)value) == CB_ERR) { // just set the edit text (will be ignored if DROPDOWNLIST) AfxSetWindowText(hWndCtrl, value); } } 
|