[DELPHI] OwnerDrawFixed

0

Witam wszystkich....

Nie wiem jak napisać procedurę obsługującą OwnerDrawFixed, tak aby selekcja Itemów była w innym kolorze niż niebieski.
Przykład programu jest poniżej. Gdy klikam na jakimś Itemie, to zaznacza prawidłowo na czerwono. Problem w tym, że jak kliknę na inny Item, to poprzedni (czerwony) zostaje.
Jak zrobić, żeby tło pod wybranym Itemem było czerwone, a tła pozostałych Itemów - były odświeżane?

Pozdrawiam
RYGAR

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ImgList;

type
  TForm1 = class(TForm)
    ImageList1: TImageList;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

const
  LINIE : array[0..4] of String[10] =
        ('Linia 1', 'Linia 2', 'Linia 3', 'Linia 4', 'Linia 5');


procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin

  if Index = ListBox1.ItemIndex then ListBox1.Canvas.Brush.Color := clRed;
 
  ListBox1.Canvas.FillRect(Rect);
  ListBox1.Canvas.TextOut(Rect.Left+1,Rect.Top+1,ListBox1.Items.Strings[Index]);

end;


procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  for I := 0 to 4 do
    ListBox1.Items.Add(LINIE[i]);
end;


end.
0

poczytaj sobie o State: TOwnerDrawState

0
Misiekd napisał(a)

poczytaj sobie o State: TOwnerDrawState

No i poczytałem sobie. Dzięki za wskazówkę.

Mam jednak kolejny problem. Chodzi o zmianę koloru obramowania (lub jego wyłączenia), które pojawia się w momencie kliknięcia na Item. Poniższy fragment programu, który napisałem, nie spełnia w pełni moich oczekiwań. Niby wszystko działa i od bólu mógłbym na tym pozostać, ale jednak nie do końca rozumiem w jaki sposób nadać kolor obramowaniu. Na poniższym listingu widać, że po kliknięciu na dowolny Item na ListBox'ie - kolor czcionki wybranego Itemu jest ustawiony na czarny (patrz: linia A), zaznaczenie jest koloru ciemno-szarego (patrz: linia B), a obramowanie jest ustawione na kolor czerwony (patrz: linia C). Linijki (D) nie bardzo rozumiem, ale bez niej nie widać obramowania w ustalonym kolorze (C) tylko jakiś kolor z "nieba" wzięty. ;-)
Linijki (E), (F) i (G) dotyczą oczywiście momentu wyjścia z ListBox'u, ale tu wszystko działa poprawnie.

I teraz opiszę problem. Poniższy programu działa dobrze, dopóki nie zmienię koloru czcionki z czarnego na inny (A). Chciałbym, żeby po zaznaczeniu dowolnego Itema, kolor czcionki był np. BIAŁY a ramka dalej była w kolorze CZERWONYM. I tu właśnie mam taki problem, bo jak zmienię linię (A) na Canvas.Font.Color := clWhite, to co prawda czcionka w Itemie jest biała, ale za to obramowanie (które powinno pozostać czerwone) jest w zupełnie innym kolorze. [???] Nie bardzo kumam "czaczy" o co w tym tu chodzi. Bynajmniej tego problemu nie ma przy ustawieniu koloru w linii (E).

Proszę o pomoc. Z góry dziękuję.

Pozdrawiam
RYGAR

    
 with ListBox1 do
  begin
    Canvas.FillRect(Rect);
    if odSelected in State then
    begin
      if Focused then
      begin
        Canvas.Font.Color := clBlack;   // A) czcionka - czarna
        Canvas.Brush.Color := clGray;  // B) wypełnienie - ciemno-szare
        Canvas.Pen.Color := clRed;      // C) obramowanie - czerwone
        Canvas.Rectangle(Rect);
        Canvas.Brush.Style := bsClear; // D) ?? - bez tego nie widać ramki
      end
      else
      begin
        Canvas.Font.Color := clBlack;    // E) czcionka - czarna
        Canvas.Brush.Color := clSilver; // F) wypełnienie - jasno-szare
        Canvas.Pen.Color := clBlue;      // G) obramowanie - niebieskie
        Canvas.Rectangle(Rect);
      end;
    end;
0

tez mam ten problem przy rysowaniu po listboxie w momencie gdy kolor czcionki jest inny niz czarny windows dorysowuje to swoje kropkowane obramowanie co raz kiepsko wyglada, dwa wyglada jakby kolor obramowania byl inny niz ustalilismy. Ja szukalem rozwiazania i nawet kilka przykladow znalazlem ale niedzialaly niestety wiec zastanawiam sie czy usuniecie tego uciazliwego obramowania jest w ogóle mozliwe. Wiec dolaczam sie do prosby Rygara i jesli ktos ma skuteczny pomysl na to jak to omniac to prosze o pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1