使用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

原文地址:https://www.cnblogs.com/Dincat/p/13437305.html