MFC 的 List Control 中背景变色的问题

jinnykiki 2009-01-13 10:13:14
我想根据List 表中的输入内容来让背景色变红,比如说表是个10行9列的表,现在第九列是result,根据其结果是OK或NG,如果是NG的话就显示红色,如果是OK的话就正常显示,请问怎样才能做到呢?
...全文
412 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tocpve 2009-01-13
  • 打赏
  • 举报
回复
看错了是画列
if (pLVCD->nmcd.dwItemSpec==1)
改用下面的

pLVCD->iSubItem == 9 and result == ok
tocpve 2009-01-13
  • 打赏
  • 举报
回复
参考一下吧 希望能帮上你

LRESULT ListView_Customdraw(LPARAM lParam)
{
LPNMLVCUSTOMDRAW pLVCD = (LPNMLVCUSTOMDRAW)lParam;
if (pLVCD == NULL)
return CDRF_DODEFAULT;

if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
{
return CDRF_NOTIFYITEMDRAW;
}

if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
return CDRF_NOTIFYSUBITEMDRAW;
}
if (pLVCD->nmcd.dwDrawStage & (CDDS_SUBITEM | CDDS_PREPAINT))
{
if (pLVCD->nmcd.dwItemSpec==1)
pLVCD->clrTextBk = RGB(0xff, 0xff, 0xff);


return CDRF_NEWFONT;
}
};
waizqfor 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 jinnykiki 的帖子:]
我想根据List 表中的输入内容来让背景色变红,比如说表是个10行9列的表,现在第九列是result,根据其结果是OK或NG,如果是NG的话就显示红色,如果是OK的话就正常显示,请问怎样才能做到呢?
[/Quote]
那就直接查找呗 如果是result就把背景变红 做个循环查找一下
  • 打赏
  • 举报
回复
你是不知道怎么样让背景变红,还是不知道怎样读取第九列是result??
直接读取result,然后判断不就可以了吗?
OenAuth.Core 2009-01-13
  • 打赏
  • 举报
回复
很简单啦,学习一下吧。你可以把我的例子中的CEdit改成一个Label
http://hi.baidu.com/anglecloudy/blog/item/c0527f99788d2a0f6f068c6f.html
dahua010 2009-01-13
  • 打赏
  • 举报
回复
或者你用getitem函数,或者getitemrect函数,来实现你的效果呢,试试看
dahua010 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jinnykiki 的回复:]
多谢楼上的,我似乎觉得不用这么烦吧。其实就是想根据列表中每个框的内容,然后判断内容,再根据内容来改变这个框的背景色。
目前不知道如何去找到这个框的方法,然后再用SetTextBkColor(255)来使其变红。
[/Quote]

如果你不采用drawitem的方法的话,你会发现,当你的界面刷新,或者目标框高亮显示以后他又会变回原来的颜色。除非你判断很多条件
hejun548 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dahua010 的回复:]
自己写一个类,继承CListCtrl
然后重载DrawItem,和onPaint函数。
DrawItem,可以更改你所需要的表格的颜色。
onPaint,可以更改行列线的颜色
C/C++ codevoidGEPTLits::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
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(&…
[/Quote]

UP
jinnykiki 2009-01-13
  • 打赏
  • 举报
回复
多谢楼上的,我似乎觉得不用这么烦吧。其实就是想根据列表中每个框的内容,然后判断内容,再根据内容来改变这个框的背景色。
目前不知道如何去找到这个框的方法,然后再用SetTextBkColor(255)来使其变红。
dahua010 2009-01-13
  • 打赏
  • 举报
回复
自己写一个类,继承CListCtrl
然后重载DrawItem,和onPaint函数。
DrawItem,可以更改你所需要的表格的颜色。
onPaint,可以更改行列线的颜色

void GEPTLits::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
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))));

// 画文本背景
//这里是改变了所有的图片的颜色,如果想更改特定的的表格,那么请在else if里 判断lvi.iSubItem.
CRect rcBack = lpDIS->rcItem;
pDC->SetBkMode(TRANSPARENT);
if( bHighlight )
{
pDC->SetTextColor(RGB(0,128,255));
pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));

pDC->FillRect(rcBack, &CBrush(RGB(219, 251, 118)));
}
else
{
pDC->SetTextColor(RGB(0,128,255));
//pDC->FillRect(rcBack, &CBrush(0xE3e3e3));
pDC->FillRect(rcBack, &CBrush(RGB(255, 255, 255)));
}

if (lpDIS->itemAction & ODA_DRAWENTIRE)
{
//写文本
CString szText;
for (int i = 0; i < 11; i++)
{ //循环得到文本
CRect rcItem;
if ( !GetSubItemRect(lpDIS->itemID, i, LVIR_LABEL, rcItem ))
continue;
szText = GetItemText( lpDIS->itemID, i );

rcItem.left += 5; rcItem.right -= 1;
pDC->DrawText(szText, lstrlen(szText), &rcItem, DT_CENTER|DT_VCENTER|DT_NOPREFIX|DT_SINGLELINE);
}
}
}

void GEPTLits::OnPaint()
{
// First let the control do its default drawing.
const MSG *msg = GetCurrentMessage();
DefWindowProc( msg->message, msg->wParam, msg->lParam );

// Draw the lines only for LVS_REPORT mode
if( (GetStyle() & LVS_TYPEMASK) == LVS_REPORT )
{
// Get the number of columns
CClientDC dc(this );
CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
int nColumnCount = pHeader->GetItemCount();
CPen pen;
pen.CreatePen(0,2,RGB(255,0,0));
CPen* pOldPen=(CPen*)dc.SelectObject(&pen);
// The bottom of the header corresponds to the top of the line
RECT rect;
pHeader->GetClientRect( &rect );
int top = rect.bottom;

// Now get the client rect so we know the line length and
// when to stop
GetClientRect( &rect );

// The border of the column is offset by the horz scroll
int borderx = 0 - GetScrollPos( SB_HORZ );
CBrush brush1; // Must initialize!
dc.SetBkColor(RGB(255,0,0));
for( int i = 0; i < nColumnCount; i++ )
{
// Get the next border
borderx += GetColumnWidth( i );

// if next border is outside client area, break out
if( borderx >= rect.right ) break;

// Draw the line.
dc.MoveTo( borderx-1, top);
dc.LineTo( borderx-1, rect.bottom );
}

// Draw the horizontal grid lines

// First get the height
if( !GetItemRect( 0, &rect, LVIR_BOUNDS ))
return;

int height = rect.bottom - rect.top;

GetClientRect( &rect );
int width = rect.right;

for(i = 1; i <= GetCountPerPage(); i++ )
{
dc.MoveTo( 0, top + height*i);
dc.LineTo( width, top + height*i );
}
// dc.SelectObject(pTempBrush);
}
}

xiaoyisnail 2009-01-13
  • 打赏
  • 举报
回复
帮顶~
jinnykiki 2009-01-13
  • 打赏
  • 举报
回复
是想让List的项目变红,还有大家知道怎么把List的网格变成黑色的实线吗?

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