VC CListBox中加复选框

在VC工程中,标准的CListBox控件不支持内置的复选框功能。不过,可以通过自定义绘制或者使用MFC的CCheckListBox类来实现。使用CCheckListBox类,需要设置ListBox控件的属性为Owner draw固定(LBS_OWNERDRAWFIXED)和有字符串(LBS_HASSTRINGS)。然后在对话框初始化时,将ListBox子类化为CCheckListBox,并设置复选框样式。这样就可以添加和获取复选框的状态了。
摘要由CSDN通过智能技术生成
 

一个带有复选框的列表控件,VB、Delphi……里有,VC工程,VC中的CListBox, CListCtrl没有复选框。自已重绘一个,或可以去网上找一个别人做好的现成的类。

MFC有一个CCheckListBox类支持复选框风格,可以直接使用ListBox控件,初始化时把它子类化成 CCheckListBox,设置风格参数。但要注意一下,关键要修改ListBox控件的两个属性,Owner draw设置为Fixed(LBS_OWNERDRAWFIXED),Has strings设置为True(LBS_HASSTRINGS)。

1、首先在窗口上拖放一个ListBox控件,资源ID为IDC_LIST;

2、修改ListBox控件的属性(LBS_OWNERDRAWFIXED | LBS_HASSTRINGS);

3、定义CCheckListBox对象,在窗口类的头文件里;
           // XXXDlg.h
          CCheckListBox m_CheckList;

4、CPP文件中,初始化时
          // XXXDlg.cpp
          BOOL CXXXDlg::OnInitDialog()
          {
             ...
              m_CheckList.SubclassDlgItem(I

MFC(Microsoft Foundation Classes)中,如果你自定义了`CListCtrl`的`DrawItem`函数来重绘列表控件项,可能会遇到第一列的复选框消失的问题。这通常是因为在自定义绘制过程中,没有正确处理复选框的绘制。 要解决这个问题,你需要在自定义的`DrawItem`函数中,对列表控件的每项进行绘制时,包含对复选框的绘制。这可以通过调用`DrawFrameControl`函数实现,该函数用于绘制复选框或其他类型的框架控件。 通常,复选框位于列表项的第一个子项(subitem),因此你需要在处理第一列时调用`DrawFrameControl`,设置适当的参数来绘制复选框。确保使用与`CListCtrl`的`SetItem`函数中相同的`itemID`和`subItem`参数。 示例代码片段如下: ```cpp void CYourListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // 检查绘制类型是否为ODT_LISTBOX,因为CListCtrl是基于CListBox的 if(lpDrawItemStruct->itemAction & ODA_DRAWENTIRE) { CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rectItem; GetClientRect(&rectItem); // 设置背景颜色等 // ... // 设置第一列的复选框是否选中的状态 int itemState = GetItemState(lpDrawItemStruct->itemID, LVIS_SELECTED); if(itemState & LVIS_SELECTED) { // 绘制复选框 pDC->DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_FLAT); } else { // 绘制非选中的复选框或其他状态 pDC->DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, DFCS_BUTTONCHECK); } } // 绘制其他内容 // ... } ``` 确保在绘制复选框后,继续处理其他子项的绘制,并且正确使用`rectItem`和`lpDrawItemStruct->rcItem`矩形区域。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值