CListCtrl控件的标题栏添加checkbox
CListCtrl控件添加checkbox很容易,直接设置CListCtrl的风格就可以了。但是在标题栏也添加checkbox,实现全选和全不选,貌似都只能采取自绘的形式。具体步骤介绍如下。
1创建CListCtrl控件,并设置其风格为checkbox;
至于怎么添加CListCtrl我这里就不介绍了,网上很资料很多,我只介绍使用checkbox这部分。首先设置CListCtrl的风格,让每一列最前面出现勾选框。
(注:本文使用的CListCtrl的申明为:CListCtrl m_searchresultlist; )
m_searchresultlist.SetExtendedStyle(m_searchresultlist.GetExtendedStyle()|LVS_EX_CHECKBOXES);
2为标题栏添加一个checkbox
首先要添加checkbox的BMP资源文件,在对话框初始化创建一个包含这个bitmap的image list ,然后将这个imagelist添加到标题栏。
checkboxe.bmp
BOOL DataSearchDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when theapplication's main window is not a dialog
SetIcon(m_hIcon,TRUE); //Set big icon
SetIcon(m_hIcon,FALSE); //Set small icon
// TODO: Add extra initialization here
CRect rect;
//获取文件显示列表位置和大小
m_searchresultlist.GetClientRect(&rect);
//列表空间添加checkbox风格
m_searchresultlist.SetExtendedStyle(m_searchresultlist.GetExtendedStyle()|LVS_EX_CHECKBOXES);
//为视图表添加列
m_searchresultlist.InsertColumn(0,_T("文件名"),LVCFMT_CENTER,rect.Width()/3,0);
//在表头上添加checkbox
/*CHeaderCtrl* */pHeadCtrl =m_searchresultlist.GetHeaderCtrl();
ASSERT(pHeadCtrl->GetSafeHwnd());
VERIFY(m_checkImgList.Create(IDB_CHECKBOXES, 16, 3, RGB(255,0,255)));
int i = m_checkImgList.GetImageCount();
pHeadCtrl->SetImageList(&m_checkImgList);
HDITEMhdItem;
hdItem.mask= HDI_IMAGE | HDI_FORMAT;
VERIFY(pHeadCtrl->GetItem(0, &hdItem) );
hdItem.iImage= 1;
hdItem.fmt|= HDF_IMAGE;
VERIFY( pHeadCtrl->SetItem(0, &hdItem) );
return TRUE; // return TRUE unless you set the focus to a control
}
3添加点击表头的消息响应函数
ON_NOTIFY(HDN_ITEMCLICK,0, &DataSearchDlg::OnItemclickList);
设置标题栏checkbox显示状态,和列表的checkbox全选或全不选
void DataSearchDlg::OnItemclickList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMHEADERphdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
// TODO: Add your control notification handler code here
int nItem =phdr->iItem;
if (0 != nItem)
return;
HDITEMhdItem;
hdItem.mask= HDI_IMAGE | HDI_FORMAT;
pHeadCtrl =m_searchresultlist.GetHeaderCtrl();
ASSERT(pHeadCtrl->GetSafeHwnd());
VERIFY(pHeadCtrl->GetItem(nItem, &hdItem) );
if (hdItem.iImage == 1)
hdItem.iImage = 2;
else
hdItem.iImage = 1;
VERIFY(pHeadCtrl->SetItem(nItem, &hdItem) );
BOOL bl =hdItem.iImage == 2 ? TRUE : FALSE;
int nCount = m_searchresultlist.GetItemCount();
for(nItem = 0; nItem < nCount; nItem++)
{
ListView_SetCheckState(m_searchresultlist.GetSafeHwnd(), nItem, bl);
}
*pResult =0;
}
4 添加列表项目变化响应函数
ON_NOTIFY(LVN_ITEMCHANGED,IDC_LIST1, &DataSearchDlg::OnItemchangedList)
根据列表checkbox的状态显示标题栏checkbox,如果每列的checkbox都选中则调整标题栏的checkbox也选中
void DataSearchDlg::OnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEWpNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
if (LVIF_STATE== pNMLV->uChanged)
{
BOOLblAllChecked = TRUE;
int nCount =m_searchresultlist.GetItemCount();
for(int nItem = 0;nItem < nCount; nItem++)
{
if (!ListView_GetCheckState(m_searchresultlist.GetSafeHwnd(), nItem) )
{
blAllChecked = FALSE;
break;
}
}
HDITEMhdItem;
hdItem.mask = HDI_IMAGE;
if (blAllChecked)
hdItem.iImage = 2;
else
hdItem.iImage = 1;
pHeadCtrl= m_searchresultlist.GetHeaderCtrl();
ASSERT(pHeadCtrl->GetSafeHwnd());
VERIFY(pHeadCtrl->SetItem(0, &hdItem) );
}
*pResult =0;
}
效果展示如下: