Как установить цвет заголовка VirtualStringTree?

Заголовок VirtualStringTree имеет свойство Background, но установка его на другой цвет не меняет цвет. Я подозреваю, что дерево отображается с использованием тем Windows.

Как я могу установить цвет?

2 ответа

Решение

Вы можете использовать собственность THeader.Background но вам придется исключить toThemeAware от TreeOptions.PaintOptions, Это отключит темы, как уже сказал TLama в своем комментарии выше.


Я рекомендую вам использовать события OnAdvancedHeaderDraw а также OnHeaderDrawQueryElements, hoOwnerDraw должен быть включен в Header.Options чтобы они вступили в силу.

В OnHeaderDrawQueryElements Ты устанавливаешь Elements по крайней мере [hpeBackground] И в OnAdvancedHeaderDraw Вы делаете заказной рисунок.

Смотрите этот пример ( источник):

procedure TfrmMain.MyVSTHeaderDrawQueryElements(Sender: TVTHeader;
  var PaintInfo: THeaderPaintInfo; var Elements: THeaderPaintElements);
begin
  Elements := [hpeBackground];
end;

procedure TfrmMain.MyVSTAdvancedHeaderDraw(Sender: TVTHeader;
  var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements);
begin
  if hpeBackground in Elements then
  begin
    PaintInfo.TargetCanvas.Brush.Color := clFuchsia; // <-- your color here
    if Assigned(PaintInfo.Column) then
      DrawFrameControl(PaintInfo.TargetCanvas.Handle, PaintInfo.PaintRectangle, DFC_BUTTON, DFCS_FLAT or DFCS_ADJUSTRECT); // <-- I think, that this keeps the style of the header background, but I'm not sure about that
    PaintInfo.TargetCanvas.FillRect(PaintInfo.PaintRectangle);
  end;
end;
procedure TfrmDepositDefrayalSingly.vstItemsManuallyHeaderDrawQueryElements(Sender: TVTHeader;
  var PaintInfo: THeaderPaintInfo; var Elements: THeaderPaintElements);
begin
  Elements := [hpeBackground];
end;


procedure TfrmDepositDefrayalSingly.vstItemsManuallyAdvancedHeaderDraw(Sender: TVTHeader;
  var PaintInfo: THeaderPaintInfo; const Elements: THeaderPaintElements);
begin
  if hpeBackground in Elements then
  begin
    PaintInfo.TargetCanvas.Brush.Color := cGlobalVar.BasicColor;
    PaintInfo.TargetCanvas.FillRect(PaintInfo.PaintRectangle);

    if Assigned(PaintInfo.Column) then
    begin
      PaintInfo.TargetCanvas.Brush.Color := clGray;
      PaintInfo.TargetCanvas.FrameRect(PaintInfo.PaintRectangle);
    end;
  end;
end;
Другие вопросы по тегам