关于CListCtrl控件的添加CheckBox扩展功能 1C

最近在做一个小项目,想在自己的CXListCtrl类中实现单元格中可以有CheckBox。原本的一个风格只会实现第一列有CheckBox,其他列单元个要有CheckBox请问怎么实现?在CodeProject网上查到了一个XListCtrl控件,但是太复杂,不会引用到VC 6.0中,求大婶支招。我的邮箱wmg715@163.com

2个回答

 1 建立测试工程 
    新建一个对话框工程,并添加一个CListCtrl控件,并关联一个成员变量m_List。 
2 设置LVS_EX_CHECKBOXES风格 
    ListView_SetExtendedListViewStyle(m_List.GetSafeHwnd(), m_List.GetExStyle() | LVS_EX_CHECKBOXES); 
3 为listctrl添加测试项 
    在OnInitDialog()中添加如下代码: 
     m_List.InsertColumn(0,"Name",LVCFMT_LEFT,150); 
     m_List.InsertColumn(1,"Sex",LVCFMT_LEFT,200); 
     m_List.InsertItem(0, "ZhangSan"); 
     m_List.InsertItem(1, "LiSi"); 
4 添加控件通知消息 
    为ListCtrl控件添加LVN_ITEMCHANGED消息。系统生成如下代码: 
void CXXXDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); 
// TODO: Add your control notification handler code here 
*pResult = 0; 
} 

5 在LVN_ITEMCHANGED消息处理函数中添加代码如下: 
void CXXXDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); 
// TODO: Add your control notification handler code here 
/* 
typedef struct tagNMLISTVIEW 
{ 
NMHDR   hdr; 
int     iItem; 
int     iSubItem; 
UINT    uNewState; 
UINT    uOldState; 
UINT    uChanged; 
POINT   ptAction; 
LPARAM  lParam; 
} NMLISTVIEW, *LPNMLISTVIEW; 
*/ 
if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(1)) /* old state : unchecked */ 
  && (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(2)) /* new state : checked */ 
  ) 
{ 
  TRACE("Item %d is checked\n", pNMLV->iItem); 
} 
else if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(2)) /* old state : checked */ 
  && (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(1)) /* new state : unchecked */ 
  ) 
{ 
  TRACE("Item %d is unchecked\n", pNMLV->iItem); 
} 
else 
{ 
  TRACE("Item %d does't change the check-status\n", pNMLV->iItem); 
} 

*pResult = 0; 
} 

6 调试 
在debug环境下,改变checkbox的选中状态,查看输出信息。 

`1 建立测试工程
新建一个对话框工程,并添加一个CListCtrl控件,并关联一个成员变量m_List。
2 设置LVS_EX_CHECKBOXES风格
ListView_SetExtendedListViewStyle(m_List.GetSafeHwnd(), m_List.GetExStyle() | LVS_EX_CHECKBOXES);
3 为listctrl添加测试项
在OnInitDialog()中添加如下代码:
m_List.InsertColumn(0,"Name",LVCFMT_LEFT,150);
m_List.InsertColumn(1,"Sex",LVCFMT_LEFT,200);
m_List.InsertItem(0, "ZhangSan");
m_List.InsertItem(1, "LiSi");
4 添加控件通知消息
为ListCtrl控件添加LVN_ITEMCHANGED消息。系统生成如下代码:
void CXXXDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
}

5 在LVN_ITEMCHANGED消息处理函数中添加代码如下:
void CXXXDlg::OnLvnItemchangedList1(NMHDR pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
// TODO: Add your control notification handler code here
/

typedef struct tagNMLISTVIEW
{
NMHDR hdr;
int iItem;
int iSubItem;
UINT uNewState;
UINT uOldState;
UINT uChanged;
POINT ptAction;
LPARAM lParam;
} NMLISTVIEW, LPNMLISTVIEW;
*/
if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(1)) /
old state : unchecked /
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(2)) /
new state : checked /
)
{
TRACE("Item %d is checked\n", pNMLV->iItem);
}
else if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(2)) /
old state : checked /
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(1)) /
new state : unchecked */
)
{
TRACE("Item %d is unchecked\n", pNMLV->iItem);
}
else
{
TRACE("Item %d does't change the check-status\n", pNMLV->iItem);
}

*pResult = 0;
}

6 调试
在debug环境下,改变checkbox的选中状态,查看输出信息。 `

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问