Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по 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. Что-то мне подсказывает, что без него не будет возможности узнать - выбран пункт или на него наведен указатель.


Наверх

Титульная страница Поиск, карта сайта Написать письмо