Poprawiłem co nieco, pousuwałem zbędne linie i zastosowałem DrawFocusRect;
-
Okno zaraz po uruchomieniu, okno jest aktywne, nie zaznaczone żadne pole, widnieje obwódka.
-
Zaznaczone pole, obwódka znikła.
-
Okno nie aktywne, zaznaczone pole, obwódka znowu aktywna.
W kodzie zaznaczyłem, gdzie funkcja DrawFocusRect wpływa na zmianę obwódki, ale funkcja nie działa, gdy okno staje się nie aktywne i nie może wtedy odmalować.
Nie poddam się.... może macie pomysły gdzie to poprawić ?
procedure PaintGradient(Col1, Col2: TColor; Bmp: TBitmap);
type
PixArray = array [1..3] of Byte;
var
h, w: Integer;
y: Real;
p: ^PixArray;
begin
Bmp.PixelFormat := pf24Bit;
for h := 0 to Bmp.Height-1 do
begin
p := Bmp.ScanLine[h];
for w := 0 to Bmp.Width-1 do
begin
y := h / Bmp.Height;
p^[1] := Round(GetBvalue(Col1)*(1-y)) + Round(GetBvalue(Col2)*y);
p^[2] := Round(GetGvalue(Col1)*(1-y)) + Round(GetGvalue(Col2)*y);
p^[3] := Round(GetRvalue(Col1)*(1-y)) + Round(GetRvalue(Col2)*y);
Inc(p);
end;
end;
end;
procedure TForm1.ListBoxDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Ico: TIcon;
Gradient: TBitmap;
Linia1, Linia2: TStringList;
begin
Ico := TIcon.Create;
Gradient := TBitmap.Create;
Linia1 := TStringList.Create;
Linia2 := TStringList.Create;
{Test pierwszej linii}
Linia1.Add('Ochrona komputera');
Linia1.Add('Zadanie nie zostało wykonane');
Linia1.Add('Data opublikowania baz danych');
{Test drugiej linii}
Linia2.Add('Zatrzymaj | Wstrzymaj | Ustawienia');
Linia2.Add('Ustawienia | Terminarz');
Linia2.Add('Ustawienia | Przywróć');
with ListBox.Canvas do
begin
if (odSelected in State) then
begin
Gradient.Width := Rect.Right - Rect.Left;
Gradient.Height := Rect.Bottom - Rect.Top;
PaintGradient(clWhite, RGB(193, 243, 240), Gradient);
CopyRect(Rect, Gradient.Canvas, Gradient.Canvas.ClipRect);
Brush.Color := clWhite;
FrameRect(Rect);
Brush.Style := bsClear;
Pen.Color := RGB(150, 234, 229);
RoundRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, 10, 10);
{Ikona po lewej}
Img1.GetIcon(1, Ico);
Draw(Rect.Left + 4, Rect.Top + 9, Ico);
{Ikona po prawej}
Img1.GetIcon(2, Ico);
Draw(Rect.Right - 25, Rect.Top + 7, Ico);
{Linia główna}
Font.Name := 'Tahoma';
Font.Color := $00A68D00;
Font.Height := -13;
Font.Size := 10;
Font.Style := [fsBold];
TextOut(Rect.Left + 25, Rect.Top + 8, ListBox.Items[Index]);
{Linia pierwsza}
Font.Color := clBlack;
Font.Height := -11;
Font.Size := 8;
Font.Style := [];
TextOut(Rect.Left + 25, Rect.Top + 30, Linia1.Strings[Index]);
{Linia druga}
Font.Color := $00A68D00;
Font.Height := -11;
Font.Size := 8;
Font.Style := [];
TextOut(Rect.Left + 25, Rect.Top + 50, Linia2.Strings[Index]);
//Font.Color := clBlack;
//miejsce gdzie trzeba sprawdzić, czy okno utraciło aktywność
if not Focused then DrawFocusRect(Rect);
//Exit;
end
else
begin
FillRect(Rect);
Img1.GetIcon(0, Ico);
Draw(Rect.Left + 4, Rect.Top + 9, Ico);
end;
{Ikona po prawej}
Img1.GetIcon(2, Ico);
Draw(Rect.Right - 25, Rect.Top + 7, Ico);
{Linia główna}
Font.Name := 'Tahoma';
Font.Color := $00A68D00;
Font.Height := -13;
Font.Size := 10;
Font.Style := [fsBold];
TextOut(Rect.Left + 25, Rect.Top + 8, ListBox.Items[Index]);
{Linia pierwsza}
Font.Color := clBlack;
Font.Height := -11;
Font.Size := 8;
Font.Style := [];
TextOut(Rect.Left + 25, Rect.Top + 30, Linia1.Strings[Index]);
{Linia druga}
Font.Color := $00A68D00;
Font.Height := -11;
Font.Size := 8;
Font.Style := [];
TextOut(Rect.Left + 25, Rect.Top + 50, Linia2.Strings[Index]);
//Font.Color := clBlack;
end;
Ico.Free;
Gradient.Free;
Linia1.Free;
Linia2.Free;
end;