我已经使用 VCL 几个月了,可以通过谷歌搜索解决我所有的问题,但是这个让我卡住了。每当该行的索引 7 处的子项不包含特定文本时,我想在 TListView 中为该行着色(请参见下面的代码)。这一切都很好,除了最后一行的标题单元格(最左边)没有着色。我尝试了一些技巧(例如,在绘制项目时启用然后禁用 ListView),但我没有找到不会破坏表单上其他内容的技巧(例如计时器)。此外,在我单击单元格后,它确实会着色......我在 Windows 7 上使用 XE7 (C++Builder)。所有建议都表示赞赏;)
void __fastcall TBackupManagerForm::OverviewListViewCustomDrawItem(TCustomListView *Sender, TListItem *Item, TRect &Rect, TOwnerDrawState State)
{
if ((*Item->SubItems)[7] != "someText") {
Sender->Canvas->Brush->Color = clRed;
}
else {
Sender->Canvas->Brush->Color = clWindow;
}
TRect r, rt;
r = Item->DisplayRect(drBounds);
Sender->Canvas->FillRect(Rect);
r.Right = r.Left + (*OverviewListView->Columns)[0]->Width;
rt = r;
rt.Left += 5;
rt.Top += 1;
UnicodeString s = Item->Caption;
Sender->Canvas->TextRect(rt, s, TTextFormat()<<tfSingleLine<<tfEndEllipsis);
for (int i = 0; i < Item->SubItems->Count; i++) {
ListView_GetSubItemRect(Sender->Handle, Item->Index, i+1, LVIR_BOUNDS,&rt);
s = (*Item->SubItems)[i];
Sender->Canvas->TextRect(rt, s, TTextFormat()<<tfSingleLine<<tfEndEllipsis);
}
}
编辑 (在这里回答评论,因为没有足够的代表:P)
@PaulMcCarthy 是的,这对我来说也很奇怪......
@RemyLebeau 感谢您的建议,我实施了它们。
此外,我设法通过额外调用OverviewListView->Refresh()
from outside来正确绘制CustomDrwaItem
它,但它仍然让我感到困扰,没有它它就无法工作(双关语有点有意)。