Главная страница
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
6-1175622907
Tiberius
2007-04-03 21:55
2007.12.09
Где найти ieConst.pas и IEDocHostUIHandler.pas


2-1194953917
Uno
2007-11-13 14:38
2007.12.09
Неудается переписка


15-1194440114
Polevi
2007-11-07 15:55
2007.12.09
Тормозит компьютер


15-1194723363
Dib@zol
2007-11-10 22:36
2007.12.09
Количество символов в DWORD-переменной


15-1194461730
@!!ex
2007-11-07 21:55
2007.12.09
Минимальная установка Windows XP