刚接触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);}
很多细节问题处理不好。
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);}
在combox里输入字符,下拉框里按输入排序自动找到;----------》自己做个字符判断就可
找到后,鼠标点击或Eenter确定数据。----》设置一下pretranslate函数,点enter就不会退出;楼主加个响应函数就可实现确定数据;代码还是楼主自己写吧。
这个功能我也在尝试中,试好了,再回答你。
关于回车关对话框的问题,有人已经问过了,就是让OnOK,OnCancle直接返回。
void CDlg_DlgX::OnCbnSetfocusButton1(){
CComboBox *pCombo1=(CComboBox *)GetDlgItem(IDC_COMBO1);
pCombo1->ShowDropDown();
}
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();
}
成员变量
CMyCombo::CMyCombo()
{
m_hcur = ::LoadCursor(NULL, IDC_ARROW);
}CMyCombo::~CMyCombo()
{
if (m_hcur)
::DeleteObject(m_hcur);
}