Delphi: рисовать выделения и эффекты наведения мыши на ListViewDrawItem
У меня есть код отсюда: Delphi: Canvas.FillRect в представлении списка для рисования строк (я использую OwnerDraw).
Поэтому мне нужно рисовать выделения и эффекты наведения мыши. И нарисовать нормальный эффект изменения размера столбца...
У меня есть код для перемещения элементов вверх и вниз:
procedure TForm1.ListViewDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
DragItem, DropItem, CurrentItem, NextItem: TListItem;
begin
if Sender = Source then
with TListView(Sender) do
begin
DropItem := GetItemAt(X, Y);
CurrentItem := Selected;
while CurrentItem <> nil do
begin
NextItem := GetNextItem(CurrentItem, SdAll, [IsSelected]);
if DropItem = nil then DragItem := Items.Add
else
DragItem := Items.Insert(DropItem.Index);
DragItem.Assign(CurrentItem);
CurrentItem.Free;
CurrentItem := NextItem;
end;
end;
end;
procedure TForm1.ListViewDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Sender = Update_ListBox;
end;
Как нарисовать выделения и эффекты наведения мыши на эффект изменения размера столбца ListViewDrawItem +?
Спасибо!!!
1 ответ
Если вы хотите нарисовать выборки и другими способами отреагировать на текущее состояние элемента управления, вам нужно написать дополнительный код для этой цели, потому что мы рисуем владелец элемента управления. Это означает, что мы говорим Windows: "Эй, ничего не рисуй в клиентской области, я сделаю это". Поэтому Windows не рисует ничего, даже выделения, прямоугольники фокусировки и эффекты наведения мыши.
К счастью, реализовать это поведение довольно легко вручную. Действительно, в OnCustomDraw
обработчик события, вы получаете State
параметр, который вы можете прочитать. Это набор, и некоторые из возможных элементов включают odSelected
, odHotLight
, а также odFocused
,
Опираясь на наш предыдущий код, добавив всего несколько новых строк, мы приходим к
procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
Rect: TRect; State: TOwnerDrawState);
var
i: Integer;
x1, x2: integer;
r: TRect;
S: string;
const
DT_ALIGN: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER);
begin
if SameText(Item.SubItems[1], 'done') then
begin
Sender.Canvas.Font.Color := clWhite;
Sender.Canvas.Brush.Color := clGreen;
end
else
if Odd(Item.Index) then
begin
Sender.Canvas.Font.Color := clBlack;
Sender.Canvas.Brush.Color := $F6F6F6;
end
else
begin
Sender.Canvas.Font.Color := clBlack;
Sender.Canvas.Brush.Color := clWhite;
end;
if odSelected in State then // NEW!
begin // NEW!
Sender.Canvas.Font.Color := clWhite; // NEW!
Sender.Canvas.Brush.Color := clNavy; // NEW!
end; // NEW!
Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.FillRect(Rect);
x1 := 0;
x2 := 0;
r := Rect;
Sender.Canvas.Brush.Style := bsClear;
Sender.Canvas.Draw(3, r.Top + (r.Bottom - r.Top - bm.Height) div 2, bm);
for i := 0 to ListView1.Columns.Count - 1 do
begin
inc(x2, ListView1.Columns[i].Width);
r.Left := x1;
r.Right := x2;
if i = 0 then
begin
S := Item.Caption;
r.Left := bm.Width + 6;
end
else
S := Item.SubItems[i - 1];
DrawText(Sender.Canvas.Handle,
S,
length(S),
r,
DT_SINGLELINE or DT_ALIGN[ListView1.Columns[i].Alignment] or
DT_VCENTER or DT_END_ELLIPSIS);
x1 := x2;
end;
if odFocused in State then // NEW!
DrawFocusRect(Sender.Canvas.Handle, Rect); // NEW!
end;
http://privat.rejbrand.se/TListViewCustomDrawIconSelState.png
Обратите внимание, что линия "лошадь" выделена и имеет фокус клавиатуры.