Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Покраска ячеек VirtualTreeView без закрытия фонового изображения

Delphi , Синтаксис , Деревья

Как покрасить ячейки VirtualTreeView без закрытия фонового изображения

В данной статье мы рассмотрим вопрос окраски ячеек в VirtualTreeView без закрытия фонового изображения. Мы столкнемся с проблемой, когда пытаемся применить разные цвета к ячейкам, но они закрывают фоновое изображение. Мы также рассмотрим альтернативный ответ и подтвержденное решение.

Описание проблемы

При использовании VT.Background для отображения фонового изображения в VirtualTreeView с несколькими столбцами, трудно применить разные цвета к ячейкам без закрытия фонового изображения. Попытка использовать OnBeforeItemErase не приводит к нужному результату, так как при использовании EraseAction := eaColor также окрашивается фоновая битмап-область ячейки, а при использовании eaDefault цвет не применяется.

Альтернативный ответ

До сих пор не получено альтернативное решение для данной проблемы.

Подтвержденный ответ

Ниже приведено предполагаемое решение, которое предполагает, что вы хотите использовать разные цвета для фона ячеек, но при этом сохранить фоновое изображение:

procedure ColorBlend(const ACanvas: HDC; const ARect: TRect;
  const ABlendColor: TColor; const ABlendValue: Integer);
var
  DC: HDC;
  Brush: HBRUSH;
  Bitmap: HBITMAP;
  BlendFunction: TBlendFunction;
begin
  DC := CreateCompatibleDC(ACanvas);
  Bitmap := CreateCompatibleBitmap(ACanvas, ARect.Right - ARect.Left,
    ARect.Bottom - ARect.Top);
  Brush := CreateSolidBrush(ColorToRGB(ABlendColor));
  try
    SelectObject(DC, Bitmap);
    Windows.FillRect(DC, Rect(0, 0, ARect.Right - ARect.Left,
      ARect.Bottom - ARect.Top), Brush);
    BlendFunction.BlendOp := AC_SRC_OVER;
    BlendFunction.BlendFlags := 0;
    BlendFunction.AlphaFormat := 0;
    BlendFunction.SourceConstantAlpha := ABlendValue;
    Windows.AlphaBlend(ACanvas, ARect.Left, ARect.Top,
      ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, DC, 0, 0,
      ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, BlendFunction);
  finally
    DeleteObject(Brush);
    DeleteObject(Bitmap);
    DeleteDC(DC);
  end;
end;

procedure TForm1.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
  BlendColor: TColor;
  BlendValue: Integer;
begin
  if CellPaintMode = cpmPaint then
  begin
    case Column of
      0: BlendColor := $000080FF;
      1: BlendColor := $0046C2FF;
      2: BlendColor := $0046F5FF;
    end;
    BlendValue := 145;
    if not VirtualTrees.MMXAvailable then
      ColorBlend(TargetCanvas.Handle, CellRect, BlendColor, BlendValue)
    else
      VirtualTrees.Utils.AlphaBlend(0, TargetCanvas.Handle, CellRect, Point(0, 0),
        bmConstantAlphaAndColor, BlendValue, ColorToRGB(BlendColor));
  end;
end;

На изображении ниже показан предварительный просмотр кода:

Предварительный просмотр кода

Вывод

В данной статье мы рассмотрели проблему покраски ячеек VirtualTreeView без закрытия фонового изображения. Мы увидели, что использование OnBeforeItemErase не приводит к нужному результату, и рассмотрели альтернативный ответ и подтвержденное решение. С помощью функции ColorBlend мы можем применить разные цвета к ячейкам, не закрывая фоновое изображение.

Создано по материалам из источника по ссылке.

Статья описывает проблему окраски ячеек в VirtualTreeView без закрытия фонового изображения и предлагает решение с использованием функции ColorBlend.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Деревья ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 23:39:16/0.0051531791687012/1