Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > TChart, TGanttSeries: как самому отрисовать серию |
Автор: vlad2 07.12.21, 16:31 |
Нужно самому отрисовать прямоугольники в графике Гантта. Для этого пишу свой класс от TGanttSeries, в котором есть функция отрисовки DrawValue(int ValueIndex)(она protected). Проблема в определении прямоугольника, в котором рисую. Делаю так: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 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, чтобы увидеть, как они рисуют. Т.е. мне нужно узнать точные координаты прямоугольника для закраски. Может, кто-то поможет или даст ссылку на исходник этой функции? Спасибо. |
Автор: MaIron 30.03.23, 20:12 |
Проблема, вероятно, в том, что при расчете позиции прямоугольника вы используете только значения осей X и Y, но не учитываете толщину линии. Для решения этой проблемы вам нужно добавить толщину линии при расчете позиции прямоугольника. Ниже приведен пример функции, которая рассчитывает координаты прямоугольника для отображения значения в графике Гантта. Функция учитывает толщину линии и размеры указателя. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> 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); } } Этот код должен учитывать толщину линии и размеры указателя, чтобы правильно расположить прямоугольник в графике Гантта. Попробуйте использовать этот код в своем проекте и посмотрите, решает ли он вашу проблему. |