使VC中CListBox带有复选框
### 使VC中CListBox带有复选框 在Visual C++ (VC) 开发环境中,标准的 `CListBox` 控件并不直接支持复选框功能。然而,在许多应用场合下,用户可能希望列表框能够具备复选功能以便于进行多选操作。本文将详细介绍如何在 VC 中为 `CListBox` 添加复选框功能,并通过一个具体的类 `CCheckListBox` 来实现这一目标。 #### 1. 创建资源文件中的列表框控件 你需要在对话框资源文件中创建一个普通的 `CListBox` 控件。请注意以下几点设置: - **Owner Drawn**:必须设置为 Owner Drawn,这允许你自定义列表项的外观。 - **Has Strings**:包含 Has Strings 属性,确保列表框可以显示文本。 - **分配 ID**:例如,可以将此列表框的 ID 设置为 `IDC_CHECKLISTBOX`。 #### 2. 实现 `CCheckListBox` 类 接下来,需要创建一个名为 `CCheckListBox` 的类,该类继承自 `CListBox`。这个类将扩展基础的 `CListBox` 功能,以支持复选框。 ##### 头文件示例(XXXDlg.h): ```cpp class CCheckListBox : public CListBox { public: void SubclassDlgItem(UINT nIDDlgItem, CWnd* pParentWnd); void SetCheckStyle(UINT nStyle); int GetCheck(int nIndex); }; ``` #### 3. 在对话框类中使用 `CCheckListBox` 在对话框类的头文件中声明 `CCheckListBox` 的实例,并覆盖 `OnInitDialog()` 方法来初始化这个控件。 ##### 对话框头文件示例(XXXDlg.h): ```cpp class CXXXDlg : public CDialog { public: CCheckListBox m_CheckListBox; // ... }; ``` ##### 对话框源文件示例(XXXDlg.cpp): ```cpp BOOL CXXXDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将资源文件中的列表框替换为 CCheckListBox m_CheckListBox.SubclassDlgItem(IDC_CHECKLISTBOX, this); // 设置复选框样式 m_CheckListBox.SetCheckStyle(BS_AUTOCHECKBOX); // 添加字符串到列表框 m_CheckListBox.AddString(_T("TestString")); return TRUE; // 返回 TRUE 除非设置焦点到控件 } ``` #### 4. 使用 `CCheckListBox` 类成员 `CCheckListBox` 类提供了一些额外的方法来设置或获取列表项的复选状态。 ##### 添加字符串至列表框: ```cpp m_CheckListBox.AddString(_T("Another Item")); ``` ##### 获取列表项的复选状态: ```cpp int iIndex = 0; int iState; iState = m_CheckListBox.GetCheck(iIndex); ``` 这里 `iState` 的值会根据列表项的状态返回 0 或 1,其中 0 表示未选中,1 表示已选中。 #### 5. 关键步骤总结 为了使 VC 中的 `CListBox` 带有复选框,关键步骤如下: 1. **创建普通列表框控件**:在对话框资源文件中创建一个普通的列表框控件,并确保其具有 Owner Drawn 和 Has Strings 属性。 2. **继承并扩展 `CListBox`**:创建 `CCheckListBox` 类继承自 `CListBox` 并添加支持复选框的功能。 3. **初始化 `CCheckListBox`**:在对话框类中实例化 `CCheckListBox` 对象,并在 `OnInitDialog()` 方法中对其进行初始化。 4. **添加与管理列表项**:使用 `AddString()` 方法添加列表项,并使用 `SetCheckStyle()`、`GetCheck()` 等方法来设置和获取列表项的复选状态。 通过上述步骤,你可以在 VC 中为 `CListBox` 添加复选框功能,从而使得用户可以方便地进行多选操作。这种方法不仅提高了用户体验,还增加了应用程序的灵活性和功能性。
由于实际需要在项目中需要使用一个带有复选框的列表控件,没错,VB、Delphi……里现成就有,但由于项目是VC工程,VC里现成的CListBox或CListCtrl都没有复选框。说到这里,高手们可能会说,简单,自已重绘一个,或者偷懒一点的方法,也可以去网上找一个别人做好现成的类来用。
其实还有一个更轻松的方法,网上找到这样一段话:
How to use the CCheckListBox class in a dialog box
Create in your resource file an ordinary list box in a dialog box. Whichever other attributes that you choose, the list box must be ownerdrawn and include the hasstrings attribute. Assume that in this case, you have assigned an ID of IDC_CHECKLISTBOX to the listbox .
Create an instance of a CCheckListBox object in the header file of your dialog box.
CCheckListBox m_CheckListBox;
Over-ride OnInitDialog() in your dialog box and subclass the list box that you created in your resource file. Set the style of the check box as you wish. See the documentation provided with your compiler.
m_CheckListBox.SubclassDlgItem(IDC_CHECKLISTBOX, this);
m_CheckListBox.SetCheckStyle(BS_AUTOCHECKBOX);
Since CCheckListBox is derived from CListBox, you have access to all the class members of CListBox. Add strings to the list box using AddString() as follows.
m_CheckListBox.AddString("Test String");
CCheckListBox provides several class members that allow you to access or set the check state of the items in the list box. For example, to see whether the first item in the list box is checked (the index of the first item would be zero), use GetCheck().
int iIndex = 0;
int iState;
iState = m_CheckListBox.GetCheck(iIndex);
方法很巧,移花接木。
MFC有一个CCheckListBox类支持复选框风格,所以我们可以直接使用ListBox控件,然后初始化时把它子类化成CCheckListBox,再设置一下风格参数就行。但要注意一下,成功的关键是要修改ListBox控件的两处属性,分别是Owner draw设置为Fixed(LBS_OWNERDRAWFIXED),Has strings设置为True(LBS_HASSTRINGS),否则不成功,运行时报错。
具体实现步骤举例如下――
1、首先在窗口上拖放一个ListBox控件,假设其资源ID为IDC_LIST1;
2、如上所述修改该ListBox控件的属性(LBS_OWNERDRAWFIXED | LBS_HASSTRINGS);
3、定义CCheckListBox对象,在窗口类的头文件里;
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
前往页