作者:京东瀚览家居官方旗舰店
1 //LVS_EX_INFOTIP具有鼠标提示当前单元格
ListView_SetExtendedListViewStyle(m_SkinList.m_hWnd, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP |LVS_EX_INFOTIP);
2//隐藏CListCtrl中自带的滚动条
InitializeFlatSB(m_SkinList.m_hWnd);
FlatSB_EnableScrollBar(m_SkinList.m_hWnd, SB_BOTH, ESB_DISABLE_BOTH);
3.自绘进度条
void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = CDRF_DODEFAULT;
CRect rcSubItem,rcPosItrm;
LPNMLVCUSTOMDRAW lplvcd=(LPNMLVCUSTOMDRAW)pNMHDR;
int iRow=lplvcd->nmcd.dwItemSpec;
if (CDDS_PREPAINT == lplvcd->nmcd.dwDrawStage)
{
*pResult = CDRF_NOTIFYITEMDRAW;
return;
}else if (CDDS_ITEMPREPAINT == lplvcd->nmcd.dwDrawStage)
{
lplvcd->clrText=RGB(0,0,0);//黑色
if(iRow %2)
{
lplvcd->clrTextBk = m_colRow2;
}
else
{
lplvcd->clrTextBk = m_colRow1;
}
*pResult = CDRF_NOTIFYSUBITEMDRAW;
return;
}else if ( (CDDS_SUBITEM | CDDS_ITEMPREPAINT ) == lplvcd->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYPOSTPAINT;
return;
}else if ( (CDDS_SUBITEM | CDDS_ITEMPOSTPAINT ) == lplvcd->nmcd.dwDrawStage )
{
if(lplvcd->iSubItem==m_ProgressColumn)
{
int Date=GetItemData(iRow); //进度条的进度用SetItemData设置
GetSubItemRect(iRow, m_ProgressColumn, LVIR_BOUNDS, rcSubItem);
CDC *pDC=GetDC();
CBrush brush0(RGB(255,255,255));
rcSubItem.InflateRect(-5,-5);
pDC->FillRect(&rcSubItem,&brush0);
int iLength=rcSubItem.Width();
int iPos=iLength * Date/100;
rcPosItrm=rcSubItem;
rcPosItrm.right=rcSubItem.left+iPos;
CBrush brush1(RGB(0,255,255));
pDC->FillRect(&rcPosItrm,&brush1);
brush0.DeleteObject();
brush1.DeleteObject();
}
// *pResult = CDRF_DODEFAULT;
*pResult = CDRF_SKIPDEFAULT;
return;
}
4.使CListCtrl某列不能拖动,宽度固定
在class CSortHeaderCtrl : public CHeaderCtrl中加入虚函数
virtual BOOL OnChildNotify(UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes);
//
// The header will send either HDN_BEGINTRACKA or HDN_BEGINTRACKW
// depending on how your parent list control responds to
// WM_NOTIFYFORMAT (default=HDN_BEGINTRACKW, Unicode). But if you're
// implementing a control to be used in any app, you should handle both
// notifications if you want it to work in either situation.
//
// Since OnChildNotify is virtual, all you have to do is override
// it--no need for message map entries to handle HDN_BEGINTRACKA/W.
//
BOOL CSortHeaderCtrl::OnChildNotify(UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes)
{
// NMHDR& nmh = *(NMHDR*)lp;
HD_NOTIFY *phdn = (HD_NOTIFY *) lp;
/*
if ( (nmh.code == HDN_BEGINTRACKA || nmh.code == HDN_BEGINTRACKW ) ) {
if (m_bLocked)
return *pRes=TRUE; // eat message to disallow sizing
}
*/
if((phdn->hdr.code==HDN_BEGINTRACKA || phdn->hdr.code==HDN_BEGINTRACKW )
&& (phdn->iItem==2 ||phdn->iItem==3))
{
return *pRes=TRUE;
}
// *pRes = 0; //绝对不能调用此句,否则排序会导致程序死掉
// otherwise, pass to header control for default processing
return CHeaderCtrl::OnChildNotify(msg, wp, lp, pRes);
}
5.改变CListCtrl列表头的空白列的背景颜色
BOOL CSortHeaderCtrl::OnEraseBkgnd(CDC* pDC)
{
COLORREF m_colRow1=RGB(164,190,138);
CBrush brush0(m_colRow1);
CRect rcRect;
CSortHeaderCtrl::GetClientRect(rcRect);
pDC->FillRect(&rcRect,&brush0);
brush0.DeleteObject();
// TODO: Add your message handler code here and/or call default
return TRUE;
// return CHeaderCtrl::OnEraseBkgnd(pDC);
}