CCheckList的使用
1.简述
CCheckListBox:显示一个带有复选框的项目列表,比如文件名,用户可以选中或清除该复选框。例如在Window系统(以Win10为例)中,随便打开一个文件夹(C:\Program Files (x86)),单击查看,点选项目复选框,如下图所示:
当鼠标光标移动到文件夹列表时,会发现文件夹前会出现一个复选框,我们可以对其中一些文件进行勾选,此处就用到的应该就是CCheckListBox了。
这段时间刚好有用到这个控件,之前也不知道也没用过,这边做个记录,便于以后回顾。
class CCheckListBox : public CListBox
详细描述的见MSDN官方文档。
2.常用Member functions
1.ClistBox
Name | Function |
---|---|
GetCount | Returns the number of strings in a list box. |
AddString | Adds a string to a list box. |
InsertString | Inserts a string at a specific location in a list box. |
DeleteString | Deletes a string from a list box. |
FindString | Searches for a string in a list box. |
GetCurSel | Returns the zero-based index of the currently selected string in a list box. |
SetCurSel | Selects a list-box string. |
… | … |
2. CChekListBox
Name | Function |
---|---|
Enable | Enables or disables a checklist box item. |
IsEnabled | Determines whether an item is enabled. |
GetCheck | Gets the state of an item’s check box. |
GetCheckStyle | Gets the style of the control’s check boxes. |
SetCheck | Sets the state of an item’s check box. |
SetCheckStyle | Sets the style of the control’s check boxes. |
… | … |
所有成员函数及其详细描述的见MSDN官方文档。
3.使用CCheckListBox
这边的使用方式与MSDN的方式不太一样,但用起来也挺方便。
1.创建CCheckListBox:
假设MainDialog的对话框类为:CMainDialog。
- 添加List Box控件。在Resource View,打开你需要添加CCheckListBox的Dialog;通过Toolbox拖拽一个List Box控件;
- 修改List Box控件的属性。 1)ID: IDC_LIST;2)OWner Draw: Fixed; 3)Has Strings: True; 其它属性根据自己需要自行设置即可;
- 添加ON_LBN_SELCHANGE消息的消息响应函数。在Resource View中直接双击List Box控件即可;
afx_msg void OnLbnSelchangeListCurve();
- 在 CMainDialog.h 中添加
CCheckListBox m_CheckListBox;
成员变量;同时添加ON_CLBN_CHKCHANGE消息的消息响应函数:afx_msg void OnCheckChangeListCurve();
同时生成其消息响应函数。 - 在CMainDialog.cpp中添加ON_LBN_SELCHANGE、ON_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()
- 在CMainDialog.cpp中的CMainDialog::DoDataExchange( CDataExchange* pDX )函数中将控件与变量进行绑定:
void CMainDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST, m_CheckListCtl);
}
- 在**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;
}
- 编译运行,结果如下所示:
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;
i | DeleteString(index) | String[] | Index0 | iCount |
---|---|---|---|---|
i = 0 | DeleteString(0) | String[B, C, D, E, F, G, H] | B | 8 |
i = 1 | DeleteString(1) | String[B, D, E, F, G, H] | B | 7 |
i = 2 | DeleteString(2) | String[B, D, F, G, H] | B | 6 |
i = 3 | DeleteString(3) | String[B, D, F, H] | B | 5 |
i = 4 | String[B, D, F, H] | B | 4 |
当 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的使用,如有错误之处,欢迎指正交流。