CCheckListBox的使用

1.简述

CCheckListBox:显示一个带有复选框的项目列表,比如文件名,用户可以选中或清除该复选框。例如在Window系统(以Win10为例)中,随便打开一个文件夹(C:\Program Files (x86)),单击查看,点选项目复选框,如下图所示:
在这里插入图片描述
当鼠标光标移动到文件夹列表时,会发现文件夹前会出现一个复选框,我们可以对其中一些文件进行勾选,此处就用到的应该就是CCheckListBox了。
在这里插入图片描述
这段时间刚好有用到这个控件,之前也不知道也没用过,这边做个记录,便于以后回顾。

class CCheckListBox : public CListBox

详细描述的见MSDN官方文档。

2.常用Member functions

1.ClistBox

NameFunction
GetCountReturns the number of strings in a list box.
AddStringAdds a string to a list box.
InsertStringInserts a string at a specific location in a list box.
DeleteStringDeletes a string from a list box.
FindStringSearches for a string in a list box.
GetCurSelReturns the zero-based index of the currently selected string in a list box.
SetCurSelSelects a list-box string.

2. CChekListBox

NameFunction
EnableEnables or disables a checklist box item.
IsEnabledDetermines whether an item is enabled.
GetCheckGets the state of an item’s check box.
GetCheckStyleGets the style of the control’s check boxes.
SetCheckSets the state of an item’s check box.
SetCheckStyleSets the style of the control’s check boxes.

所有成员函数及其详细描述的见MSDN官方文档。

3.使用CCheckListBox

这边的使用方式与MSDN的方式不太一样,但用起来也挺方便。

1.创建CCheckListBox:

假设MainDialog的对话框类为:CMainDialog。

  1. 添加List Box控件。在Resource View,打开你需要添加CCheckListBox的Dialog;通过Toolbox拖拽一个List Box控件;
  2. 修改List Box控件的属性。 1)ID: IDC_LIST;2)OWner Draw: Fixed; 3)Has Strings: True; 其它属性根据自己需要自行设置即可;
  3. 添加ON_LBN_SELCHANGE消息的消息响应函数。在Resource View中直接双击List Box控件即可;afx_msg void OnLbnSelchangeListCurve();
  4. CMainDialog.h 中添加 CCheckListBox m_CheckListBox;成员变量;同时添加ON_CLBN_CHKCHANGE消息的消息响应函数:afx_msg void OnCheckChangeListCurve(); 同时生成其消息响应函数。
  5. CMainDialog.cpp中添加ON_LBN_SELCHANGEON_CLBN_CHKCHANGE的消息映射:
BEGIN_MESSAGE_MAP(CCheckListBoxDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_LBN_SELCHANGE(IDC_LIST, &CCheckListBoxDlg::OnLbnSelchangeList)
	ON_CLBN_CHKCHANGE(IDC_LIST, &CCheckListBoxDlg::OnCheckchangeList)
END_MESSAGE_MAP()
  1. 在CMainDialog.cpp中的CMainDialog::DoDataExchange( CDataExchange* pDX )函数中将控件与变量进行绑定:
void CMainDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST, m_CheckListCtl);
}
  1. 在**CMianDialog::OnInitDialog()**中进行初始化设定:
BOOL CMainDialog::OnInitDialog()
{
	CDialog::OnInitDialog();
	m_CheckListBox.ResetContent();
//	m_CheckListCtl.SetCheckStyle( BS_CHECKBOX );	 //BS_CHECKBOX, will not get check box notifications and the states are locked (changeable in code only). 
	m_CheckListCtl.SetCheckStyle( BS_AUTOCHECKBOX);	 //BS_AUTOCHECKBOX, will get notifications of state changes, and the check boxes will manage themselves. 2 States(Check\UnCheck)
//	m_CheckListCtl.SetCheckStyle( BS_AUTO3STATE );   //BS_AUTO3STATE, will get notifications of state changes, and the check boxes will manage themselves.   3 States(Check\UnCheck\Gray)
//	m_CheckListCtl.SetCheckStyle( BS_3STATE );	     //BS_3STATE, will not get check box notifications and the states are locked (changeable in code only).
	m_CheckListCtl.AddString(_T("Aumble"));
	m_CheckListCtl.SetCheck( 0, 1 );
	m_CheckListCtl.AddString(_T("Bumble"));
	m_CheckListCtl.SetCheck( 1, 1 );
	m_CheckListCtl.AddString(_T("Cumble"));
	m_CheckListCtl.SetCheck( 2, 1 );
	m_CheckListCtl.AddString(_T("Dumble"));
	m_CheckListCtl.SetCheck( 3, 1 );
	m_CheckListCtl.AddString(_T("Eumble"));
	m_CheckListCtl.SetCheck( 4, 1 );
	m_CheckListCtl.AddString(_T("Fumble"));
	m_CheckListCtl.SetCheck( 5, 1 );
	m_CheckListCtl.AddString(_T("Gumble"));
	m_CheckListCtl.SetCheck( 6, 1 );
	m_CheckListCtl.InsertString(7, _T("Humble"));
	m_CheckListCtl.SetCheck( 7, 1 );
	return TRUE;
}
  1. 编译运行,结果如下所示:
    在这里插入图片描述

