rt,还有就是如何设置选中的行?
VC6.0中的CListCtrl控件,当你选择某一栏时并不能全行加亮显示,下面将告诉你怎样来实现全行加亮显示
派生一个新类,其基类为CListCtrl,并手工加入DrawItem函数。
void BListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rcItem(lpDrawItemStruct->rcItem);
int nItem=lpDrawItemStruct->itemID;
int nBakupDC=pDC->SaveDC();//保存DC 的状态
LV_ITEM lvi;
lvi.mask=LVIF_IMAGE|LVIF_STATE;
lvi.iItem=nItem;
lvi.iSubItem=0;
lvi.stateMask=0xffff;//获取所有的状态标志
GetItem(&lvi);
//判断是否需要加亮显示
BOOL bHighlight=(lvi.state & LVIS_DROPHILITED) ||((lvi.state & LVIS_SELECTED) && ((GetFocus()==this) ||(GetStyle() & LVS_SHOWSELALWAYS)));
CRect rcBounds,rcLabel,rcIcon;
//如果想知道下面三个调用获得的区域位置,可以用CDC的FillRect函数显示看一下
GetItemRect(nItem,&rcBounds,LVIR_BOUNDS);
GetItemRect(nItem,&rcLabel,LVIR_LABEL);
GetItemRect(nItem,&rcIcon,LVIR_ICON);
//需要按照顺序显示,首先绘制背景
if(bHighlight)
{
pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
pDC->FillRect(rcBounds,&CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
}
else
{
pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
pDC->FillRect(rcBounds,&CBrush(::GetSysColor(COLOR_WINDOW)));
}
CString strItem;
LV_COLUMN lvc;
UINT uJustify=DT_LEFT;
lvc.mask=LVCF_FMT|LVCF_WIDTH;
//背景绘制完后输出文字
strItem=GetItemText(nItem,0);
pDC->DrawText(strItem,-1,rcLabel,uJustify |DT_SINGLELINE| DT_NOPREFIX | DT_VCENTER |DT_END_ELLIPSIS);
for(int i=1;GetColumn(i,&lvc);i++)
{
switch(lvc.fmt & LVCFMT_JUSTIFYMASK)
{
case LVCFMT_RIGHT:
uJustify=DT_RIGHT;
break;
case LVCFMT_CENTER:
uJustify=DT_CENTER;
break;
default:
break;
}
rcLabel.left=rcLabel.right;
rcLabel.right=rcLabel.left + lvc.cx;
strItem=GetItemText(nItem,i);
pDC->DrawText(strItem,-1,rcLabel,uJustify |DT_SINGLELINE| DT_NOPREFIX | DT_VCENTER |DT_END_ELLIPSIS);
}
pDC->RestoreDC(nBakupDC);//恢复原来的DC状态
}
我這有一個例子,你試一下...我是可以的
class CListCtrlEx : public CListCtrl
{
// Construction
public:
CListCtrlEx();
// Attributes
public:
int m_iClickItemID;
CPoint m_ClickPoint;
long m_lChannelType;
static CPhonic * s_pDevCtrl;
static CPhonicView * s_pView;
CObArray m_ChannelArray;
// Operations
public:
void CloseList(void);
virtual int GetColmunCount() = 0;
virtual int GetColmunID(EListColumn eColumn) = 0;
virtual int GetColmunWidth(EListColumn eColumn) = 0;
virtual LPCTSTR GetColmunTitle(EListColumn eColumn) = 0;
virtual void InitList( CPhonic * pDev, long channelType );
virtual void InitPcm(long pcmID){;}
virtual CChannelObject * CreateChannelObject(CListCtrlEx * pHostList, long channelType, long channelID);
virtual void SetColumnText( int idx, EListColumn eColumn, LPCTSTR text );
CChannelObject * GetChannelObject( int index );
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CFieldListCtrl)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CListCtrlEx();
// Generated message map functions
protected:
//{{AFX_MSG(CFieldListCtrl)
void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
ListCtrlEx::CListCtrlEx()
{
m_iClickItemID = -1;
}
CListCtrlEx::~CListCtrlEx()
{
CloseList();
}
void
CListCtrlEx::CloseList(void)
{
CObject * pObj;
while(m_ChannelArray.GetSize() )
{
pObj = m_ChannelArray.GetAt(0);
if( pObj )
{
delete pObj;
}
m_ChannelArray.RemoveAt(0);
}
}
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
//{{AFX_MSG_MAP(CListCtrlEx)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx message handlers
void CListCtrlEx::OnLButtonDown(UINT nFlags, CPoint point)
{
// what item did we select
UINT flags;
m_iClickItemID = HitTest(point, &flags);
m_ClickPoint = point;
CListCtrl::OnLButtonDown(nFlags, point) ;
}
void
CListCtrlEx::InitList( CPhonic * pDev, long channelType )
{
m_lChannelType = channelType;
CChannelObject * pObj;
long lChannelNum = s_pDevCtrl->GetChannelCount(m_lChannelType);
for( int i=0; i<lChannelNum; i++ )
{
pObj = CreateChannelObject( this, m_lChannelType, i );
m_ChannelArray.Add(pObj);
}
for (int nNum = 0; nNum < columnMax; nNum++)
{
if( GetColmunID((EListColumn)nNum) >= 0 )
{
InsertColumn(GetColmunID((EListColumn)nNum),
GetColmunTitle((EListColumn)nNum),
(nNum==0)?LVCFMT_LEFT:LVCFMT_CENTER,
GetColmunWidth((EListColumn)nNum) );
}
}
CString str;
for( i=0; i<m_ChannelArray.GetSize(); i++ )
{
pObj = (CChannelObject *)m_ChannelArray.GetAt(i);
ASSERT(pObj!=NULL);
str.Format("%d", i);
InsertItem(i, (LPCTSTR)str);
if( GetColmunID(columnChannelID) >= 0 )
{
str.Format("%d", pObj->m_lChannelID);
SetItem(i,
GetColmunID(columnChannelID) ,
LVIF_TEXT,
(LPCTSTR)str,
-1, 0, 0, 0);
}
pObj->ShowChannel();
}
}
CChannelObject *
CListCtrlEx::CreateChannelObject(CListCtrlEx * pHostList, long channelType, long channelID )
{
return new CChannelObject(pHostList, channelType, channelID);
}
CChannelObject *
CSlicList::CreateChannelObject(CListCtrlEx * pHostList, long channelType, long channelID )
{
if( channelType == CH_INTERIOR_SLIC )
{
return new CIntChannel(pHostList, channelType, channelID);
}
else if(channelType == CH_EXTERIOR_SLIC )
{
return new CExtChannel(pHostList, channelType, channelID);
}
else
{
return new CHighImpedanceChannel(pHostList, channelType, channelID);
}
}
int
CSlicList::GetColmunWidth(EListColumn eColumn)
{
switch(eColumn)
{
case columnChannelID: return 30;
case columnType: return 40;
case columnState: return 70;
case columnNumber: return 0;
case columnTask: return 0;
case columnCallerID: return 80;
case columnCallee: return 80;
case columnDtmf: return 80;
break;
}
return 0;
}
LPCTSTR
CSlicList::GetColmunTitle(EListColumn eColumn)
{
switch(eColumn)
{
case columnChannelID: return "ID";
case columnType: return "TYPE";
case columnNumber: return "NUM";
case columnState: return "STATE";
case columnTask: return "TASK";
case columnCallerID: return "CALLER";
case columnCallee: return "PHONE";
case columnDtmf: return "DTMF";
break;
}
return "";
}
如果可以的話,記得給分啊