| 
| 
 | Вопрос # 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. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |