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

  • 相关阅读:
    JS 实现图片模态框,幻灯片,跑马灯功能
    JavaScript 实现表格单列按字母排序
    JavaScript 进度条重复加载
    JS / CSS 实现的便签记录本
    HTML CSS, JavaScript 计算器
    JS/CSS 各种操作信息提示效果
    JS/CSS 在屏幕底部弹出消息
    Immer 实战讲解
    mixin配合class实现多继承的绝佳妙用
    Axios源码深度剖析
  • 原文地址:https://www.cnblogs.com/Dincat/p/13437423.html
Copyright © 2011-2022 走看看