|
Вопрос # 5 595/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты!
У меня ListView в режиме vsReport, RowSelect:=true. Мне нужно в одной из колонок (в крайней справа) нарисовать картинку и написать текст. Юзаю событие OnCustomDrawSubItem. В нем всё рисую как надо, проверяю - в Windows 7 при выделении строки она нормально выделяется, а в XP почему-то и фокусная рамка и само выделение цветом заканчивается на предпоследнем столбце. То есть выглядит это как на картинках (в аттаче). Код отрисовки приведен ниже.
Есть конечно вариант при запуске проверять версию винды и если XP то самому дорисовывать выделение и фокусную рамку, однако интересует, почему так происходит, и как от этого избавиться.
Спасибо
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- {{code|delphi}}
- procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem:
Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
- var r, pr: TRect;
- ratio: cardinal;
- psz: Int64;
- txt: string;
- begin
- if SubItem=3 then
- begin
- DefaultDraw:=false;
- SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
-
- r:=Item.DisplayRect(drBounds);
- r.Left:=Sender.Column[0].Width + Sender.Column[1].Width + Sender.Column[2].Width;
- r.Right:=r.Left + Sender.Column[3].Width;
- Sender.Canvas.TextOut(r.Left + Sender.Canvas.TextWidth('1'), r.Top + 2, IntToStr(Percent) +
'%');
-
- pr.Left:=r.Left + sender.Canvas.TextWidth('100% ');
- pr.Right:=r.Right - sender.Canvas.TextWidth(' 9999.99 MB');
- pr.Top:=r.Top + 5 ;
- pr.Bottom:=r.Bottom - 5;
-
- DrawProgress(Sender.Canvas, pr, Percent, clLime);
- Sender.Canvas.TextOut(pr.Right + Sender.Canvas.TextWidth('1'), r.Top + 2, SomeText);
- Exit;
- end;
-
- Sender.Canvas.Font.Size := 1;
- Sender.Canvas.Font.Size := TListView(Sender).Font.Size;
- SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
- DefaultDraw := true;
- end;{{/code}}
 |
Вопрос задал: Lumen (статус: Посетитель)
Вопрос отправлен: 22 августа 2011, 19:47
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 22 августа 2011, 21:41; участников в обсуждении: 3.
|
min@y™ (статус: Доктор наук), 22 августа 2011, 19:52 [#1]:
Если GUI ведёт себя по-разному в разных версиях Windows, то это вопрос не сюда, а как раз, таки, в компанию Microsoft.
Увы и ах.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Lumen (статус: Посетитель), 22 августа 2011, 19:58 [#2]:
В таком случае, как винде запретить рисовать фокусную рамку?
Я надеялся что кто-то уже с подобным сталкивался, и нашёл решение, но видимо придется проверять версию винды и если XP то самому дорисовывать синий квадратик выделения на итеме и фокусную рамку на весь итем.
|
|
min@y™ (статус: Доктор наук), 22 августа 2011, 20:07 [#3]:
Это не вариант. Выйдет какой-нить сервиспак и всё станет иначе. Ну, теоретически, конечно.
Но бесплатный совет я тебе дам: хочешь стабильности (относительной) - рисуй всё сам. На канвасе. Выкинь TListView нафиг. Этот способ очень гибкий, можно творить всё, что душе угодно. По себе знаю, я уже так делал.
Решать, конечно, тебе.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Lumen (статус: Посетитель), 22 августа 2011, 20:42 [#4]:
Тот же эффект наблюдается и в семерке, но с отключенными темами (классический стиль). Как же с этим бороться?
|
|
min@y™ (статус: Доктор наук), 22 августа 2011, 20:49 [#5]:
Цитата (Lumen):
Как же с этим бороться?
Понятия не имею.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DNK (статус: Студент), 22 августа 2011, 20:52 [#6]:
Делал примерно такое же безобразие когда-то. Более или менее удовлетворительный результат получил через AdvancedCustomDrawSubItem. Параметр DefaultDraw вообще не торгал. Не знаю что за DrawProgress у тебя, но если он меняет цвета у канвы, важно восстанавливать их после себя.
"Digital Networked Knight"
|
|
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.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|