读书人

ListBox自绘解决方案

发布时间: 2012-03-02 14:40:29 作者: rapoo

ListBox自绘
需要将不同等级的报警信息以不同的颜色 显示,一行代表一条信息。。。

为此,我自绘了ListBox。

但是感觉不对, 逻辑上有问题。。。

大家帮忙改一改 ,谢谢啦

[code=C/C++][/code]void CVTSListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
int category; //报警级别

RECT rcItem;//项矩形
::CopyRect(&rcItem, &lpDrawItemStruct->rcItem);//拷贝矩形
HDC hDC = lpDrawItemStruct->hDC;//项HDC
CDC* pDC=CDC::FromHandle(hDC);


COLORREF crOldText = ::GetTextColor(hDC);
COLORREF crOldBk = ::GetBkColor(hDC);

HBRUSH hbrBkOld ; //背景刷子

if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED))
{
::SetTextColor(hDC, ::GetSysColor(COLOR_BTNHILIGHT));//高亮文本
::SetBkColor(hDC, ::GetSysColor(COLOR_HIGHLIGHT));//高亮文字背景
::FillRect(hDC, &rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT));//用高亮色填充项矩形
::DrawFocusRect(hDC, &rcItem);//画焦点矩形
//选中项的显示代码,如果有需要显示非文本的代码放于此


}
else
{
//HBRUSH hbrBkOld = ::CreateSolidBrush(crOldBk);//旧画笔
//::FillRect(hDC, &rcItem, hbrBkOld);//用旧画笔填充项矩形
//::DeleteObject(hbrBkOld);//删除旧画笔
//不选中项的显示代码,如果有隐藏非文本的代码放于此

//添加switch语句,检测是哪种报警信息


category=GetItemData(lpDrawItemStruct->itemID); //获取类别,哪一种报警信息,不同信息,用不同颜色设置

switch(category)
{

case VTSMSG_DELWARN_TAG: //删除报警报文

hbrBkOld=::CreateSolidBrush(RGB(220,20,60));

::FillRect(hDC, &rcItem, hbrBkOld);//用旧画笔填充项矩形
::DeleteObject(hbrBkOld);//删除旧画笔


break;


case VTSMSG_DROPAREAWARN_TAG: //锚区报警报文

hbrBkOld=::CreateSolidBrush(RGB(219,112,147));

::FillRect(hDC, &rcItem, hbrBkOld);//用旧画笔填充项矩形
::DeleteObject(hbrBkOld);//删除旧画笔

break;


case.....其他


} //end case


} //end else





//不管选中不选中都显示的代码,显示文本的代码放于此
//回复先前的HDC




pDC->DrawText(data[lpDrawItemStruct->itemID],&rcItem,DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_WORD_ELLIPSIS );


::SetTextColor(hDC, crOldText);

::SetBkColor(hDC, crOldBk);


}




[解决办法]
逻辑上的错误具体指?我眼神不好,直接给出错误列表吧

读书人网 >C++

热点推荐