下载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