这几天写个程序,用到ListCtrl,当对其中进行长字符串写入时发现,只能写很少一点(好像是128), 于是干脆重载了ListCtrl, 并且重载了函数SetIteText BOOL CMyListCtrl::SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)// {
ASSERT(::IsWindow(m_hWnd)); ASSERT((GetStyle() & LVS_OWNERDATA)==0); LVITEM lvi; lvi.iSubItem = nSubItem; lvi.pszText = (LPTSTR)lpszText; ::SendMessage(m_hWnd, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi);
return (BOOL) ::SendMessage(m_hWnd, LVM_SETITEMTEXT, nItem, (LPARAM)&lvi); }
原来以为是lvi. cchTextMax;长度太小,所以特意设了个,但发现没用. 因为,从ListCtrl中读取的文字还是不是写入的. 突然想到,是不是获取文本时出了问题, 然后打开了GetItemText 一看,果然. 默认的长度竟然只有128位 重载之,搞定:
CString CMyListCtrl::GetItemText(int nItem, int nSubItem) { ASSERT(::IsWindow(m_hWnd)); LVITEM lvi; memset(&lvi, 0, sizeof(LVITEM)); lvi.iSubItem = nSubItem; CString str; int nLen = 640;//重载该函数,默认为128,这里改为640 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; } 
|