2.删除CCheckListBox中的String

使用成员函数DeleteString()删除指定的String。

int DeleteString(
   UINT nIndex; //Specifies the zero-based index of the string to be deleted.
);

Remarks:nIndex之后的所有项现在向下移动一个位置。例如,如果一个列表框包含两个项目,删除第一个项目将导致其余项目现在位于第一个位置。对于第一个位置的项,nIndex=0。
也就是说删除项后面的项将向前移动,其对应的Index将减1: Index2 --> Index1; Index1–>Index0。

MSDN示例代码:

// Delete every other item from the list box.
for (int i = 0; i < m_myListBox.GetCount(); i++)
{
   m_myListBox.DeleteString(i);
}

看它的意思其实是想删除掉所有的项,但实际结果却并非如此,我对OK Button做了消息响应:

void CMainDialog::OnBnClickedOk()
{
	// TODO: Add your control notification handler code here
	for (int i = 0; i < m_CheckListCtl.GetCount(); i++)
	{
		m_CheckListCtl.DeleteString(i);
	}
//	OnOK();
}

单击一次OK Button结果如下图:
在这里插入图片描述
单击两次OK Button结果如下图:
在这里插入图片描述
单击三次OK Button结果如下图:
在这里插入图片描述
直到第四次单击OK Button才将所有Item删完,如下图:
在这里插入图片描述
当时也比较疑惑为什么会这样,这可是MSDN的示例代码应该没毛病才对。之后搞了好一会儿才想明白还是因为Delete后它后面的项会前移的原因。

void CMainDialog::OnBnClickedOk()
{
	// TODO: Add your control notification handler code here
	int iCount = 0;
	for (int i = 0; i < (iCount = m_CheckListCtl.GetCount()); i++)
	{
		m_CheckListCtl.DeleteString(i);
	}
//	OnOK();
}

简化上述CheckListBox StringItems为
String[A, B, C, D, E, F, G, H],index0–>A;

iDeleteString(index)String[]Index0iCount
i = 0DeleteString(0)String[B, C, D, E, F, G, H]B8
i = 1DeleteString(1)String[B, D, E, F, G, H]B7
i = 2DeleteString(2)String[B, D, F, G, H]B6
i = 3DeleteString(3)String[B, D, F, H]B5
i = 4String[B, D, F, H]B4

当 i = 4 时,此时获得的iCount = 4, i < iCount 条件不满足,结束循环,所以最终序列还剩下String[B, D, F, H]。第二次单击 OK Button也类似的情况。

因此想要一次性Delete All String Items,有以下方法。
方法一:

void CMainDialog::OnBnClickedOk()
{
	// TODO: Add your control notification handler code here
	int i = 0; 
	int iCount = m_CheckListCtl.GetCount(); //提前初始化iCount
	for (i; i < iCount; i++)
	{
		m_CheckListCtl.DeleteString(0); //每次Delete Index0;
	}
//	OnOK();
}

方法二:

void CMainDialog::OnBnClickedOk()
{
	// TODO: Add your control notification handler code here
	int i = 0; 
	for (i = m_CheckListCtl.GetCount(); i >= 0; i--)
	{
		m_CheckListCtl.DeleteString(i);
	}
//	OnOK();
}

好了,以上就是CCheckListBox的使用,如有错误之处,欢迎指正交流。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值