Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.84.18.52] |
|
Сообщ.
#1
,
|
|
|
Нужно самому отрисовать прямоугольники в графике Гантта. Для этого пишу свой класс от TGanttSeries, в котором есть функция отрисовки DrawValue(int ValueIndex)(она protected).
Проблема в определении прямоугольника, в котором рисую. Делаю так: void __fastcall TMуGanttSeries::DrawValue(int ValueIndex) { if (isMy) { int yT; TRect rc; rc.Left = ParentChart->BottomAxis->CalcPosValue(StartValues->Value[ValueIndex]); rc.Right = ParentChart->BottomAxis->CalcPosValue(EndValues->Value[ValueIndex]); yT = ParentChart->LeftAxis->CalcYPosValue(YValues->Value[ValueIndex]); rc.Top = yT - Pointer->VertSize; rc.Bottom = yT + Pointer->VertSize; ... ParentChart->Canvas->ReferenceCanvas->Brush->Color = SeriesColor; // для примера ParentChart->Canvas->ReferenceCanvas->FillRect(rc); // для примера } else TGanttSeries::DrawValue(ValueIndex); } Всё похоже на стандартную отрисовку TGanttSeries::DrawValue(ValueIndex), но не всегда совпадают по одному пикселу по горизонтали. Не смог найти исходник функции DrawValue, чтобы увидеть, как они рисуют. Т.е. мне нужно узнать точные координаты прямоугольника для закраски. Может, кто-то поможет или даст ссылку на исходник этой функции? Спасибо. |
Сообщ.
#2
,
|
|
|
Проблема, вероятно, в том, что при расчете позиции прямоугольника вы используете только значения осей X и Y, но не учитываете толщину линии. Для решения этой проблемы вам нужно добавить толщину линии при расчете позиции прямоугольника.
Ниже приведен пример функции, которая рассчитывает координаты прямоугольника для отображения значения в графике Гантта. Функция учитывает толщину линии и размеры указателя. CollapsedWrap disabledLine numbers off void __fastcall TMуGanttSeries::DrawValue(int ValueIndex) { if (isMy) { int yT; TRect rc; int thickness = ParentChart->Canvas->Pen->Width; int pointerSize = Pointer->VertSize; rc.Left = ParentChart->BottomAxis->CalcPosValue(StartValues->Value[ValueIndex]) - thickness / 2; rc.Right = ParentChart->BottomAxis->CalcPosValue(EndValues->Value[ValueIndex]) + thickness / 2; yT = ParentChart->LeftAxis->CalcYPosValue(YValues->Value[ValueIndex]); rc.Top = yT - pointerSize - thickness / 2; rc.Bottom = yT + pointerSize + thickness / 2; // Отрисовка прямоугольника ParentChart->Canvas->ReferenceCanvas->Brush->Color = SeriesColor; ParentChart->Canvas->ReferenceCanvas->FillRect(rc); } else { TGanttSeries::DrawValue(ValueIndex); } } Этот код должен учитывать толщину линии и размеры указателя, чтобы правильно расположить прямоугольник в графике Гантта. Попробуйте использовать этот код в своем проекте и посмотрите, решает ли он вашу проблему. |