Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.09;
Скачать: CL | DM;

Вниз

Вопрос по TListView   Найти похожие ветки 

 
VladSot   (2007-11-15 10:01) [0]

У меня есть TListView в режиме ViewStyle = vsIcon.
В OnCustomDrawItem самостоятельно отрисовываю фокус выделения. Сейчас потребовалось сделать спциальный фокус в том случае, если пункт TListView находится под курсором, т.е. если курсор навели на пункт, он начинанает подсвечиваться.

Мне не понятно, как в OnCustomDrawItem можно узнать является ли пункт "под воздействием куросора", что бы его по особому отрисовать. (Как Item.Selected для выделенного)

?


 
Dimaxx ©   (2007-11-15 10:07) [1]

Поиграй со свойством HotTrackStyle. Что-то мне подсказывает, что без него не будет возможности узнать - выбран пункт или на него наведен указатель.


 
Юрий Зотов ©   (2007-11-15 10:10) [2]

Mouse.CursorPos
ListView.ScreenToClient
ListView.GetItemAt


 
VladSot   (2007-11-15 10:26) [3]

Сделал такой пример, но он срабатывает только при клик-фокусе на элементе. Я что-то упустил? Или надо по другому делать отрисовку, не в 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:38) [4]

1. OwnerDraw должно быть включено.

2. Событие перерисовки вызывается тогда, когда эта перерисовка требуется. При простом движении мыши над компонентом она не требуется.


 
VladSot   (2007-11-15 10:44) [5]

Я так и думал, что при движении мыши не произойдет перериовка, но как тогда в моем случае корректно отрисовывать мое выделение?


 
VladSot   (2007-11-15 11:46) [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;


 
Юрий Зотов ©   (2007-11-15 11:55) [7]

> VladSot   (15.11.07 11:46) [6]

Запоминать старый Item и делать реальную перерисовку только тогда, когда новый не равен старому.


 
VladSot   (2007-11-15 12:08) [8]


> Юрий Зотов ©   (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 12:18) [9]

Если GetItemAt вернула nil, тоже не делать перерисовку. Пусть рисуется по умолчанию.


 
VladSot   (2007-11-15 12:28) [10]

Я кажется не понял, я же уже отрисовал один раз, потом курсор меняет положение, GetItemAt = nil, но сам же ListView себя не перерисует. Или я ошибаюсь?

Без
end else
begin
  HItem := nil;
  ListView2.Repaint;
end;

в случае, когда GetItemAt = nil, выделение остается после потери фокуса-курсора.


 
Юрий Зотов ©   (2007-11-15 13:03) [11]

...
begin
 if HItem <> nil then // !!! Перерисовка нужна только одна
 begin
   HItem := nil;
   ListView2.Repaint;
 end
end;



Страницы: 1 вся ветка

Текущий архив: 2007.12.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
15-1194857454
Voluntarist
2007-11-12 11:50
2007.12.09
Борьба со злом


15-1194788752
Blind Guardian
2007-11-11 16:45
2007.12.09
векторное произведение векторов с произвольной размерностью


3-1180525450
jack128
2007-05-30 15:44
2007.12.09
Работа с FB из нескольких потоков


2-1194785097
петрович07
2007-11-11 15:44
2007.12.09
отрисовка на канве грида


9-1164339612
grouzd)ev
2006-11-24 06:40
2007.12.09
А не проводить ли нам небольшие игры по кодингу? (ч. 5)