解决的方法是重写Clist类。声明一个 CCustListCtrl类继承CListCtrl,类中声明一个DrawItem函数。
具体实现如下:
CCustListCtrl.h
class CCustListCtrl :
public CListCtrl
{
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};
CCustListCtrl.cpp
#include "pch.h"
#include "CCustListCtrl.h"
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[1024*6];//这里是你要显示的字符串长度,想多长有多长
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)));
}
else
{
clrTextSave = pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
clrBkSave = pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(COLOR_WINDOW)));
}
GetItemRect(nItem, rcItem, LVIR_LABEL);
pDC->DrawText(szBuff, -1, rcItem, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP | DT_VCENTER | DT_END_ELLIPSIS);
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 | DT_END_ELLIPSIS);// DT_END_ELLIPSIS可以实现文字显示不开后的...效果
}
if (lvi.state & LVIS_FOCUSED)
pDC->DrawFocusRect(rcAllLabels);
if (bSelected)
{
pDC->SetTextColor(clrTextSave);
pDC->SetBkColor(clrBkSave);
}
}
最后把你声明的list修改就好。如CListCtrl m_list;修改为CCustListCtrl m_list;
4338

被折叠的 条评论
为什么被折叠?



