![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по TListView [D7, 2003]
VladSot © (2007-11-15 10:01:00)У меня есть TListView в режиме ViewStyle = vsIcon.
В OnCustomDrawItem самостоятельно отрисовываю фокус выделения. Сейчас потребовалось сделать спциальный фокус в том случае, если пункт TListView находится под курсором, т.е. если курсор навели на пункт, он начинанает подсвечиваться.
Мне не понятно, как в OnCustomDrawItem можно узнать является ли пункт "под воздействием куросора", что бы его по особому отрисовать. (Как Item.Selected для выделенного)
?
Юрий Зотов (2007-11-15 13:03:00) [1]
...
begin
if HItem <> nil then // !!! Перерисовка нужна только одна
begin
HItem := nil;
ListView2.Repaint;
end
end;
VladSot (2007-11-15 12:28:00) [2]Я кажется не понял, я же уже отрисовал один раз, потом курсор меняет положение, GetItemAt = nil, но сам же ListView себя не перерисует. Или я ошибаюсь?
Без
end else
begin
HItem := nil;
ListView2.Repaint;
end;
в случае, когда GetItemAt = nil, выделение остается после потери фокуса-курсора.
Юрий Зотов (2007-11-15 12:18:00) [3]Если GetItemAt вернула nil, тоже не делать перерисовку. Пусть рисуется по умолчанию.
VladSot (2007-11-15 12:08:00) [4]
> Юрий Зотов © (15.11.07 11:55) [7]
Спасибо помогло.
У меня ещё один вопрос получился, из прошлого: а как мне очистить область, если фокус-мышки ушел с Item'a, у меня опять получается постоянная перерисовка по движению мышки, т.к. я вызываю TListView.Repaint. Этого можно избежать?
var
HItem: TListItem;
procedure TForm1.ListView2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
Rect: TRect;
begin
if ListView2.GetItemAt(ListView2.ScreenToClient(Mouse.CursorPos).X, ListView2.ScreenToClient(Mouse.CursorPos).Y) <> nil then
begin
if HItem <> ListView2.GetItemAt(ListView2.ScreenToClient(Mouse.CursorPos).X, ListView2.ScreenToClient(Mouse.CursorPos).Y) then
begin
HItem := ListView2.GetItemAt(ListView2.ScreenToClient(Mouse.CursorPos).X, ListView2.ScreenToClient(Mouse.CursorPos).Y);
with ListView2.GetItemAt(ListView2.ScreenToClient(Mouse.CursorPos).X, ListView2.ScreenToClient(Mouse.CursorPos).Y) do
begin
ListView_GetItemRect(ListView2.Handle, Index, Rect, LVIR_BOUNDS);
ListView2.Canvas.DrawFocusRect(Rect);
end;
end;
end else
begin
HItem := nil;
ListView2.Repaint;
end;
end;
Юрий Зотов (2007-11-15 11:55:00) [5]> VladSot (15.11.07 11:46) [6]
Запоминать старый Item и делать реальную перерисовку только тогда, когда новый не равен старому.
VladSot (2007-11-15 11:46:00) [6]Сделал ещё один способ, но от постоянной перерисовки (если мышкой двигать), все дергается
procedure TForm1.ListView2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
Rect: TRect;
begin
if ListView2.GetItemAt(ListView2.ScreenToClient(Mouse.CursorPos).X, ListView2.ScreenToClient(Mouse.CursorPos).Y) <> nil then
with ListView2.GetItemAt(ListView2.ScreenToClient(Mouse.CursorPos).X, ListView2.ScreenToClient(Mouse.CursorPos).Y) do
begin
ListView_GetItemRect(ListView2.Handle, Index, Rect, LVIR_BOUNDS);
ListView2.Canvas.DrawFocusRect(Rect)
end;
end;
VladSot (2007-11-15 10:44:00) [7]Я так и думал, что при движении мыши не произойдет перериовка, но как тогда в моем случае корректно отрисовывать мое выделение?
Юрий Зотов (2007-11-15 10:38:00) [8]1. OwnerDraw должно быть включено.
2. Событие перерисовки вызывается тогда, когда эта перерисовка требуется. При простом движении мыши над компонентом она не требуется.
VladSot (2007-11-15 10:26:00) [9]Сделал такой пример, но он срабатывает только при клик-фокусе на элементе. Я что-то упустил? Или надо по другому делать отрисовку, не в OnCustomDrawItem?
procedure TForm1.ListView2CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if ListView2.GetItemAt(ListView2.ScreenToClient(Mouse.CursorPos).X, ListView2.ScreenToClient(Mouse.CursorPos).Y) <> nil then
ListView2.GetItemAt(ListView2.ScreenToClient(Mouse.CursorPos).X, ListView2.ScreenToClient(Mouse.CursorPos).Y).Caption := 'ddd';
end;
Юрий Зотов (2007-11-15 10:10:00) [10]Mouse.CursorPos
ListView.ScreenToClient
ListView.GetItemAt
Dimaxx (2007-11-15 10:07:00) [11]Поиграй со свойством HotTrackStyle. Что-то мне подсказывает, что без него не будет возможности узнать - выбран пункт или на него наведен указатель.