zoukankan      html  css  js  c++  java
  • 扩展CComboBox

    介绍 我经常需要一个

      

    组合框来为我打算写什么提供建议,但是我没有找到任何适合我需要的东西,所以我决定自己实现一个并分享它。我试图保持它的简单、标准和易于使用。 描述 我的类,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

  • 相关阅读:
    常用知识点集合
    LeetCode 66 Plus One
    LeetCode 88 Merge Sorted Array
    LeetCode 27 Remove Element
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 448 Find All Numbers Disappeared in an Array
    LeetCode 219 Contains Duplicate II
    LeetCode 118 Pascal's Triangle
    LeetCode 119 Pascal's Triangle II
    LeetCode 1 Two Sum
  • 原文地址:https://www.cnblogs.com/Dincat/p/13437423.html
Copyright © 2011-2022 走看看