热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UsingtheCCheckListBoxandgettingcheckstatenotification

转自:http:www.codeproject.comkbcomboboxCCheckListBoxUsage.aspxIntroductionIliketheCC

转自:http://www.codeproject.com/kb/combobox/CCheckListBoxUsage.aspx

 

Introduction

I like the CCheckListBox class provided with MFC, however, it�s use isn�t obvious and the wizard assistance stops at the CListBox class. I�ll describe how to insert it easily in your project. (There may be easier ways to do it, but this is how I do it and it works).

I�ll also show how you can add event notification so that you can find out when the check box state changes.

Creating the CCheckListBox member


  • Create a new MFC Application or Dialog Application.
  • In the resource editor, add a "regular" list box to the dialog.
    • Right click the listbox properties, then the Styles tab;
    • Ensure the Owner Draw = Fixed;
    • Ensure Has Strings = checked;
  • Holding the CTRL key, double click on the listbox in the resource dialog.

The wizard will only give you the option to create it as a CListBox , choose that, we will change it in code.

In the header code, change the wizard generated code from:

Collapse

//
Dialog Data




//
{{AFX_DATA(CCheckListBoxCBNDlg)




enum
{ IDD = IDD_CHECKLISTBOXCBN_DIALOG };

CListBox m_ctlCheckList;

//
}}AFX_DATA

to:

Collapse

//
Dialog Data




//
{{AFX_DATA(CCheckListBoxCBNDlg)




enum
{ IDD = IDD_CHECKLISTBOXCBN_DIALOG };

//
}}AFX_DATA




CCheckListBox m_ctlCheckList;

In the body, change the following generated code from:

Collapse

void
CCheckListBoxCBNDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//
{{AFX_DATA_MAP(CCheckListBoxCBNDlg)




DDX_Control(pDX, IDC_LIST1, m_ctlCheckList);

//
}}AFX_DATA_MAP




}

to:

Collapse

void
CCheckListBoxCBNDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//
{{AFX_DATA_MAP(CCheckListBoxCBNDlg)




//
}}AFX_DATA_MAP




DDX_Control(pDX, IDC_LIST1, m_ctlCheckList);

}

Adding items to the CCheckListBox

Now, you can add stuff to the checklist in your OnInitDialog member, like:

Collapse

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
);

Note that the MSDN documentation is a little flimsy when it comes to the description of BS_AUTO3STATE and BS_3STATE . If you use BS_3STATE , then you will not get check box notifications and the states are locked (changeable in code only). If you use BS_AUTO3STATE , then you will get notifications of state changes, and the check boxes will manage themselves. You will just have to experiment with them to see which one gives you the effect you want.

Determining check box state changes

You can still use the wizard for the check list control you�ve created, but you�ll see that the list is limited to CListBox specific items:

I wanted a handler to know when a check box state changed (not a selection change). To accomplish this, manually add an event handler in the header as shown below. Note that if the user clicks on a check box, you will get two events for the click, first, OnCheckchangeList1 , followed by OnSelchangeList1 .

Caution: This is important if you depend on the current selection to change the checkbox state in a structure. I.e., the call to GetCurSel will be the new selection in the OnCheck call, even though OnSelchange hasn�t been called.

Collapse

//
{{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

In the body, add the event handler to the message map:

Collapse

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()

And add your implementation of the handler.

Collapse

void
CCheckListBoxCBNDlg::OnCheckchangeList1()

{

//
TODO: Add your control notification handler code here




TRACE( "
CCheckListBoxCBNDlg::OnCheckchangeList1/n"
);

}

Conclusion

At this point you have a check list box that you can easily extend. Several other CodeProject articles show multi check list box classes and list view report views with check boxes. This is the simplest implementation of the MFC CCheckListBox .

Some people do not like the CCheckListBox because it leads to some ambiguity, but it really depends on the context it�s used in. For example, does checking the item turn the thing on or does the thing get enabled. When does it get turned on, when I check it or when I press OK/Apply in the dialog. Use this control with caution.


推荐阅读
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
author-avatar
kaxiaoliog_334
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有