CListCtrl ---CImageList & CHeaderCtrl
在CListCtrl 中 包含着CHeaderCtrl 对应的控件
1.在CListCtrl 中使用图片:
1 CMyDialog::OnInitDialog() 2 { 3 //CListCtrl m_list; // 定义为成员变量; 4 //CImageList m_imagelistNormal; // 定义为成员变量 5 //CImageList m_imagelistSmall; 6 //CImageList m_imagelistState; 7 8 //在这里有多种方法可以插入image 9 // 1)可以使用 CImageList::Create() 函数 10 // 2) 可以使用 ListView_SetImageList 宏 11 // 3) 就是下面的方法 12 HIMAGELIST hlist1 = ImageList_Create(32,32,ILC_COLOR8| ILC_MASK , 8,1); // 32×32 pixel for Normal image 13 14 HIMAGELIST hlist2 = ImageList_Create(16,16,ILC_COLOR8| ILC_MASK , 8,1); // 16*16 pixel for small and state image 15 16 HIMAGELIST hlist3= ImageList_Create(16,16,ILC_COLOR8| ILC_MASK , 8,1); 17 18 m_imagelistNormal.Attach(hlist1); 19 // m_imagelistSmall.Attach(hlist2); 20 // m_imagelistState.Attach(hlist3); 21 22 CBitmap cbmp; 23 cbmp.LoadBitmap(IDB_TREESTATE); // "IDB_TREESTATE" bitmap resource ID depend by yourself 24 m_imagelistNormal.Add(&cbmp,RGB(255,255,255)); //each pixed of this color in bitmap changed to black. 25 // at the same time : when you assign ILC_MASK flag, to make this color is transparent. 26 m_list.SetImageList(&m_imagelistNormal, LVSIL_NORMAL); 27 //m_list.SetImageList(&m_imagelistSmall, LVSIL_SMALL); 28 //m_list.SetImageList(&m_imagelistState, LVSIL_STATE); //state image next to small image 29 30 m_list.InsertColumn(0,_T("Name")); 31 m_list.InsertColumn(1,_T("Price")); 32 33 for (int i=0; i<2; ++2) 34 { 35 LVITEM lvi = {0}; 36 lvi.mask = LVIF_TEXT | LVIF_IAMGE ;//|LVIF_STATE; // can assign : lvi.state = INDEXTOSTATEIMAGEMASK( index) ; //the one-based index of state image list 37 // lvi.stateMask = LVIS_STATEIMAGEMASK ; 38 lvi.iItem = INT_MAX ; //"INT_MAX" 表示紧随其后插入 39 lvi.iImage = I_IMAGENONE; //"I_IMAGENONE" 表示不显示图片, 如果不设置的话,默认会显示在第一列 40 m_list.InsertItem(&lvi) 41 42 lvi.iSubItem = 1; // 如果需要在subitem 上显示 图片 need set style : m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_SUBITEMIMAGES); 43 CString strtext; 44 strtext.Format(_T("$ %d"), i*10); 45 lvi.pszText = (LPTSTR)(LPCTSTR)strtext; 46 m_list1.SetItem(&lvi); 47 48 // Also can set state image list by : m_list.SetItemState(0,INDEXTOSTATEIMAGEMASK(3),LVIS_STATEIMAGEMASK); 49 } 50 51 }
CImageList是和CListCtrl的第一列绑定的,这个第一列是逻辑上的。
可以使(视图上的)非第一列变成(逻辑上的)的第一列
使第一列和其他的某列交换位置。调用了CListCtrl 的GetHeaderCtrl()方法,通过表头控件CHeaderCtrl的SetOrderArray设置(视图上的)显示顺序。
/*******第一和最后一列交换位置***/
CHeaderCtrl *pmyHeaderCtrl = m_lstEnumDev.GetHeaderCtrl();
int nCount = pmyHeaderCtrl->GetItemCount();
LPINT pnOrder = (LPINT) malloc(nCount*sizeof(int));
ASSERT(pnOrder != NULL);
pmyHeaderCtrl->GetOrderArray(pnOrder, nCount);
int nTemp;
nTemp = pnOrder[0];
pnOrder[0] = pnOrder[nCount-1];
pnOrder[nCount-1] = nTemp;
pmyHeaderCtrl->SetOrderArray(nCount, pnOrder);
free(pnOrder);
-----------------------------------------------------------------------------------
注意,LVN_ITEMCHANGED消息的产生有以下几种可能:
1、由选中到没选中的变化;
2、由没选中到选中的变化;
3、由选中一行到选中另外一行的变化;
4、使用CListCtrl::SetItem函数更改了行。
如何检测LVN_ITEMCHANGED消息是由那一变化产生的呢?NM_LISTVIEW结构成员变量uChanged和uNewState包含着这类信息,看如下代码:
void CRunListView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
//NMLISTVIEW : This structure is the same as the NM_LISTVIEW structure but has been renamed to fit standard naming conventions
NMLISTVIEW* pNMListView = (NMLISTVIEW*)pNMHDR;
if(pNMListView->uChanged == LVIF_STATE)
{
if(pNMListView->uNewState)
TRACE0("选择改变且有选中的行\r\n");
else
TRACE0("选择改变且没有选中的行\r\n");
}
else
TRACE0("行改变(CListCtrl::SetItem)\r\n");
*pResult = 0;
}
又如
void CRunListView::OnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVIS_SELECTED))
{
// select changed
}
*pResult = 0;
}
浙公网安备 33010602011771号