使用CCheckListBox并获得检查状态通知

下载source - 12.4 KB

介绍

我喜欢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;

在正文中,更改以下生成的代码:

隐藏,复制Codevoid CCheckListBoxCBNDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCheckListBoxCBNDlg)
DDX_Control(pDX, IDC_LIST1, m_ctlCheckList);
//}}AFX_DATA_MAP
}

:

隐藏,复制Codevoid 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

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

隐藏,复制CodeBEGIN_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()

并添加处理程序的实现。

隐藏,复制Codevoid 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值