CLIstCtrl更改行颜色!
来源:互联网 发布:iphonear软件 编辑:程序博客网 时间:2024/05/28 23:13
void CListCtrlPro::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//得到dc
LPDRAWITEMSTRUCT lpDIS = lpDrawItemStruct;
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
LVITEM lvi = {0};
lvi.mask = LVIF_STATE;//|LVIF_IMAGE;
lvi.stateMask = LVIS_FOCUSED | LVIS_SELECTED ;
lvi.iItem = lpDIS->itemID;
BOOL bGet = GetItem(&lvi);
BOOL bHighlight =((lvi.state & LVIS_DROPHILITED)||
( (lvi.state & LVIS_SELECTED) &&
(
(GetFocus() == this)|| (GetStyle() & LVS_SHOWSELALWAYS)
)
)
);
// 画文本背景
CRect rcBack = lpDIS->rcItem;
CMemDC dc(pDC,rcBack);
dc.SetBkMode(TRANSPARENT);
if( bHighlight )
{
dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
dc.FillRect(rcBack, &CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
}
else
{
dc.SetTextColor(0x0C0F80);
if (lpDIS->itemID%2 ==0)
dc.FillRect(rcBack, &CBrush(0xEEF1E3));
else
dc.FillRect(rcBack, &CBrush(0xE3e3e3));
}
//设置字体颜色
CString str;
//得到焦点大小
CRect rcFocus = lpDIS->rcItem;
rcFocus.DeflateRect(1,1,1,1);
if (lpDIS->itemAction & ODA_DRAWENTIRE)
{
//写文本
CString szText;
//设置字体
//返回当前选择的CFont的指针,获得Windows默认的字体
CFont* font = CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
CFont* pOldFont = dc.SelectObject(font);
/*
font.DeleteObject();
LOGFONT lf={0};
pDC->GetCurrentFont()->GetLogFont(&lf);
lf.lfHeight =13;// -13;//14;
//与Windows字体关联
font.CreateFontIndirect(&lf);
*/
for (int i = 0; i < GetColumnCount(); i++)
{ //循环得到文本
CRect rcItem;
if ( !GetSubItemRect(lpDIS->itemID, i, LVIR_LABEL, rcItem ))
continue;
szText = GetItemText( lpDIS->itemID, i );
rcItem.left += 5; rcItem.right -= 1;
dc.DrawText(szText, lstrlen(szText), &rcItem, DT_VCENTER|DT_NOPREFIX|DT_SINGLELINE);
}
dc.SelectObject(pOldFont);
}
}
2008-01-30 | 找了一天,改变CListCtrl控件指定行颜色的方法终于找到
昨天晚上就把SSDT查看/恢复工具编写完毕,但美中不足的是,对于修改过的SSDT项在用CListCtrl列出来后,无法修改指定这行的颜色!郁闷中,今天下午起来又继续找方法,最后终于找到了,我的工具也可以说是圆满结束了!
首先是添加以下消息
ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST1, OnDrawColorForMyList ) //为改变颜色添加的消息
再添加类成员函数,就OK了:
//改变 m_List 控件单行的颜色
void CSSDTDlg::OnDrawColorForMyList( NMHDR *pNmHdr, LRESULT *pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNmHdr );
*pResult = CDRF_DODEFAULT;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
COLORREF clrNewTextColor, clrNewBkColor;
int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
//如果当前SSDT地址与原始地址不一样,则显示字体为红色,否则为黑色
if( /
((pSSDTSaveTable)((ULONG)pSSDTST + nItem * sizeof(SSDTSaveTable)))->ulCurrentFunctionAddress /
!= ((pSSDTSaveTable)((ULONG)pSSDTST + nItem * sizeof(SSDTSaveTable)))->ulOriginalFunctionAddress /
) //设置为红色
{
clrNewTextColor = RGB( 255, 0, 0 );
}
else //设置为黑色
{
clrNewTextColor = RGB( 0, 0, 0 );
}
//设置背景色
if( nItem%2 ==0 )
{
clrNewBkColor = RGB( 240, 240, 240 ); //偶数行背景色为灰色
}
else
{
clrNewBkColor = RGB( 255, 255, 255 ); //奇数行背景色为白色
}
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;
*pResult = CDRF_DODEFAULT;
}
}
高亮及取消高亮
m_List.SetItemState(0,LVIS_DROPHILITED,LVIS_DROPHILITED);
UINT nState=m_List.GetItemState(1,LVIF_STATE);
nState&=!nState;
m_List.SetItemState(1,nState,LVIF_STATE);
- CLIstCtrl更改行颜色!
- CLIstCtrl更改行颜色!
- CLIstCtrl更改行颜色!
- ext 更改行颜色
- DataGridView更改行高
- SQL PLUS 更改行宽
- TreeList控件更改行的背景色
- EXTJS--grid 组件更改行高
- 改行
- CListCtrl选中颜色更改!
- Oracle SQL*Plus的环境配置(更改行宽)
- CListCtrl单双行颜色不同
- CListCtrl实现改变单元格颜色
- 设置CListCtrl单元格的颜色
- 修改 CListCtrl 的标题栏颜色;重写 CListCtrl 标题栏
- 颜色更鲜艳呀~
- GridView给行添加事件(鼠标移上移下更改行背景
- C#--操作DataGridView控件详解(数据显示,更改行高行宽,交换行,自动添加行号)
- Criteria 笔记
- WebService概述
- c#中委托、事件之我见(一)
- Spring容器ApplicationContext
- window对象的常用方法和作用
- CLIstCtrl更改行颜色!
- 我该怎么生存
- java反射机制
- LibSVM学习(一)——初识LibSVM
- 电销性能测试--20090820
- 不能太依赖Google
- 用C# 实现C/S模式下软件自动在线升级
- 200句最实用的日常英语口语
- WeifenLuo.WinFormsUI.Docking 控件的简单使用学习