На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> TChart, TGanttSeries: как самому отрисовать серию , win7, XE7
    Нужно самому отрисовать прямоугольники в графике Гантта. Для этого пишу свой класс от TGanttSeries, в котором есть функция отрисовки DrawValue(int ValueIndex)(она protected).
    Проблема в определении прямоугольника, в котором рисую. Делаю так:
    ExpandedWrap disabled
      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, чтобы увидеть, как они рисуют. Т.е. мне нужно узнать точные координаты прямоугольника для закраски.

    Может, кто-то поможет или даст ссылку на исходник этой функции?
    Спасибо.
    Сообщение отредактировано: vlad2 -
      Проблема, вероятно, в том, что при расчете позиции прямоугольника вы используете только значения осей X и Y, но не учитываете толщину линии. Для решения этой проблемы вам нужно добавить толщину линии при расчете позиции прямоугольника.

      Ниже приведен пример функции, которая рассчитывает координаты прямоугольника для отображения значения в графике Гантта. Функция учитывает толщину линии и размеры указателя.
      ExpandedWrap disabled
        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);
        }
        }


      Этот код должен учитывать толщину линии и размеры указателя, чтобы правильно расположить прямоугольник в графике Гантта. Попробуйте использовать этот код в своем проекте и посмотрите, решает ли он вашу проблему.
      Сообщение отредактировано: MaIron -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0233 ]   [ 16 queries used ]   [ Generated: 19.04.24, 22:45 GMT ]