Delphi VirtualTreeView.Проблема с OnAfterItemPaint при прокрутке?

StackOverflow https://stackoverflow.com/questions/1516082

  •  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];

Он в значительной степени делает то, что вам нужно.Единственная проблема может заключаться в том, что вы не можете указать, для каких столбцов он включен.Вероятно, вы можете обойти это ограничение, установив в качестве текста ячейки пробел для столбцов, которые вы не хотите охватывать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top