帶checkbox的listctrl的選取和不選取事件

 

分類: C/C++

2011-11-17 16:24:01

 

設置LVS_EX_CHECKBOXES風格 
    ListView_SetExtendedListViewStyle(m_List.GetSafeHwnd(), m_List.GetExStyle() | LVS_EX_CHECKBOXES); 
爲listctrl添加測試項 
    在OnInitDialog()中添加如下代碼: 
     m_List.InsertColumn(0,"Name",LVCFMT_LEFT,150); 
     m_List.InsertColumn(1,"***",LVCFMT_LEFT,200); 
     m_List.InsertItem(0, "ZhangSan"); 
     m_List.InsertItem(1, "LiSi"); 
添加控件通知消息 
    爲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; 
} 

在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; 
} 

 

 1 void CGspSellerDocPage2::refreshList()
 2 {
 3     this->UpdateData();
 4     this->m_strProduct.TrimLeft();this->m_strProduct.TrimRight();
 5     this->m_strWareType.TrimRight();
 6     this->m_strSpec.TrimLeft();this->m_strSpec.TrimRight();
 7     this->m_strModel.TrimLeft();this->m_strModel.TrimRight();
 8     this->m_strManufactor.TrimLeft();this->m_strManufactor.TrimRight();
 9 
10     m_ctrlList.DeleteAllItems();
11     GspSellerFilter filter;
12     
13     for (vector<GspSellerRangeListItem>::iterator iter = this->dataSource.begin(); iter != this->dataSource.end(); iter++)
14     {
15         if(!this->m_strProduct.IsEmpty() && (iter->strWareCode.Find(this->m_strProduct) == -1 && iter->strWareName.Find(this->m_strProduct) == -1))
16         {
17             continue;
18         }
19         if(!this->m_strSpec.IsEmpty() && iter->strSpec.Find(this->m_strSpec) == -1)
20         {
21             continue;
22         }
23         if(!this->m_strWareType.IsEmpty() && iter->strWareType.Find(this->m_strWareType) == -1)
24         {
25             continue;
26         }
27         if(!this->m_strModel.IsEmpty() && iter->strModel.Find(this->m_strModel) == -1)
28         {
29             continue;
30         }
31         if(!this->m_strManufactor.IsEmpty() && iter->strProducter.Find(this->m_strManufactor) == -1)
32         {
33             continue;
34         }
35 
36         int iIndex = m_ctrlList.GetItemCount();
37         m_ctrlList.InsertItem(iIndex, iter->strWareType);
38         m_ctrlList.SetItemText(iIndex, 1, iter-> strWareCode);
39         m_ctrlList.SetItemText(iIndex, 2, iter->strWareName);
40         m_ctrlList.SetItemText(iIndex, 3, iter->strProducter);
41         m_ctrlList.SetItemText(iIndex, 4, iter->strSpec);
42         m_ctrlList.SetItemText(iIndex, 5, iter->strModel);
43         m_ctrlList.SetItemText(iIndex, 6, iter->strUnit);
44 
45         if (iter->strCheck == _T("1")) m_ctrlList.SetCheck(iIndex, 1);
46     }    
47 }
View Code
void CGspSellerDocPage2::OnItemchangedListWareRange(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NM_LISTVIEW* pNMLV = (NM_LISTVIEW*)pNMHDR;
    CString strWareCode = m_ctrlList.GetItemText(pNMLV->iItem, 1);
    GspSellerRangeListItem *rowItem = NULL;
    for(int i=0;i<this->dataSource.size();i++)
    {
        if(strWareCode == this->dataSource[i].strWareCode)
        {
            rowItem = &this->dataSource[i];
            break;
        }
    }
    // TODO: Add your control notification handler code here
    if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(1)) /* old state : unchecked */ 
      && (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(2)) /* new state : checked */ 
      ) 
    { 
      //TRACE("Item %d is checked\n", pNMLV->iItem);
        if(rowItem != NULL)
            rowItem->strCheck = "1";
    } 
    else if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(2)) /* old state : checked */ 
      && (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(1)) /* new state : unchecked */ 
      ) 
    { 
      //TRACE("Item %d is unchecked\n", pNMLV->iItem); 
        if(rowItem != NULL)
            rowItem->strCheck = "0";
    } 
    else 
    { 
      TRACE("Item %d does't change the check-status\n", pNMLV->iItem); 
    }
    *pResult = 0;
}

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章