Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 595

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
У меня ListView в режиме vsReport, RowSelect:=true. Мне нужно в одной из колонок (в крайней справа) нарисовать картинку и написать текст. Юзаю событие OnCustomDrawSubItem. В нем всё рисую как надо, проверяю - в Windows 7 при выделении строки она нормально выделяется, а в XP почему-то и фокусная рамка и само выделение цветом заканчивается на предпоследнем столбце. То есть выглядит это как на картинках (в аттаче). Код отрисовки приведен ниже.
Есть конечно вариант при запуске проверять версию винды и если XP то самому дорисовывать выделение и фокусную рамку, однако интересует, почему так происходит, и как от этого избавиться.
Спасибо

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. {{code|delphi}}
  2. procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
  3. var r, pr: TRect;
  4. ratio: cardinal;
  5. psz: Int64;
  6. txt: string;
  7. begin
  8. if SubItem=3 then
  9. begin
  10. DefaultDraw:=false;
  11. SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
  12.  
  13. r:=Item.DisplayRect(drBounds);
  14. r.Left:=Sender.Column[0].Width + Sender.Column[1].Width + Sender.Column[2].Width;
  15. r.Right:=r.Left + Sender.Column[3].Width;
  16. Sender.Canvas.TextOut(r.Left + Sender.Canvas.TextWidth('1'), r.Top + 2, IntToStr(Percent) + '%');
  17.  
  18. pr.Left:=r.Left + sender.Canvas.TextWidth('100% ');
  19. pr.Right:=r.Right - sender.Canvas.TextWidth(' 9999.99 MB');
  20. pr.Top:=r.Top + 5 ;
  21. pr.Bottom:=r.Bottom - 5;
  22.  
  23. DrawProgress(Sender.Canvas, pr, Percent, clLime);
  24. Sender.Canvas.TextOut(pr.Right + Sender.Canvas.TextWidth('1'), r.Top + 2, SomeText);
  25. Exit;
  26. end;
  27.  
  28. Sender.Canvas.Font.Size := 1;
  29. Sender.Canvas.Font.Size := TListView(Sender).Font.Size;
  30. SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
  31. DefaultDraw := true;
  32. end;{{/code}}


Lumen Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Lumen (статус: Посетитель)
Вопрос отправлен: 22 августа 2011, 19:47
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 22 августа 2011, 21:41; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 19:52 [#1]:

Если GUI ведёт себя по-разному в разных версиях Windows, то это вопрос не сюда, а как раз, таки, в компанию Microsoft.

Увы и ах.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Lumen

Lumen (статус: Посетитель), 22 августа 2011, 19:58 [#2]:

В таком случае, как винде запретить рисовать фокусную рамку?
Я надеялся что кто-то уже с подобным сталкивался, и нашёл решение, но видимо придется проверять версию винды и если XP то самому дорисовывать синий квадратик выделения на итеме и фокусную рамку на весь итем.
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 20:07 [#3]:

Это не вариант. Выйдет какой-нить сервиспак и всё станет иначе. Ну, теоретически, конечно.

Но бесплатный совет я тебе дам: хочешь стабильности (относительной) - рисуй всё сам. На канвасе. Выкинь TListView нафиг. Этот способ очень гибкий, можно творить всё, что душе угодно. По себе знаю, я уже так делал.

Решать, конечно, тебе.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Lumen

Lumen (статус: Посетитель), 22 августа 2011, 20:42 [#4]:

Тот же эффект наблюдается и в семерке, но с отключенными темами (классический стиль). Как же с этим бороться?
min@y™

min@y™ (статус: Доктор наук), 22 августа 2011, 20:49 [#5]:

Цитата (Lumen):

Как же с этим бороться?

Понятия не имею.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 22 августа 2011, 20:52 [#6]:

Делал примерно такое же безобразие когда-то. Более или менее удовлетворительный результат получил через AdvancedCustomDrawSubItem. Параметр DefaultDraw вообще не торгал. Не знаю что за DrawProgress у тебя, но если он меняет цвета у канвы, важно восстанавливать их после себя.
"Digital Networked Knight"
Lumen

Lumen (статус: Посетитель), 22 августа 2011, 21:41 [#7]:

Дело не в DrawProgress. Можно посмотреть пример http://rouse.drkb.ru/tmp/lv.zip (правда для наглядности надо сделать размеры прямоугольника чуть поменьше чем прямоугольник сабитема.
    R := Item.DisplayRect(drSelectBounds);
    R.Left := Sender.Column[0].Width + 5;
    R.Right := R.Left + Sender.Column[1].Width - 5;
    R.Top:=R.Top + 5;
    R.Bottom:=R.Bottom - 5;
    DrawProgressBar(Sender.Canvas, R, Random(100));

7 сентября 2011, 15:56: Статус вопроса изменён на решённый (изменил автор вопроса — Lumen): Разобрался. Перенес отрисовку в событие OnAdvancedCustomDrawSubItem и рисую в случае если Stage = cdPostPaint.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.02 сек.