Delphi VirtualTreeview.OnAfterItemPaint проблема при прокрутке? - PullRequest
1 голос
/ 04 октября 2009

У меня возникают проблемы при рисовании с использованием события 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

Ответы [ 2 ]

1 голос
/ 04 октября 2009

Трудно сказать, чего вы хотите достичь, но, видя, что у вас длинный текст, охватывающий несколько столбцов, я не уверен, что вы используете правильное событие - обычно вы хотите, чтобы текст был обрезан, если он слишком длинный для столбца .

В любом случае, лучше всего прочитать раздел 5.2 «Циклы и этапы рисования» в файле документации VirtualTreeView.pdf и найти подходящее событие, которое будет использоваться для рисования. Для OnAfterItemPaint говорится:

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

так что я думаю, это, вероятно, , а не тот, который вы хотите использовать.

Edit:

ОК, если вы собираетесь объединить ячейки, вам нужно только удалить добавление VT1.OffsetX (и вместо него добавить VT1.TextMargin), чтобы получить правильное поведение. Это предполагает, конечно, что вы хотите начать вывод текста в первом (индекс 0) столбце, в противном случае вам придется вычислять горизонтальную текстовую позицию по ширине столбца.

Но из описания этапов рисования я все же предпочел бы использовать событие BeforeItemPaint и установить для параметра CustomDraw var значение True, чтобы пропустить любое рисование по умолчанию.

0 голосов
/ 05 октября 2009

Вы пробовали это:

TreeOptions.AutoOptions := TreeOptions.AutoOptions + [toAutoSpanColumns];

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

...