用ListCtrl自带的方式只能编辑第一列的东西,其他的要是想编辑的话只能自己做。
主要就是自己建立一个CEdit,该编辑哪个小格的时候就把CEdit移到哪儿。这儿有篇文章,可能对你会有点儿帮助
http://www.vckbase.com/document/

解决方案 »

  1.   

    我写的一个类,如下:
    // ParamListCtrl.cpp : implementation file
    //#include "stdafx.h"
    #include "ParamListCtrl.h"
    #include"MainFrm.h"
    #include "childFrm.h"
    #include"UAB.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    //#define TOKEN_SIZE 256/////////////////////////////////////////////////////////////////////////////
    // CParamListCtrlCParamListCtrl::CParamListCtrl()
    {
    m_nType=DEFALUT_TYPE;
    }CParamListCtrl::~CParamListCtrl()
    {
    }
    BEGIN_MESSAGE_MAP(CParamListCtrl, CListCtrl)
    //{{AFX_MSG_MAP(CParamListCtrl)
    ON_WM_LBUTTONDOWN()
    ON_WM_SETFOCUS()
    ON_WM_HSCROLL()
    ON_WM_VSCROLL()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CParamListCtrl message handlers
    /**************************************************************************
    原形:CParamListCtrl::PreSubclassWindow()
    功能:在窗口子类化之前设置窗口的子集,它允许动态创建窗口的子集
    参数:无
    返回值:无
    创建人:  **************************************************************************/
    void CParamListCtrl::PreSubclassWindow() 
    {
    //设置当前的行列为0
    // m_bIsIdxParamList = FALSE;
    m_nCurrentLine = 0;
    m_nCurrentRow = 0;
    //调用CEdit类的Create函数创建一个编辑框,我们可以自己设计它的风格//
    m_edit.Create(WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_LEFT,
    CRect(0,0,0,0),this,1001);

    //设置编辑框的字体
    m_edit.SetFont(GetFont());
    //限制编辑框的长度
    // m_edit.SetLimitText(TOKEN_SIZE-1);
    if (GetItemCount() == 0) InsertItem(0,"");
    //调用SetExtendedStyle函数
    SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT |
    LVS_EX_GRIDLINES);
    GetHeaderCtrl()->ModifyStyle(0,HDS_HOTTRACK); CListCtrl::PreSubclassWindow();
    }void CParamListCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    CListCtrl::OnLButtonDown(nFlags, point); LVHITTESTINFO hti;
    memset(&hti,0,sizeof(LVHITTESTINFO));
    hti.pt = point;
    SubItemHitTest(&hti);
    if (hti.iSubItem == -1) return;
    if (hti.iItem == -1)
    {
    hti.iItem = GetItemCount();
    InsertItem(hti.iItem,"");
    }
    //在这里要判断类型,并选择作一定相应的处理//
    switch(m_nType)
    {
    case PROCCOMM_SET :
    SelectItem(hti.iItem,hti.iSubItem);
    break;
    case PROCCOMM_WIZARD:
    SelectItem(hti.iItem,1);
    break;
    case BUSINESSVAR_WND:
    SelectItem(hti.iItem,hti.iSubItem);
    break;
    case GLOBALVAR_WND:
    SelectItem(hti.iItem,hti.iSubItem);
    break;
    case LOCALVAR_WND:
    SelectItem(hti.iItem,hti.iSubItem);
    break;
    default:
    SelectItem(hti.iItem,hti.iSubItem);
    break;
    }
    }void CParamListCtrl::SelectItem(int nLine,int nRow)
    {
    int nColumnCount = GetHeaderCtrl()->GetItemCount();
    if (nColumnCount == 0) return; CRect rcItem;
    GetSubItemRect(nLine,nRow,LVIR_BOUNDS,rcItem);
    if (nRow == 0 && nColumnCount > 1) // 
    {
    CRect rcSecond;
    GetSubItemRect(nLine,nRow + 1,LVIR_BOUNDS,rcSecond);
    rcItem.right = rcSecond.left;
    } if (::IsWindow(m_edit.m_hWnd))//这里加了nRow==1这个判断条件
    {
    AcceptText();
    CRect ItemRect;
    GetHeaderCtrl()->GetClientRect(ItemRect);
    if(rcItem.top>ItemRect.Height())
    m_edit.MoveWindow(rcItem);
    Update(m_nCurrentLine);
    RedrawItems(1,GetItemCount());
    m_edit.SetWindowText(GetItemText(nLine,nRow));
    m_edit.SetModify(FALSE);
    m_edit.SetFocus();
    m_edit.SetSel(0,-1);
    }
    m_nCurrentLine = nLine;
    m_nCurrentRow = nRow;
    }//处理键盘上的响应消息
    BOOL CParamListCtrl::PreTranslateMessage(MSG* pMsg) 
    { if (pMsg->message == WM_KEYDOWN)
    {
    int nStart,nEnd;
    int nLine = m_nCurrentLine;
    int nRow = m_nCurrentRow;
    int nColumnCount = GetHeaderCtrl()->GetItemCount();
    switch (pMsg->wParam)
    {
    //回车,TAB键属性
    case VK_TAB:
    // case VK_RETURN:
    nRow++;
    if (nRow >= nColumnCount)
    {
    nRow = 0;
    nLine++;
    if (nLine >= GetItemCount())
    {
    nLine = GetItemCount();
    InsertItem(nLine,"");
    }
    }
    //在这里要判断类型,并选择作一定相应的处理//
    switch(m_nType)
    {
    case PROCCOMM_SET :
    SelectItem(nLine,nRow);
    break;
    case PROCCOMM_WIZARD:
    SelectItem(nLine,1);
    break;
    case BUSINESSVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case GLOBALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case LOCALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    default:
    break;
    }
    // SelectItem(nLine,nRow);
    return TRUE;
    case VK_LEFT:
    m_edit.GetSel(nStart,nEnd);
    if (nStart == 0 && nEnd == 0)
    {
    nRow--;
    if (nRow < 0)
    {
    nRow = nColumnCount-1;
    nLine--;
    if (nLine < 0)
    nLine = GetItemCount()-1;
    }
    //在这里要判断类型,并选择作一定相应的处理//
    switch(m_nType)
    {
    case PROCCOMM_SET :
    SelectItem(nLine,nRow);
    break;
    case PROCCOMM_WIZARD:
    SelectItem(nLine,1);
    break;
    case BUSINESSVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case GLOBALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case LOCALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    default:
    break;
    }
    }else
    {
    m_edit.SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
    }
    return TRUE;
    case VK_RIGHT:
    m_edit.GetSel(nStart,nEnd);
    if (nStart == m_edit.GetWindowTextLength() && nStart == nEnd)
    {
    nRow++;
    if (nRow >= nColumnCount)
    {
    nRow = 0;
    nLine++;
    if (nLine >= GetItemCount())
    nLine = 0;
    }
    // SelectItem(nLine,nRow);
    //在这里要判断类型,并选择作一定相应的处理//
    switch(m_nType)
    {
    case PROCCOMM_SET :
    SelectItem(nLine,nRow);
    break;
    case PROCCOMM_WIZARD:
    SelectItem(nLine,1);
    break;
    case BUSINESSVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case GLOBALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case LOCALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    default:
    break;
    }
    }else
    {
    m_edit.SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
    }
    return TRUE;
    case VK_UP:
    nLine--;
    if (nLine < 0)
    nLine = GetItemCount() - 1;
    // SelectItem(nLine,nRow);
    //在这里要判断类型,并选择作一定相应的处理//
    switch(m_nType)
    {
    case PROCCOMM_SET :
    SelectItem(nLine,nRow);
    break;
    case PROCCOMM_WIZARD:
    SelectItem(nLine,1);
    break;
    case BUSINESSVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case GLOBALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case LOCALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    default:
    break;
    }
    return TRUE;
    case VK_DOWN:
    nLine++;
    if (nLine >= GetItemCount())
    {
    nLine = GetItemCount();
    InsertItem(nLine,"");
    }
    // if (nLine >= GetItemCount())
    // nLine = 0;
    // SelectItem(nLine,nRow);
    //在这里要判断类型,并选择作一定相应的处理//
    switch(m_nType)
    {
    case PROCCOMM_SET :
    SelectItem(nLine,nRow);
    break;
    case PROCCOMM_WIZARD:
    SelectItem(nLine,1);
    break;
    case BUSINESSVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case GLOBALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    case LOCALVAR_WND:
    SelectItem(nLine,nRow);
    break;
    default:
    break;
    }
    return TRUE;
    default:
    break;
    }
    } return CListCtrl::PreTranslateMessage(pMsg);
    }void CParamListCtrl::OnSetFocus(CWnd* pOldWnd) 
    {
    CListCtrl::OnSetFocus(pOldWnd);
    m_edit.ShowWindow(SW_SHOW);
    //在这里要判断类型,并选择作一定相应的处理//
    switch(m_nType)
    {
    case PROCCOMM_SET :
    SelectItem(m_nCurrentLine,m_nCurrentRow);
    break;
    case PROCCOMM_WIZARD:
    SelectItem(m_nCurrentLine,1);
    break;
    case BUSINESSVAR_WND:
    SelectItem(m_nCurrentLine,m_nCurrentRow);
    break;
    case GLOBALVAR_WND:
    SelectItem(m_nCurrentLine,m_nCurrentRow);
    break;
    case LOCALVAR_WND:
    SelectItem(m_nCurrentLine,m_nCurrentRow);
    break;
    default:
    break;
    }
    // SelectItem(m_nCurrentLine,m_nCurrentRow);
    }void CParamListCtrl::AcceptText()
    {
    CUABApp* pApp=(CUABApp*)AfxGetApp();
    CMainFrame* pMainWnd=(CMainFrame*)AfxGetMainWnd(); if (m_edit.GetModify())
    {
    CString strEdit;
    m_edit.GetWindowText(strEdit);
    //判断变量类型并作出相应处理
    if(strEdit!="")
    {
    strEdit.TrimLeft();
    strEdit.TrimRight();
    }
    switch(m_nType)
    {
    case PROCCOMM_SET : // 过程命令参数设置
    //参数类型的自动填充

    }

    SetItemText(m_nCurrentLine,m_nCurrentRow,strEdit);

      }}BOOL CParamListCtrl::OnCommand(WPARAM wParam, LPARAM lParam) 
    {
    if (HIWORD(wParam) == EN_KILLFOCUS && LOWORD(wParam) == 1001)
    {
    AcceptText();
    m_edit.ShowWindow(SW_HIDE);
    // Update(m_nCurrentLine);
    // EnsureVisible(m_nCurrentLine,TRUE);
    } return CListCtrl::OnCommand(wParam, lParam);
    }void CParamListCtrl::SetListType(int nType)
    {
    m_nType=nType;
    }LPCTSTR CParamListCtrl::GetFullTypeName(LPCTSTR lpsz)
    {

    return NULL;
    }void CParamListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default
    if( GetFocus() != this ) SetFocus();
    CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
    }void CParamListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    // TODO: Add your message handler code here and/or call default
    if( GetFocus() != this ) SetFocus();
    CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
    }
      

  2.   

    http://www.csdn.net/expert/topic/434/434283.shtm各位高人,请帮忙看一下,如能解决,必500分相送
    是关于网络文件传输的问题