zoukankan      html  css  js  c++  java
  • 使用CCheckListBox并获得检查状态通知

    介绍 我喜欢MFC提供

      

    的CCheckListBox类,但是,它的使用并不明显,向导的帮助仅限于CListBox类。我将描述如何轻松地将其插入到项目中。(也许还有更简单的方法,但我就是这么做的,而且确实有效。) 我还将展示如何添加事件通知,以便在复选框状态发生变化时查找事件通知。 创建CCheckListBox成员 创建一个新的MFC应用程序或对话框应用程序。在资源编辑器中,向对话框中添加一个“常规”列表框。 右击列表框属性,然后样式选项卡确保所有者绘制=固定确保有字符串=检查 按住CTRL键,双击资源对话框中的列表框。 向导只会给你一个选项来创建一个CListBox,选择它,我们会在代码中改变它。 在头代码中,将向导生成的代码更改为: 隐藏,复制Code

    // Dialog Data
         //{{AFX_DATA(CCheckListBoxCBNDlg)
         enum { IDD = IDD_CHECKLISTBOXCBN_DIALOG };
         CListBox  m_ctlCheckList;
         //}}AFX_DATA

    : 隐藏,复制Code

    // Dialog Data
         //{{AFX_DATA(CCheckListBoxCBNDlg)
         enum { IDD = IDD_CHECKLISTBOXCBN_DIALOG };
         //}}AFX_DATA
    CCheckListBox m_ctlCheckList;

    在正文中,更改以下生成的代码: 隐藏,复制Code

    void CCheckListBoxCBNDlg::DoDataExchange(CDataExchange* pDX)
    {
         CDialog::DoDataExchange(pDX);
         //{{AFX_DATA_MAP(CCheckListBoxCBNDlg)
         DDX_Control(pDX, IDC_LIST1, m_ctlCheckList);
         //}}AFX_DATA_MAP
    }

    : 隐藏,复制Code

    void CCheckListBoxCBNDlg::DoDataExchange(CDataExchange* pDX)
    {
         CDialog::DoDataExchange(pDX);
         //{{AFX_DATA_MAP(CCheckListBoxCBNDlg)
         //}}AFX_DATA_MAP
         DDX_Control(pDX, IDC_LIST1, m_ctlCheckList);
    }

    向CCheckListBox添加项 现在,你可以在OnInitDialog成员的清单中添加一些东西,比如: 隐藏,复制Code

         m_ctlCheckList.ResetContent();
    //   m_ctlCheckList.SetCheckStyle( BS_AUTO3STATE );
         m_ctlCheckList.SetCheckStyle( BS_3STATE );
         m_ctlCheckList.AddString("Fumble");
         m_ctlCheckList.SetCheck( 0, 0 );
         m_ctlCheckList.AddString("Bumble");
         m_ctlCheckList.SetCheck( 1, 1 );
         m_ctlCheckList.AddString("Gumble");
         m_ctlCheckList.SetCheck( 2, 2 );

    注意,在描述BS_AUTO3STATE和BS_3STATE时,MSDN文档有点脆弱。如果您使用BS_3STATE,那么您将不会得到复选框通知,并且状态是锁定的(仅在代码中可以更改)。如果您使用BS_AUTO3STATE,那么您将获得状态更改的通知,复选框将进行自我管理。你只需要试验一下,看看哪个能给你想要的效果。 确定复选框状态更改 你仍然可以使用向导的检查列表控件,你已经创建,但你会看到列表被限制为特定的CListBox项目: 我想让处理程序知道复选框的状态何时改变(不是选择的改变)。为此,在标题中手动添加事件处理程序,如下所示。注意,如果用户单击一个复选框,您将获得两个单击事件,首先是OnCheckchangeList1,其次是OnSelchangeList1。 注意:如果您依赖当前选择来更改结构中的复选框状态,即。,对GetCurSel的调用将是OnCheck调用中的新选择,即使OnSelchange尚未被调用。 隐藏,复制Code

    //{{AFX_MSG(CCheckListBoxCBNDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnSelchangeList1();
    afx_msg void OnCheckchangeList1();
    //}}AFX_MSG
    

    在正文中,将事件处理程序添加到消息映射: 隐藏,复制Code

    BEGIN_MESSAGE_MAP(CCheckListBoxCBNDlg, CDialog)
         //{{AFX_MSG_MAP(CCheckListBoxCBNDlg)
         ON_WM_SYSCOMMAND()
         ON_WM_PAINT()
         ON_WM_QUERYDRAGICON()
         ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
         //}}AFX_MSG_MAP
         ON_CLBN_CHKCHANGE(IDC_LIST1, OnCheckchangeList1)
    END_MESSAGE_MAP()

    并添加处理程序的实现。 隐藏,复制Code

    void CCheckListBoxCBNDlg::OnCheckchangeList1() 
    {
         // TODO: Add your control notification handler code here
         TRACE( "CCheckListBoxCBNDlg::OnCheckchangeList1\n" );     
    }

    结论 此时,您就有了一个可以轻松扩展的复选列表框。其他几篇CodeProject文章显示了带有复选框的多复选列表框类和列表视图报告视图。这是MFC CCheckListBox最简单的实现。 有些人不喜欢CCheckListBox,因为它会导致一些歧义,但它实际上取决于它所使用的上下文。例如,检查项目是否打开事物或事物是否被启用。它什么时候被打开,当我检查它或当我按OK/应用在对话框。请小心使用此控件。 本文中的代码具有最小的错误检查,仅用于说明目的。 项目已在vc++ 6.0 SP5, win2k SP4上进行测试。 许可证 本文没有附带明确的许可,但可能包含文章文本或下载文件本身的使用条款。如果有疑问,请通过下面的讨论区联系作者。可以在这里找到作者可能使用的许可证列表。 本文转载于:http://www.diyabc.com/frontweb/news264.html

  • 相关阅读:
    ASP.NET Web API是如何根据请求选择Action的?[上篇]
    Ruby的对象模型
    MongoDB学习3
    Linux目录树详细说明
    Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
    [置顶] SQL注入安全分析
    3.9 聚集和联接
    Qt之QTemporaryFile(文件名唯一,且可以自动删除)
    调用Windows属性窗口(居然是通过注册表来调用的)
    QTextEdit中选中文本修改字体与颜色,全部文本修改字体与颜色(设置调色板的前景色、背景色、文字颜色以及基色)
  • 原文地址:https://www.cnblogs.com/Dincat/p/13437305.html
Copyright © 2011-2022 走看看