Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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);
    }
    }


Этот код должен учитывать толщину линии и размеры указателя, чтобы правильно расположить прямоугольник в графике Гантта. Попробуйте использовать этот код в своем проекте и посмотрите, решает ли он вашу проблему.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)