Форум: "Начинающим";
Текущий архив: 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