Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.047 c
2-1194847372
Layner
2007-11-12 09:02
2007.12.09
Запуск приложения от другого пользователя и выход(logout) из XP


2-1194901296
Vice____
2007-11-13 00:01
2007.12.09
TEdit>мой компонент


2-1194874601
Alex'
2007-11-12 16:36
2007.12.09
Как получить имя вызываемого метода?


2-1194959385
Kolan
2007-11-13 16:09
2007.12.09
Почему TEditCut работает для TSyncMemo, а TSearchFind нет?


15-1193990034
@!!ex
2007-11-02 10:53
2007.12.09
Как вытащить данные?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский