Полосатый TListBoxDelphi , Компоненты и Классы , СпискиПолосатый TListBox
Оформил: DeeCo unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TListbox = class(StdCtrls.TListbox) private procedure wmEraseBkGnd(var Msg: TWMEraseBkGnd); message WM_ERASEBKGND; end; TForm1 = class(TForm) ListBox1: TListBox; // (!) ListBox1.Style := lbOwnerDrawFixed Button1: TButton; procedure Button1Click(Sender: TObject); procedure ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); { ... } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := listbox1.Items.Count to listbox1.Items.Count + 5 do listbox1.Items.Add(Format('Item %d', [i])); end; { TListbox } const colors: array [Boolean] of TColor = ($FFFFC0, $C0FFFF); procedure TListbox.wmEraseBkGnd(var Msg: TWMEraseBkGnd); var cv: TCanvas; h, max: Integer; r: TRect; b: Boolean; begin Msg.Result := 1; h := Perform(LB_GETITEMHEIGHT, 0, 0); if h = LB_ERR then h := ItemHeight; cv := TCanvas.Create; try cv.Handle := Msg.DC; r := Rect(0, 0, ClientWidth, h); b := Odd(TopIndex) and (TopIndex >= 0); max := ClientHeight; cv.Brush.Style := bsSolid; while r.Top < max do begin cv.Brush.Color := colors[b]; b := not b; cv.FillRect(r); OffsetRect(r, 0, h); end; finally cv.Handle := 0; cv.Free; end; end; procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var cb, ct: TColor; begin if not (odSelected in State) then with Control as TListbox do begin Canvas.Brush.Color := colors[Odd(Index)]; Canvas.Brush.Style := bsSolid; end; Rect.Right := Control.ClientWidth; with Control as TListbox do begin Canvas.FillRect(Rect); Canvas.Brush.Style := bsClear; Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top, Items[Index]); end; end; end. Перевод контента на русский язык: Это проект Delphi, который реализует контрол стрипед TListBox с альтернирующими цветами для фона и текстовых элементов. Распределение кода: Компонент TListbox Компонент TListbox派 от стандартного StdCtrls.TListbox и переопределяет процедуру wmEraseBkGnd для реализации эффекта стрипинга. Массив colors определяет два цвета - $FFFFC0 (палевый желтый) и $C0FFFF (палевый синий), которые используются альтернативно для фона. В процедуре wmEraseBkGnd:
Компонент TForm1 Компонент TForm1 содержит TListBox (ListBox1) и TButton (Button1). При клике кнопки добавляет 5 новых элементов в список с помощью цикла. Процедура ListBox1DrawItem - это обработчик владельца, который настраивает отображение каждого элемента списка. Она:
Альтернативное решение Если вы хотите более простое решение, можно достичь эффекта стрипинга, установив свойство ListBox1.Style в lbOwnerDrawVariable и реализуя только процедуру ListBox1DrawItem. Это позволит настроить отображение каждого элемента списка без переопределения процедуры wmEraseBkGnd. В этом случае можно использовать одиночный цвет для фона и текста, а затем альтернировать цвета для каждого элемента с помощью функции Odd(Index). Обновленная реализация:
Эта реализация более проста и эффективна, чем оригинальный код, но может не обеспечить точного же визуального эффекта. В статье описывается создание полосатого списка элементов (TListBox) в Delphi с помощью владельческого рисования и использования шаблонов для изменения цвета фона и текста элементов. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |