[cpp] view
plaincopy
- #define LVIF_STATE 0x0008
- #define LVIS_FOCUSED 0x0001
- #define LVIS_SELECTED 0x0002
-
- // 在CListCtrl衍生類別中響應LVN_ITEMCHANGED訊息
- void CNewListCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
- {
- NMLISTVIEW* pNMListView = (NMLISTVIEW*)pNMHDR;
- // TODO: Add your control notification handler code here
- if(LVIF_STATE == pNMListView->uChanged && (pNMListView->uNewState & LVIS_SELECTED))
- {
- int nItem = pNMListView->iItem;//此處擷取清單項目索引
- if(-1 != nItem)
- {
- int nSubItem = pNMListView->iSubItem;
- CString str;
- static int i = 0;
- str.Format(_T("Index: %d, item: %d, subitem: %d"), i++, nItem, nSubItem);
- GetParent()->SetWindowText(str);
- }
- }
-
- *pResult = 0;
- }
當從item = 0切換選擇到item = 1的時候會響應三次LVN_ITEMCHANGED訊息。如下所示:
(圖 一)
(圖 二)
(圖 三)
在Debug偵錯模式下,參考(圖 一)和(圖 二)可以看到當從item = 0到item = 1的選擇過程中,其中兩次LVN_ITEMCHANGED訊息會針對item = 0這一項,可以看到NMLISTVIEW這個結構體中的uOldState狀態值由2 -> 1,即由LVIS_SELECTED狀態轉成LVIS_FOCUSED狀態。第三次的LVN_ITEMCHANGED訊息才是響應新item = 1的。可以從(圖 三)看到uNewState的狀態值為3.即(LVIS_FOCUSED
| LVIS_SELECTED)兩個相與的值。