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

    首先要添加checkboxBMP资源文件,在对话框初始化创建一个包含这个bitmapimage 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;

}

 

效果展示如下:



VC/MFC之ListCtrl控件使用经验总结

http://blog.sina.com.cn/s/blog_4b44e1c00100d493.html