求助: 关于CListCtrl中Item可以显示文字的最大长度! 内详(有代码)这是我的一段代码:
为什么不能在CListCtrl中不能将所有字符全部显示,只显示到"eee"后边的显示不出来
但是我通过:CString strText = m_tt.GetItemText(0,0);却可以得到全部字符串.
谢谢
//-------------------------------------------------------------------------
CListCtrl m_tt;
...m_tt.InsertColumn( 0, "dd");m_tt.InsertItem(0, "amaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
"ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
"ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg"
"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"
"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"); CString strText = m_tt.GetItemText(0,0);
        MessageBox(strText);
//------------------------------------------------------------------------谢谢

解决方案 »

  1.   

    以下是mfc源码中关于GetItemText的实现CString CListCtrl::GetItemText(int nItem, int nSubItem) const
    {
    ASSERT(::IsWindow(m_hWnd));
    LVITEM lvi;
    memset(&lvi, 0, sizeof(LVITEM));
    lvi.iSubItem = nSubItem;
    CString str;
    int nLen = 128;
    int nRes;
    do
    {
    nLen *= 2;
    lvi.cchTextMax = nLen;
    lvi.pszText = str.GetBufferSetLength(nLen);
    nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,
    (LPARAM)&lvi);
    } while (nRes == nLen-1);
    str.ReleaseBuffer();
    return str;
    }
    --------------------你重载一个listctrl,在其中重新实现GetItemTextCString CMyListCtrl::GetItemText(int nItem, int nSubItem) const
    {
    ASSERT(::IsWindow(m_hWnd));
    LVITEM lvi;
    memset(&lvi, 0, sizeof(LVITEM));
    lvi.iSubItem = nSubItem;
    CString str;
    int nLen = 512;//把这里改大试试
    int nRes;
    do
    {
    nLen *= 2;
    lvi.cchTextMax = nLen;
    lvi.pszText = str.GetBufferSetLength(nLen);
    nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,
    (LPARAM)&lvi);
    } while (nRes == nLen-1);
    str.ReleaseBuffer();
    return str;
    }
      

  2.   

    do
    {
    nLen *= 2;
    lvi.cchTextMax = nLen;
    lvi.pszText = str.GetBufferSetLength(nLen);
    nRes  = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,
    (LPARAM)&lvi);
    } while (nRes == nLen-1);
    这段代码理论上是无限的,呵呵
      

  3.   

    对,不是insertitem的问题,是getitemtext的问题,默认的长度只有128位
      

  4.   

    谢谢,楼上几位朋友的代码我刚开始就试过了。不行的。在我下边的代码中,是可以得到全部数据的,可是就是显示的时候,有问题。
    //------------------------------------------
    CString strText = m_tt.GetItemText(0,0);
    MessageBox(strText);
    //------------------------------------------
      

  5.   

    你把列的宽度设宽些试试(SetColumnWidth函数)
      

  6.   

    谢谢, 楼上, SetColumnWidth()用过不了,不行。Column的宽增加了,可是Item的显示内容,还是那么少
      

  7.   

    给你一段代码,如下:
    void CCustListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    CRect rcItem(lpDrawItemStruct->rcItem);
    int nItem = lpDrawItemStruct->itemID;
    COLORREF clrTextSave, clrBkSave;
    static _TCHAR szBuff[512];//这里是你要显示的字符串长度,想多长有多长
    LV_ITEM lvi;
    lvi.mask = LVIF_TEXT | LVIF_STATE;//LVIF_IMAGE |
    lvi.iItem = nItem;
    lvi.iSubItem = 0;
    lvi.pszText = szBuff;
    lvi.cchTextMax = sizeof(szBuff);
    lvi.stateMask = 0xFFFF;
    GetItem(&lvi); BOOL bSelected = (lvi.state & LVIS_SELECTED);
    CRect rcAllLabels;
    GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);
    if (bSelected)
    {
    clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
    clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
    pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
    }
    GetItemRect(nItem, rcItem, LVIR_LABEL);
    pDC->DrawText(szBuff,-1,rcItem,DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER); LV_COLUMN lvc;
    lvc.mask = LVCF_FMT | LVCF_WIDTH;
    for(int nColumn = 1; GetColumn(nColumn, &lvc); nColumn++)
    {
    rcItem.left = rcItem.right;
    rcItem.right += lvc.cx; int nRetLen = GetItemText(nItem, nColumn,
    szBuff, sizeof(szBuff));
    if (nRetLen == 0)
    continue;
    UINT nJustify = DT_LEFT;
    switch(lvc.fmt & LVCFMT_JUSTIFYMASK)
    {
    case LVCFMT_RIGHT:
    nJustify = DT_RIGHT;
    break;
    case LVCFMT_CENTER:
    nJustify = DT_CENTER;
    break;
    default:
    break;
    }
    pDC->DrawText(szBuff, -1, rcItem,
     nJustify | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER);
    }
    if (lvi.state & LVIS_FOCUSED)
    pDC->DrawFocusRect(rcAllLabels);
    if (bSelected)
    {
            pDC->SetTextColor(clrTextSave);
    pDC->SetBkColor(clrBkSave);
    }
    }
      

  8.   

    CCustListCtrl类从CListCtrl类派生,并重载DrawItem函数,在使用的地方把CListCtrl改为CCustListCtrl,并设置CCustListCtrl成员为重画风格(或在属性中选中Owner Draw fixed复选框),肯定行。
      

  9.   

    zxyjyzxyjy(星星) 的方法可行。
    多谢了,呵呵。谢谢大家。
    一会结贴.