将CListCtrl设为report后可以加多列,设置了Editable属性后只有第一列可以编辑。怎样让其他列可以编辑?谢先。

解决方案 »

  1.   

    http://www.codeproject.com/listctrl/editing_subitems_in_listcontrol.asp
      

  2.   

    m_list.SetItemText( int nItem, int nSubItem, LPTSTR lpszText )
    其中m_list为关联你列表控件的变量,nItem是列,nSubItem是行,lpszText是你要添加的值可用CSting类赋值.比如:m_list.SetItemText( 0, 0, "100");就是在第一行第一列插入100这个数值.
      

  3.   

    //////////////////////////////////////////////////////////////////////
    //                   双击修改内容                                   //
    //////////////////////////////////////////////////////////////////////
    void CNewList::OnLButtonDblClk(UINT nFlags, CPoint point) 
    {
    int Index;
        int ColNum;
        if ((Index = HitTestEx (point, &ColNum)) != -1)
        {
    if (GetWindowLong (m_hWnd, GWL_STYLE) & LVS_EDITLABELS)
    EditSubItem (Index, ColNum);
        }
    CListCtrl::OnLButtonDblClk(nFlags, point);
    }
    //////////////////////////////////////////////////////////////////
    //             通过坐标得到 行,列                               //
    //////////////////////////////////////////////////////////////////
    int CNewList::HitTestEx(CPoint& Point, int* pColumn)
    {
    int ColumnNum=0;
        int Row=HitTest(Point,NULL);
    if (pColumn)
    *pColumn=0;
        //判断ListCtrl 是否为LVS_REPORT 
    if ((GetWindowLong(m_hWnd,GWL_STYLE)&LVS_TYPEMASK)!=LVS_REPORT)
    return Row;Row=GetTopIndex();
    int Bottom=Row+GetCountPerPage();        
    if (Bottom>GetItemCount())
    Bottom=GetItemCount();
        //判断在哪一行 哪一列
    CHeaderCtrl* pHeader=(CHeaderCtrl*)GetDlgItem(0);
    int nColumnCount=pHeader->GetItemCount();
    for(;Row<=Bottom;++Row)
    {
    CRect rect;
    GetItemRect(Row,&rect,LVIR_BOUNDS);
    if (rect.PtInRect(Point))
    {
    for(ColumnNum=0;ColumnNum<nColumnCount;++ColumnNum)
    {
    int ColWidth=GetColumnWidth(ColumnNum);
    if (Point.x>=rect.left && Point.x<=(rect.left+ColWidth))
    {
    if (pColumn)
    *pColumn=ColumnNum;
    return Row;
    }
    rect.left +=ColWidth;
    }
    }
    }
    return -1;
    }
    ///////////////////////////////////////////////////////////////////
    //                显示CEditCell                                  //
    ///////////////////////////////////////////////////////////////////
    void CNewList::EditSubItem(int Item, int Column)
    {
    CHeaderCtrl* pHeader=(CHeaderCtrl*)GetDlgItem(0);
    int nColumnCount=pHeader->GetItemCount();
    if (Column>=nColumnCount || GetColumnWidth(Column)<5)   //判断宽度是否正确
    return;int Offset=0;
    for(int iColumn=0;iColumn<Column;++iColumn)             //得到CEditCell的right坐标
    {
    Offset +=GetColumnWidth(iColumn);
    }
    CRect rect;
    GetItemRect(Item,rect,LVIR_BOUNDS);
    CRect ClientRect;
    GetClientRect(&ClientRect);
    if (Offset+rect.left<0 || Offset+rect.left>ClientRect.right) //得到CEditCell的left坐标
    {
    CSize size;
    if (Offset+rect.left>0)
    size.cx=-(Offset-rect.left);
    else
    size.cx=Offset-rect.left;
    size.cy=0;
    Scroll(size);
    rect.left=size.cx;
    }
    LV_COLUMN lvCol;
    lvCol.mask=LVCF_FMT;
    GetColumn(Column,&lvCol);
    DWORD dwStyle;
    //判断item的显示位子
    if ((lvCol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_LEFT)
    dwStyle = ES_LEFT;
        else if ((lvCol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_RIGHT)
    dwStyle = ES_RIGHT;
        else dwStyle = ES_CENTER;
        //调整CEditCell 的w位子 (两边缩小2)
    rect.left += Offset+2;
    rect.right=rect.left+GetColumnWidth(Column)-2;
    if (rect.right>ClientRect.right)
    rect.right=ClientRect.right;
    EditCellShow(dwStyle,rect,Item,Column);
    //ComboCellShow(dwStyle,rect,Item,Column);}
      

  4.   

    那编辑框的长宽高怎么设呢?怎么获取单个框的RECT?
      

  5.   

    编辑框大小需要自己手动根据ListCtrl的单元格来自己调整,多调整一下,使它大小适合
      

  6.   

    回复人: oyljerry(【勇敢的心】→ ㊣Contributing A za!㊣) ( ) 信誉:120  2005-04-20 20:56:00  得分: 0  
     
       编辑框大小需要自己手动根据ListCtrl的单元格来自己调整,多调整一下,使它大小适合
    -------------------------------------------------------------------------------------
    这样不行吧,单元格的宽是可调整的,怎么能在程序中固定大小?
      
     
      

  7.   

    wangjia184(我就是传说中的SB) :
    怎样判断输入结束呢?
      

  8.   

    wangjia184 贴的代码已经计算出了edit的大小了
      

  9.   

    wangjia184(我就是传说中的SB) :
    怎样判断输入结束呢?只要edit丢失焦点或return ,esc就认为结束
      

  10.   

    VCKBASE上有好多这样的例子,你可以去下个来看看就知道了
      

  11.   

    wangjia184(我就是传说中的SB) :
    怎样判断输入结束呢?只要edit丢失焦点或return ,esc就认为结束
    --------------------------------------------------
    我试过,在对话框中点击对话框的其他地方时edit不会失去焦点,效果不好。按ESC和Enter时对话框会有默认操作,会关闭,而且EDIT获取不了这些按键。重载OnOk和OnCancel,不让关闭对话框,按对话框的关闭按扭都不会关。
      

  12.   

    都这么做的。create一个edit上去。
      

  13.   

    wangjia184(我就是传说中的SB) :
    怎样判断输入结束呢?只要edit丢失焦点或return ,esc就认为结束
    --------------------------------------------------
    我试过,在对话框中点击对话框的其他地方时edit不会失去焦点,效果不好。按ESC和Enter时对话框会有默认操作,会关闭,而且EDIT获取不了这些按键。重载OnOk和OnCancel,不让关闭对话框,按对话框的关闭按扭都不会关。//////////////////
    处理WM_KEYDOWN, 或在PreTranslateMessage中处理
      

  14.   

    楼上的方法具体说一下好吗?关注ing...
      

  15.   

    请教在EDIT外点鼠标左键时应该怎样将消息不通过主窗口直接传给EDIT,让EDIT返回值。主要是想实现封装。
      

  16.   

    另,可不可以把OnCustomDraw写到派生的CListCtrl里?