gpt4 book ai didi

c - 如何修改 ListView 子项中单个字符的字体颜色?

转载 作者:可可西里 更新时间:2023-11-01 13:29:58 26 4
gpt4 key购买 nike

我正在使用 Windows API 编写应用程序,我想知道如何使用包含多色文本的子项制作 ListView 。

为了澄清,下面是一张它在 API Monitor 中是如何实现的图片:

请注意,在“API”列中,文本有多种颜色,好像是富文本之类的。我想知道我将如何做到这一点。

有人告诉我用自定义绘图做点什么,但他不确定。我调查了它,并处理了 NM_CUSTOMDRAW。这是我的测试结果:

代码如下:

inline LRESULT HandleWM_NOTIFY(LPARAM lParam)
{
switch (((LPNMHDR)lParam)->code)
{
case NM_CUSTOMDRAW:
{
switch (((LPNMHDR)lParam)->idFrom)
{
case ID_LISTVIEW1:
{
LPNMLVCUSTOMDRAW lpNMLVCD = (LPNMLVCUSTOMDRAW)lParam;
if (lpNMLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
{
return CDRF_NOTIFYITEMDRAW;
}
else if (lpNMLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
COLORREF crText;
switch (lpNMLVCD->nmcd.dwItemSpec % 3)
{
case 0:
crText = RGB(255, 0, 0);
break;
case 1:
crText = RGB(0, 255, 0);
break;
case 2:
crText = RGB(0, 0, 255);
break;
}

lpNMLVCD->clrText = crText;
lpNMLVCD->
}

return CDRF_DODEFAULT;
}
default: break;
}

break;
}

default: break;
}

return 0;
}

使用NM_CUSTOMDRAW方法,我无法修改单个字符的字体颜色;我只能修改子项中所有内容的字体颜色,这不是我想要的。

如何实现 API 监视器的功能?我觉得这会非常困难,但欢迎提出任何建议。

最佳答案

NM_CUSTOMDRAW 是解决方案。很抱歉,这里没有简单 解决方案。您只需要按顺序而不是共同绘制您想要的不同颜色的文本,使用 GetTextExtentPoint32 API 来协助文本绘制。你返回 CDRF_SKIPDEFAULT 告诉 ListView 不要渲染文本,你处理了它。

if (lpNMHdr->code == NM_CUSTOMDRAW)
{
LPNMLVCUSTOMDRAW lpCD = (LPNMLVCUSTOMDRAW)lpNMHdr;
if (lpCD->nmcd.dwDrawStage == CDDS_PREPAINT)
{
return CDRF_NOTIFYITEMDRAW;
}

if (lpCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
return CDRF_NOTIFYSUBITEMDRAW;
}

if (lpCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT|CDDS_SUBITEM))
{
if (lpCD->iSubItem == 0) //detect which subitem is being drawn
{
LPCTSTR lpcszBuf1 = _T("example");
LPCTSTR lpcszBuf2 = _T("text");

RECT iR = { 0 };
ListView_GetSubItemRect(lpCD->nmcd.hdr.hwndFrom, lpCD->nmcd.dwItemSpec, lpCD->iSubItem, LVIR_BOUNDS, &iR);

SetBkMode(lpCD->nmcd.hdc, TRANSPARENT);

SIZE sz = { 0 };
GetTextExtentPoint32(lpCD->nmcd.hdc, lpcszBuf1, 7, &sz);

SetTextColor(lpCD->nmcd.hdc, RGB(255, 0, 0));
DrawText(lpCD->nmcd.hdc, lpcszBuf1, -1, &iR, DT_LEFT);

iR.left += sz.cx;

SetTextColor(lpCD->nmcd.hdc, RGB(0, 255, 0));
DrawText(lpCD->nmcd.hdc, lpcszBuf2, -1, &iR, DT_LEFT);

return CDRF_SKIPDEFAULT;
}
}

关于c - 如何修改 ListView 子项中单个字符的字体颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com