【问题标题】:Change background color of TListView header in older Delphi更改旧 Delphi 中 TListView 标头的背景颜色
【发布时间】:2021-06-28 02:31:27
【问题描述】:

一个使用 Delphi 7 的旧应用程序,但在 2010 年之前的旧 Delphi 版本中应该是类似的代码。我需要更改 TListView 标题的背景颜色,以便提供深色主题。我可以改变其他一切的颜色。我发现下面的线程显然适用于更改列标题上的字体颜色,但我还需要调整整个标题的背景颜色。

Delphi: ListView (vsReport) single column header caption with custom font color?

我迷路了,有人可以帮忙吗? Windows 消息通知超出了我的理解范围。

非常感谢。

【问题讨论】:

  • 阅读Header Controls 上的文档后,似乎没有一种简单的方法可以更改标题背景颜色。您必须自己实现标题项目的所有者绘图。
  • 链接的问题提供了两种不同的方法来自定义列标题,一种使用NM_CUSTOMDRAW,另一种使用WM_DRAWITEM。这两个代码只是设置文本颜色,但它们都可以访问HDC,你可以在上面画任何你想要的东西。例如,将FillRect() 与所需颜色的画笔一起使用。
  • 谢谢雷米。我实现了 NM_CUSTOMDRAW 代码并将以下代码行放在 SetColorText 上方,但它什么也没做。 FillRect(NMCustomDraw.hdc,NMCustomDraw.rc,COLOR_GRAYTEXT+1)。 SetTextColor 虽然有效。还尝试了 SetBkColor 没有效果。我错过了什么?
  • 我设法使用 Message.Result := CDRF_SKIPDEFAULT 而不是 CDRF_NEWFONT 为背景着色,然后在我在其他地方找到的处理左/右列对齐的代码中使用 DrawText。但是,没有列分隔符。我可以左右拖动不可见的列分隔符。我将如何正确绘制这些?左对齐的列标题被绘制到左边太远,而右对齐的标题离右边太远,我认为这是由于缺少分隔线。

标签: windows listview delphi columnheader


【解决方案1】:

我为自己感到相当自豪,并且不知何故找到了一些代码片段,所有这些代码都组合在一起使这一切正常工作。像这样的……

procedure TTntListView.WMNotify(var AMessage: TWMNotify);
const
  DT_ALIGN: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER);
var
  NMCustomDraw: TNMCustomDraw;
  i: Integer;
  r: TRect;
begin
  if (AMessage.NMHdr.hwndFrom = FHeaderHandle) and
    (AMessage.NMHdr.code = NM_CUSTOMDRAW) then
  begin
    NMCustomDraw := PNMCustomDraw(TMessage(AMessage).LParam)^;
    case NMCustomDraw.dwDrawStage of
      CDDS_PREPAINT: AMessage.Result := CDRF_NOTIFYITEMDRAW;
      CDDS_ITEMPREPAINT: begin
        i := NMCustomDraw.dwItemSpec;
        r := NMCustomDraw.rc;
        FillRect(NMCustomDraw.hdc, r, Sender.Canvas.Brush.Handle);
        SetBkColor(NMCustomDraw.hdc,  ColorToRGB(Sender.Canvas.Brush.Color));
        SetTextColor(NMCustomDraw.hdc, ColorToRGB(Sender.Canvas.Font.Color));
        DrawEdge(NMCustomDraw.hdc,r,EDGE_SUNKEN,BF_LEFT);
        Inc(r.Left,2);
        Dec(r.Right,2);
        if Sender.Column[i].Alignment = taLeftJustify then Inc(r.Left,3)
        else Dec(r.Right,3);
        DrawTextW(NMCustomDraw.hdc,
          pWideChar(Sender.Column[i].Caption),
          length(Sender.Column[i].Caption),
          r,
          DT_SINGLELINE or DT_ALIGN[Sender.Column[i].Alignment] or
            DT_VCENTER or DT_END_ELLIPSIS);
        Message.Result := CDRF_SKIPDEFAULT;
      end;
      else AMessage.Result := CDRF_DODEFAULT;
    end;
  end
  else inherited;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2010-12-21
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多