刚接触MFC,用控件combox很无力啊。
很多细节问题处理不好。
msdn查出他的一大堆成员函数,无奈英文水平底,不会用。
我要做个combobox:得到焦点,弹出下拉框; 
//不知为何,在我做的里,一弹出下拉框就失去鼠标。在combox里输入字符,下拉框里按输入排序自动找到;
//不是自动完成。而在我做的里:比如我要输入“9847”,当我一输入“9”,它会自动跳到有“9”的一行,
//并选中带“9”的那行,直接在combo里显示了,而且字符全是选中状态,
//当我输入第2个字符“8”时,combo里就变“8”了,而不是“98”。找到后,鼠标点击或Eenter确定数据。
//我至今无法做到这步,因为基于对话框的一按回车就关闭,或我的鼠标不见了。
总之我需要个类似baidu主页的combobox。
相信类似我这种新手还有很多,需要你帮我们指点这些细节处理。
相信这种常用的控件,你肯定做过的。
相信你只是几分种的事。
我知道需要的代码不会很多的。
万分感谢。void CFinalAimDlg::OnEditchangeCombo1()
{
UpdateData();
CString str;
GetDlgItemText(IDC_COMBO1,str);
combo1.ShowDropDown(1);
if(GetAsyncKeyState(VK_RETURN)){
int z=combo1.FindStringExact(-1,str);
if(z!=LB_ERR)
   combo1.SetCurSel(z);
}
}
void CFinalAimDlg::OnSelchangeCombo1()
{
UpdateData();
CString model;
int   c =combo1.GetCurSel(); 
          combo1.GetLBText(c,model);}

解决方案 »

  1.   

    得到焦点,弹出下拉框;------>在设置combox时点右边三角拉长些
    在combox里输入字符,下拉框里按输入排序自动找到;----------》自己做个字符判断就可
    找到后,鼠标点击或Eenter确定数据。----》设置一下pretranslate函数,点enter就不会退出;楼主加个响应函数就可实现确定数据;代码还是楼主自己写吧。
     
      

  2.   

    楼主可不是个初学者呀,这种效果,很多人还不会做,包括我在内。我刚才试了一下,确实如你所说,弹出下拉列表后光标不见了。弹出下拉列表,COMBOBOX会自动找的,但最多只是让找到的项得到焦点框,而不能高亮。
    这个功能我也在尝试中,试好了,再回答你。
    关于回车关对话框的问题,有人已经问过了,就是让OnOK,OnCancle直接返回。
      

  3.   

    得到焦点,弹出下拉框; 这个有做过。响应 Setfocus 事件,
    void CDlg_DlgX::OnCbnSetfocusButton1(){
        CComboBox *pCombo1=(CComboBox *)GetDlgItem(IDC_COMBO1);
        pCombo1->ShowDropDown();
    }
      

  4.   

    我是有“一个编辑框”和“一个列表框”不过数据是存在access里
      

  5.   

    我勉强成功了。但必须从CComboBox类派生,必须是自画:
    void CMyCombo::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
    HDC hDC = lpDrawItemStruct->hDC;
    RECT rcItem;
    ::CopyRect(&rcItem, &lpDrawItemStruct->rcItem);
    CString str;
    GetLBText(lpDrawItemStruct->itemID, str); // Save these value to restore them when done drawing.
    COLORREF crOldTextColor = ::GetTextColor(hDC);
    COLORREF crOldBkColor = ::GetBkColor(hDC);

    if (lpDrawItemStruct->itemState  & (ODS_SELECTED | ODS_FOCUS))
    {
    ::SetTextColor(hDC, ::GetSysColor(COLOR_HIGHLIGHTTEXT));
    ::SetBkColor(hDC, ::GetSysColor(COLOR_HIGHLIGHT));
    ::FillRect(hDC, &lpDrawItemStruct->rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT));
    }
    else
    {
    HBRUSH hbr = ::CreateSolidBrush(crOldBkColor);
    ::FillRect(hDC, &lpDrawItemStruct->rcItem, hbr);
    ::DeleteObject(hbr);
    }
    rcItem.left += 2;
    ::DrawText(hDC, str, strlen(str), &rcItem, DT_SINGLELINE | DT_VCENTER);

    ::SetTextColor(hDC, crOldTextColor);
    ::SetBkColor(hDC, crOldBkColor);

    }void CMyCombo::OnEditchange() 
    {
    COMBOBOXINFO cbi;
    cbi.cbSize = sizeof(COMBOBOXINFO);
    GetComboBoxInfo(m_hWnd, &cbi);
    HWND hwndList = cbi.hwndList;
    CString str;
    GetWindowText(str);
    int n = FindString(-1, str);
    if (n != -1)
    {
    ::SendMessage(hwndList, WM_SETFOCUS, 0, 0);
    ShowDropDown();
    ::SetCursor(m_hcur);
    }
    else
    {
    ShowDropDown(FALSE);
    }
    }void CMyCombo::PreSubclassWindow()
    {
    ModifyStyle(CBS_DROPDOWNLIST, CBS_SORT | CBS_OWNERDRAWVARIABLE | CBS_HASSTRINGS | CBS_DROPDOWN);

    CComboBox::PreSubclassWindow();
    }
      

  6.   

    加上HCURSOR m_hcur
    成员变量
    CMyCombo::CMyCombo()
    {
    m_hcur = ::LoadCursor(NULL, IDC_ARROW);
    }CMyCombo::~CMyCombo()
    {
    if (m_hcur)
    ::DeleteObject(m_hcur);
    }
      

  7.   

    你应该微软基础类库参考手册,便于查询。推荐《Visual C++6.0 MFC类库参考手册》,中文的,网上有,也很清楚
      

  8.   

    感谢,以你思路,我在combo上放个edit解决了