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