Delphi VirtualTreeView.Проблема с OnAfterItemPaint при прокрутке?
-
19-09-2019 - |
Вопрос
У меня возникают проблемы с рисованием с использованием OnAfterItemPaint Онаследующий элемент событие, когда выполняется горизонтальная прокрутка.
По сути, чего я хочу добиться, так это эффекта объединения выделенных ячеек, скажем, например, 1 текст для столбцов 1 и 2, другой текст для столбцов 3 и 4 и т.д...Пока что VT не поддерживает объединение столбцов, поэтому мне приходится рисовать его вручную.
Есть ли обходной путь или другое событие, которое я должен использовать вместо этого?
Используя:Delphi 7 + VirtualTreeView 4.8.5
Источник события:
begin
TargetCanvas.TextOut(ItemRect.Left+ VT1.OffsetX, ItemRect.Top,
'1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF');
end;
Перед прокруткой:
альтернативный текст http://a.imagehost.org/0869/screen1.gif
После прокрутки (прокрутите вправо, затем влево):
альтернативный текст http://a.imagehost.org/0645/screen2.gif
Решение
Трудно сказать, чего вы хотите достичь, но, видя, что у вас длинный текст, занимающий несколько столбцов, я не уверен, что вы используете правильное событие - обычно вы хотите, чтобы текст был усечен, если он слишком длинный для своего столбца.
В любом случае, лучше всего прочитать раздел 5.2 "Циклы и этапы рисования" в VirtualTreeView.pdf файл документации и найдите подходящее событие, которое будет использоваться для того, что вы хотите нарисовать.Для OnAfterItemPaint
в нем говорится:
Этап рисования после элемента используется для добавления специфичных для узла элементов, таких как фреймы и т.п. которые касаются всех столбцов этого узла и вызываются один раз для каждого узла.
так что я предполагаю, что это, вероятно, нет тот, который вы хотите использовать.
Редактировать:
Хорошо, если вы собираетесь объединить ячейки, вам нужно только удалить добавление VT1.OffsetX
(и добавить VT1.TextMargin
вместо этого), чтобы получить правильное поведение.Это предполагает, конечно, что вы хотите начать вывод текста в первом столбце (индекс 0), в противном случае вам придется вычислять горизонтальное положение текста исходя из ширины столбца.
Но, судя по описанию этапов покраски, я все же предпочел бы использовать BeforeItemPaint
событие и установите CustomDraw
параметр var для True
чтобы пропустить любое изображение по умолчанию.
Другие советы
Вы пробовали это:
TreeOptions.AutoOptions := TreeOptions.AutoOptions + [toAutoSpanColumns];
Он в значительной степени делает то, что вам нужно.Единственная проблема может заключаться в том, что вы не можете указать, для каких столбцов он включен.Вероятно, вы можете обойти это ограничение, установив в качестве текста ячейки пробел для столбцов, которые вы не хотите охватывать.