CListCtrl控制元件的標題欄新增checkbox
CListCtrl控制元件的標題欄新增checkbox
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;
}
效果展示如下: