关于WTL中CListViewCtrl 的字体色的问题

thinkSJ 2009-03-30 08:23:51
在工程中可以响应NM_CUSTOMDRAW消息来修改每个单元格的背景色与前景色,但是如何为一个单元格中的字符串赋不同的颜色呢?
前些天,偶然间看到XunLei主界面的"社区互动"列是做成了同列文本的不同色显示.试着做了一下,未遂.
想请教下各位有经验的高手该如何实现?

谢谢了.
...全文
334 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
thinkSJ 2009-03-31
  • 打赏
  • 举报
回复
昨晚下线较早,
谢谢在家的帮助,问题已经解决,原于对DC的不熟 :(
hurryboylqs 2009-03-30
  • 打赏
  • 举报
回复
里面你绘制成猫狗都可以的,DrewText或者TextOut用到DC时,DC有个字体颜色属性,想改变颜色就先设置一下再画文字:MemDC->SetTextColor(RGB(...));你设置下就可以了,说的还狗不详细??
cnzdgs 2009-03-30
  • 打赏
  • 举报
回复
把代码贴上看看。
oyljerry 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 thinkSJ 的回复:]
1楼的贴子写得有笔误,不应该是"同列文本的不同色显示"而应是"同一单元格文本的不同色显示",

谢谢2楼的代码,我的要求又改了,这份代码应该不是想要的结果了. :)

cnzdgs:如何自绘来实现"而应是"同一单元格文本的不同色显示"?

再次感谢LZ的两位
[/Quote]
可以把字符串分拆成片,然后各自用不同的颜色画
thinkSJ 2009-03-30
  • 打赏
  • 举报
回复
我当时的做法如下:
由于可以从参数得HDC,所以我将这个HDC按需要分成了若干个RECT,并设好每个RECT的left 与right成员.
当插入一段数据时是正常的,但再用第二个RECT插入不同色的文本时,整个当前单无格就没数据了,这是怎么回事?
oyljerry 2009-03-30
  • 打赏
  • 举报
回复
NM_CUSTOMDRAW 消息中自己处理对应的绘图操作等,按你自己的需要画
cnzdgs 2009-03-30
  • 打赏
  • 举报
回复
把文字分段绘制,每段分别设置颜色。
thinkSJ 2009-03-30
  • 打赏
  • 举报
回复
1楼的贴子写得有笔误,不应该是"同列文本的不同色显示"而应是"同一单元格文本的不同色显示",

谢谢2楼的代码,我的要求又改了,这份代码应该不是想要的结果了. :)

cnzdgs:如何自绘来实现"而应是"同一单元格文本的不同色显示"?

再次感谢LZ的两位
cnzdgs 2009-03-30
  • 打赏
  • 举报
回复
NM_CUSTOMDRAW通知可以自绘,最后返回CDRF_SKIPDEFAULT跳过控件本身的默认操作。
hurryboylqs 2009-03-30
  • 打赏
  • 举报
回复
自己画上去,什么颜色不可以?


case NM_CUSTOMDRAW:
{
LPNMLVCUSTOMDRAW lpnmcd = (LPNMLVCUSTOMDRAW)pnmh;
if(lpnmcd ->nmcd.dwDrawStage ==CDDS_PREPAINT)
{
return CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTPAINT;
}
else if(lpnmcd ->nmcd.dwDrawStage ==CDDS_ITEMPREPAINT)
{
return CDRF_NOTIFYSUBITEMDRAW;
}
else if(lpnmcd ->nmcd.dwDrawStage == (CDDS_SUBITEM | CDDS_ITEMPREPAINT))
{
int iItem = lpnmcd->nmcd.dwItemSpec;
int iSubItem = lpnmcd->iSubItem;
if(iItem >= 0 && iSubItem >= 0)
{
RECT rSubItem = {0};
HDC hDC = lpnmcd->nmcd.hdc;

GetSubItemRect(iItem, iSubItem, LVIR_LABEL, &rSubItem);

if (iSubItem==0)
{
rSubItem.left=0; // 第一列画到最左
}
bool bSelected = false;
if(GetItemState(iItem, LVIS_SELECTED))
{
bSelected = true;
}

bool bFocus = false;
if(IsChild(::GetFocus()) || m_hWnd == ::GetFocus())
{
bFocus = true;
}


//双缓冲
CRect rDraw(rSubItem);
CMemoryDC memDC(lpnmcd->nmcd.hdc,rDraw);
memDC.SetBkMode(TRANSPARENT);
memDC.SetTextColor(RGB(0,0,0)); // 文本颜色(可以通过iItem和iSubItem判断是个单元格)
CFont font;
font.CreateFont(12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体"));

memDC.SelectFont(font);

CString strText;
GetItemText(iItem,iSubItem,strText);
strText+=_T(" ");
if (iItem%2==0) //奇数行
{
draw_row_bg(memDC,rDraw,bSelected,bFocus,true);

}
else // 偶数行
{
draw_row_bg(memDC,rDraw,bSelected,bFocus,false);
}


memDC.DrawText(strText,strText.GetLength(),&rDraw,DT_SINGLELINE|DT_RIGHT|DT_VCENTER|DT_END_ELLIPSIS);

}


return CDRF_SKIPDEFAULT;
}
}
}
break;
default:
break;
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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