1. 程式人生 > >CListCtrl控制元件的標題欄新增checkbox

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;

}

 

效果展示如下: