hur.cn - 华软网

 热门搜索

怎么做出个完美的CComBoBox!!

  作者:未知    来源:网络    更新时间:2011/9/11
刚接触MFC,用控件combox很无力啊。
很多细节问题处理不好。
msdn查出他的一大堆成员函数,无奈英文水平底,不会用。
我要做个combobox:

得到焦点,弹出下拉框; 
//不知为何,在我做的里,一弹出下拉框就失去鼠标。

在combox里输入字符,下拉框里按输入排序自动找到;
//不是自动完成。而在我做的里:比如我要输入“9847”,当我一输入“9”,它会自动跳到有“9”的一行,
//并选中带“9”的那行,直接在combo里显示了,而且字符全是选中状态,
//当我输入第2个字符“8”时,combo里就变“8”了,而不是“98”。

找到后,鼠标点击或Eenter确定数据。
//我至今无法做到这步,因为基于对话框的一按回车就关闭,或我的鼠标不见了。


总之我需要个类似baidu主页的combobox。
相信类似我这种新手还有很多,需要你帮我们指点这些细节处理。
相信这种常用的控件,你肯定做过的。
相信你只是几分种的事。
我知道需要的代码不会很多的。
万分感谢。
C++">
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);

}

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

代码还是楼主自己写吧。
 

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

响应 Setfocus 事件,

C++">
void CDlg_DlgX::OnCbnSetfocusButton1(){
    CComboBox *pCombo1=(CComboBox *)GetDlgItem(IDC_COMBO1);
    pCombo1->ShowDropDown();
}

---华软网友回复---
引用 1 楼 quwei197874 的回复:
得到焦点,弹出下拉框;------>在设置combox时点右边三角拉长些
在combox里输入字符,下拉框里按输入排序自动找到;----------》自己做个字符判断就可
找到后,鼠标点击或Eenter确定数据。----》设置一下pretranslate函数,点enter就不会退出;楼主加个响应函数就可实现确定数据;

代码还是楼主自己写吧。

朋友肯定是做过的,能找出来让我看看吗?
---华软网友回复---
其实如果楼主想做复杂的组合框,
最好的办法是自己用“一个编辑框”和“一个列表框”自己组合起来,然后数据存在内存里,
“一个编辑框”和“一个列表框”只负责显示,具体效果要自己编辑函数。
好像有点难度。
呵呵。。。

---华软网友回复---
引用 5 楼 carter10004 的回复:
其实如果楼主想做复杂的组合框,
最好的办法是自己用“一个编辑框”和“一个列表框”自己组合起来,然后数据存在内存里,
“一个编辑框”和“一个列表框”只负责显示,具体效果要自己编辑函数。
好像有点难度。
呵呵。。。

我是有“一个编辑框”和“一个列表框”不过数据是存在access里
---华软网友回复---
我勉强成功了。但必须从CComboBox类派生,必须是自画:
C++">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();
}


---华软网友回复---
加上HCURSOR m_hcur
成员变量
CMyCombo::CMyCombo()
{
m_hcur = ::LoadCursor(NULL, IDC_ARROW);
}

CMyCombo::~CMyCombo()
{
if (m_hcur)
::DeleteObject(m_hcur);
}

---华软网友回复---
顶一个
---华软网友回复---
你应该微软基础类库参考手册,便于查询。推荐《Visual C++6.0 MFC类库参考手册》,中文的,网上有,也很清楚
---华软网友回复---
引用 8 楼 firefly3233 的回复:
加上HCURSOR m_hcur
成员变量
C/C++ code
CMyCombo::CMyCombo()
{
    m_hcur = ::LoadCursor(NULL, IDC_ARROW);
}

CMyCombo::~CMyCombo()
{
    if (m_hcur)
    ::DeleteObject(m_hcur);
}

感谢,以你思路,我在combo上放个edit解决了      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。