介绍 我经常需要一个
组合框来为我打算写什么提供建议,但是我没有找到任何适合我需要的东西,所以我决定自己实现一个并分享它。我试图保持它的简单、标准和易于使用。 描述 我的类,CComboBoxExt(扩展的ComboBox)是从一个标准的CComboBox派生出来的(这个解决方案的一个原因是保持标准的外观和行为),在这里我使用一个内部的CItemData类来保存和处理所有的ComboBox项数据: 隐藏,复制Code
class CItemData : public CObject { // Attributes public: DWORD m_dwItemData; CString m_sItem; BOOL m_bState; // Implementation public: CItemData(); CItemData(DWORD dwItemData, LPCTSTR lpszString, BOOL bState); virtual ~CItemData(); };
内部功能通过以下方式解决:每次用户向combobox添加一个字符串时,都会将其创建为一个新的CItemData项,该项保存关于combobox项的所有信息。当用户从组合框中删除一个字符串时,它将删除与其关联的CItemData对象。当用户在edit中键入字母时,combobox将删除与所键入字母不匹配的项,但仅从combobox中删除,而不从与CItemData关联的对象删除。 另一个特殊性是组合框的列表被子类化: 隐藏,复制Code
void CComboBoxExt::PreSubclassWindow() { // TODO: Add your specialized code here and/or call the base class COMBOBOXINFO cbi = {0}; cbi.cbSize = sizeof(COMBOBOXINFO); BOOL bRet = SendMessage(CB_GETCOMBOBOXINFO, 0, (LPARAM)&cbi); if(bRet && NULL != cbi.hwndList) m_ListBox.SubclassWindow(cbi.hwndList); .... CComboBox::PreSubclassWindow(); }
m_ListBox是类型CComboBoxExtList,派生自CListBox。 特性 ComboBoxExt有三种不同的操作方式: 其中列表的功能类似于标准的CComboBox控件。MODE_DROPDOWN,其中combobox显示一个下拉列表,项目以编辑框中输入的字母开头。 此工作模式MODE_DROPDOWN可以通过CComboBoxExt::SetMode(CComboBoxExt::MODE_DROPDOWN)激活;方法。 MODE_AUTOCOMPLETE中combobox显示一个下拉列表,它与编辑框中键入的字母相匹配,并自动完成与编辑框中键入的字母相匹配的单词。 此工作模式MODE_AUTOCOMPLETE可以通过CComboBoxExt::SetMode(CComboBoxExt::MODE_AUTOCOMPLETE)激活;方法。 控件可以将下拉列表调整为插入的最长项,这是CComboBoxExt::AdjustDroppedWidth();方法。 另外,可以使用CComboBoxExt::AlertBkg()更改编辑框文本或背景的颜色;和CComboBoxExt:: AlertText ();方法。 CComboBoxExt的另一个特性是在列表中显示一个工具提示文本并进行编辑。这个工具提示可以配置在以下几种方式显示: 当项目不符合组合时显示项目文本,或显示与项目文本不同的文本。为了有另一个工具提示文本而不是项目文本,您有几个 设置工具提示文本的方法: 隐藏,复制Code
virtual int AddStringWithInfo(LPCTSTR lpszString, LPCTSTR lpszInfo, BOOL bShowItemTooltip = TRUE);<br />virtual int InsertStringWithInfo(int nIndex, LPCTSTR lpszString, LPCTSTR lpszInfo, BOOL bShowItemTooltip = TRUE);<br />virtual void SetLBInfo(int nIndex, LPCTSTR lpszInfo, BOOL bShowItemTooltip = TRUE);<br />virtual void GetLBInfo(int nIndex, LPCTSTR lpszInfo) const;<br />virtual void GetLBInfo(int nIndex, CString& rInfo) const;<br />virtual void SetLBShowItemTooltip(int nIndex, const BOOL bShow = TRUE);<br />virtual BOOL GetLBShowItemTooltipState(int nIndex) const;<br />virtual int FindInfo(int nStartAfter, LPCTSTR lpszString) const; virtual int FindInfoExact(int nIndexStart, LPCTSTR lpszFind) const; virtual int SelectInfo(int nStartAfter, LPCTSTR lpszString);
你甚至可以找到或选择一个组合项目的工具提示信息文本。另一个特性是你可以设置工具提示项目以便在项目级别显示,我的意思是你可以说哪个项目显示工具提示,哪个项目不显示工具提示。同时,你可以设置工具提示的位置:在项目上方或在他旁边: 隐藏,复制Code
void SetEditTooltip(const BOOL bShowTooltip, BOOL bTooltipOnInfo = FALSE, BOOL bShowEditTooltipOverItem = FALSE)<br />void SetListTooltip(const BOOL bShowTooltip, BOOL bTooltipOnInfo = FALSE, BOOL bShowListTooltipOverItem = FALSE)
如你所见,你可以分别设置编辑组合工具提示和/或列表组合工具提示。 这个组合的工具提示配置可以在演示项目:combobox和listbox工具提示旁边看到: 和combobox与列表信息工具提示在列表框项目: 当你设置控件以使工具提示超过编辑,你也可以设置工具提示可以显示的地方:在编辑框的右边,或以上: 这可以通过使用CComboBoxExt::SetEditTooltipOverItemPosition(const BOOL bAbove = TRUE)来完成。 使用控制 , 要使用此控件,只需添加ComboBoxExt即可。h, ComboBoxExt。cpp, ComboBoxExtList。和comboboxext .cpp文件,在您想使用这个控件的地方,只需键入#include "ComboBoxExt.h"。此控件可以作为动态(或非)创建的控件使用。 演示项目 演示项目包括一个使用CComboBoxExt控件的SDI演示应用程序。CComboBoxExt的工作模式可以从测试应用程序表单上的单选按钮改变(这里有一些解释工作模式的工具提示),编辑框的颜色可以通过表单中的警报文本和警报背景按钮进行切换。 已知的问题 由于CBN_EDITCHANGE被反映的方式,当你打算在CDialogBarr中使用这个控件时,为了使用MODE_AUTOCOMPLETE,你必须在你的派生CDialogBar类中处理ON_CBN_EDITCHANGE。例子: 隐藏,复制Code
// CYourDlgBar header class CYourDlgBar : public CDialogBar .... // Generated message map functions //{{AFX_MSG(CYourDlgBar) afx_msg void OnEditchangeCombo(); //}}AFX_MSG DECLARE_MESSAGE_MAP() and in your implementation file: // CYourDlgBar .cpp file BEGIN_MESSAGE_MAP(CYourDlgBar, CDialogBar) //{{AFX_MSG_MAP(CYourDlgBar) ON_CBN_EDITCHANGE(IDC_COMBO_FILE, OnEditchangeCombo) //}}AFX_MSG_MAP END_MESSAGE_MAP() ..... ..... void CYourDlgBar::OnEditchangeCombo() { // TODO: Add your control notification handler code here // Do nothing }
最后…… 实际的实现为定制控件的下拉列表提供了新的可能性……我希望下一个…… 享受它! 历史 2011年4月26日:初始版本。2011年7月13日:文章更新。2011年10月10日:更新控制档案。2013年5月10日:更新控制档案。2013年6月10日:解决问题:当列表扩散,变短时,列表没有保持关闭状态。2013年8月29日:更新下拉列表工作模式。2013年11月11日:控件的下拉列表被子类化。2014年1月28日修正信息工具提示,更新控制档案。2014年3月21日:更新并简化了代码。2015年12月11日:用VS2008编译时工具提示不出现;错误修复。 本文转载于:http://www.diyabc.com/frontweb/news283.html