介绍 我喜欢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