ListView控件怎么在双击时确定列。

我想用listview做表格,双击时能确定行,但是怎么确定双击时候在那列?
现在是通过处理 WM_NOTIFY -》NM_DBLCLK消息,然后获取选择的行来得到的所双击的行。
但是怎么获得所双击的列是多少? 
要用算列宽?那列要是被调整了那?
怎么获得每列宽度?
除了算列宽度,还有没有更好的方法?
还有,怎么固定列宽,不允许用户修改?
望各位大侠帮帮忙。急。。。

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