我C++不太好,MFC也不会(临时抱佛脚,以前搞linux的。。)。最好用C语言 SDK回答。。。
LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE) lParam; lpnmitem->iItem;// 行 lpnmitem->iSubItem;// 列 LPNMITEMACTIVATE pNMItemActivate = (LPNMITEMACTIVATE)pNMHDR; 可以用LS的,也可以用 CPoint ptCursorPos; ::GetCursorPos(&ptCursorPos); ScreenToClient(&ptCursorPos); LVHITTESTINFO HitTestInfo ; HitTestInfo.pt = ptCursorPos; HitTest(&HitTestInfo);HitTestInfo.iSubItem就是你要的值了
响应
ON_NOTIFY(NM_CUSTOMDRAW, ID_LISTCTRL, &CMyView::OnCustomdrawList)然后
void CMyView::OnCustomdrawList (NMHDR* pNMHDR, LRESULT* pResult) { NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); *pResult = 0; // Request item-specific notifications if this is the // beginning of the paint cycle. if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) { *pResult = CDRF_NOTIFYITEMDRAW; } else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) { // This is the beginning of an item's paint cycle. LVITEM rItem; int nItem = static_cast<int>(pLVCD->nmcd.dwItemSpec); CDC* pDC = CDC::FromHandle (pLVCD->nmcd.hdc); COLORREF crBkgnd; BOOL bListHasFocus = FALSE; CRect rcItem; CRect rcText; CString strText = _T(""); UINT uFormat = 0; uFormat = ILD_TRANSPARENT; bListHasFocus = (GetListCtrl()->GetSafeHwnd() == ::GetFocus()); //添加你自己的自画,让行和列都是高亮。 if (dwStyle == LVS_REPORT) { if (( rItem.state & LVIS_SELECTED ) && bListHasFocus) { uFormat |= ILD_FOCUS; } if (rItem.state & LVIS_SELECTED || rItem.state & LVIS_FOCUSED) { crBkgnd = GetSysColor (COLOR_HIGHLIGHT); pDC->SetTextColor (GetSysColor ( COLOR_HIGHLIGHTTEXT )); } else { crBkgnd = GetSysColor ( COLOR_WINDOW ); pDC->SetTextColor ( GetSysColor ( COLOR_BTNTEXT )); } LVITEMINDEX lvItemIndex; lvItemIndex.iGroup = rItem.iGroup; lvItemIndex.iItem = rItem.iItem; CRect rectLabel; CRect rectBound; CRect rectIcon; rectIcon.SetRectEmpty(); rectBound.SetRectEmpty(); rectLabel.SetRectEmpty(); CString strValue = _T(""); GetListCtrl()->GetSubItemRect/*GetItemIndexRect*/(nItem/*&lvItemIndex*/, 0, LVIR_BOUNDS, rectBound); GetListCtrl()->GetSubItemRect/*GetItemIndexRect*/(nItem/*&lvItemIndex*/, 0, LVIR_ICON, rectIcon); DWORD dwError = 0; dwError = GetLastError(); //Draw FocusRect if ((rItem.state & LVIS_SELECTED) || (rItem.state & LVIS_FOCUSED)) { //Draw Row background pDC->FillSolidRect(rectBound, crBkgnd); pDC->DrawFocusRect(rectBound); //Draw Col FocusRect CRect rectCol; rectCol.SetRectEmpty(); int nRowCount = GetListCtrl()->GetItemCount(); for (int j=0; j<nRowCount; j++) { GetListCtrl()->GetSubItemRect/*GetItemIndexRect*/(nItem/*&lvItemIndex*/, rItem.iSubItem, LVIR_BOUNDS, rectCol); pDC->FillSolidRect(rectCol, crBkgnd); pDC->DrawFocusRect(rectCol); } } //Draw Text int nColCount = GetListCtrl()->GetHeaderCtrl()->GetItemCount(); for (int i=0; i<nColCount; i++) { BOOL bRet = GetListCtrl()->GetSubItemRect/*GetItemIndexRect*/( nItem/*&lvItemIndex*/, i, LVIR_LABEL, rectLabel); if (bRet) { strValue = GetListCtrl()->GetItemText(nItem, i); pDC->DrawText(strValue, rectLabel, DT_WORDBREAK | DT_CENTER); } } *pResult = CDRF_SKIPDEFAULT; return; } //结束 *pResult = CDRF_DODEFAULT ; } }