График на Панель

 
Всем привет! :)

Может кто-нибудь подсказать как, например, вот этот график

//+------------------------------------------------------------------+
//| График                                                           |
//+------------------------------------------------------------------+
void OnGrafik()
  {
   double x[] = { -100, -40, -10, 20, 30, 40, 50, 60, 70, 80, 120 };
   double y[] = { -5, 4, -10, 23, 17, 18, -9, 13, 17, 4, 9 };
   CGraphic graphic;
   graphic..Create(0,"G",0,30,30,780,380);
//--- plot curve
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
   curve.LinesSmooth(true);
   curve.LinesStyle(STYLE_DOT);
   curve.LinesEndStyle(LINE_END_ROUND);
   curve.LinesWidth(10);
   graphic.CurvePlotAll();
   graphic.Update();
  }
поместить на стандартную панель (используется панель на основе класса CPanel). 

Вроде бы и не сложно всё, но что-то запутался :)

P.S. Пожалуйста, ссылки на 
EasyAndFastGUI не предлагать.
 
Создаёте картинку размером с график, у графика берёте имя ресурса. И уже саму картинку добавляете на панель.
CPicture    m_picture;
m_picture.Create(0,name+"_CHART_LINE",0,45,50,500,300);
m_picture.BmpName(m_graph.ResourceName());
CDialog::Add(m_picture);
 
Alexey Valeev:
Создаёте картинку размером с график, у графика берёте имя ресурса. И уже саму картинку добавляете на панель.
Привет! Спасибо. Сам бы точно, скорее всего, не сообразил. Не тот опыт :).

Вот код, который отображает График:

//+------------------------------------------------------------------+ 
//| Создать объект График                                            | 
//+------------------------------------------------------------------+ 
bool CControlsDialog::CreatePicture(void) 
  {
//--- coordinates
   int x1=отступ_слева+50;
   int y1=отступ_сверху+300;
   int x2=x1+500;
   int y2=y1+300;
//---
   double x[] = { -100, -40, -10, 20, 30, 40, 50, 60, 70, 80, 120 };
   double y[] = { -5, 4, -10, 23, 17, 18, -9, 13, 17, 4, 9 };

   m_graph.Create(m_chart_id,m_name+"_Graph",m_subwin,x1,y1,x2,y2);
//--- plot curve
   CCurve *curve=m_graph.CurveAdd(x,y,CURVE_LINES);
   curve.LinesSmooth(true);
   curve.LinesStyle(STYLE_DOT);
   curve.LinesEndStyle(LINE_END_ROUND);
   curve.LinesWidth(10);
   m_graph.CurvePlotAll();
   m_graph.Update();
   
//--- create 
   if(!m_picture.Create(m_chart_id,m_name+"_CHART_LINE",m_subwin,x1,y1,x2,y2)) 
      return(false); 
      
//--- установим имя bmp-файлов для отображения элемента управления CPicture 
   //m_picture.BmpName("\\Images\\euro.bmp");
   
   m_picture.BmpName(m_graph.ResourceName());
   //m_picture.BmpName(m_graph.ChartObjectName());
   
   //Print(m_graph.ResourceName(),"   ",m_graph.ChartObjectName());
  
   if(!Add(m_picture))
      return(false); 
//--- succeed 
   return(true); 
  } 
Вроде бы всё правильно. График отображается и по сути принадлежит Панели. Почему тогда при её перемещении он живёт своей жизнью и не перемещается вместе с другими объектами, расположенными на ней. Логика размещения объектов, по сути, не изменилась. Можете разъяснить?
 
FoxNorth:
Вроде бы всё правильно. График отображается и по сути принадлежит Панели. Почему тогда при её перемещении он живёт своей жизнью и не перемещается вместе с другими объектами, расположенными на ней. Логика размещения объектов, по сути, не изменилась. Можете разъяснить?

Не видя всего кода, могу лишь предполагать что график не добавляется на панель, добавьте вот тут вывод сообщения.

if(!Add(m_picture))
{
   Print("Error: Add picture");
   return(false);
}

И вот этот момент смущает

   int x1=отступ_слева+50;
   int y1=отступ_сверху+300;
   int x2=x1+500;
   int y2=y1+300;

Тут вы отступ задаёте уже от границ самой панели, картинка с такими отступами точно влезает туда?

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

Вот что у меня получилось, после добавления картинки на панель, удаляем с чарта ранее созданную картинку графика. Всё работает.

//+------------------------------------------------------------------+ 
//| Создать объект График                                            | 
//+------------------------------------------------------------------+ 
bool CDialogStatistic::CreatePicture(void) 
{
//--- coordinates
//---
   int x,y,width,height;
//---
   width=650; height=550; x=350; y=80;
   if(!CAppDialog::Create(0,"BEST_PANEL",m_subwin,x,y,x+width,y+height))
      return(false);
//---
   double arr_x[] = { -100, -40, -10, 20, 30, 40, 50, 60, 70, 80, 120 };
   double arr_y[] = { -5, 4, -10, 23, 17, 18, -9, 13, 17, 4, 9 };

   
   width=600; height=500; x=0; y=0;
   m_graph.Create(m_chart_id,m_name+"_Graph",m_subwin,x,y,x+width,y+height);

//--- plot curve

   CCurve *curve=m_graph.CurveAdd(arr_x,arr_y,CURVE_LINES);
   curve.LinesSmooth(true);
   curve.LinesStyle(STYLE_DOT);
   curve.LinesEndStyle(LINE_END_ROUND);
   curve.LinesWidth(10);
   m_graph.CurvePlotAll();
   m_graph.Update();
   
//--- create 
   width=400; height=300; x=20; y=10;
   if(!m_picture.Create(m_chart_id,m_name+"_CHART_LINE",m_subwin,x,y,x+width,y+height))
      return(false); 
   
   m_picture.BmpName(m_graph.ResourceName());
   
   if(!Add(m_picture))
   {
      Print("ERROR Add Picture");
      return(false);
   }
   
   ObjectDelete(m_chart_id,m_name+"_Graph");
   ChartRedraw();
   
//--- succeed 
   return(true); 
} 
Файлы:
DialogTest.zip  328 kb
 
Alexey Valeev:

Не видя всего кода, могу лишь предполагать что график не добавляется на панель, добавьте вот тут вывод сообщения.

И вот этот момент смущает

Тут вы отступ задаёте уже от границ самой панели, картинка с такими отступами точно влезает туда?

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

Вот что у меня получилось, после добавления картинки на панель, удаляем с чарта ранее созданную картинку графика. Всё работает.

Восхитительно! Ну, вот как можно было догадаться:

   if(!Add(m_picture))
   {
      Print("ERROR Add Picture");
      return(false);
   }
   
   ObjectDelete(m_chart_id,m_name+"_Graph");
   ChartRedraw();
Вставил эту часть кода. "Выровнял", так сказать, в соответствии с вашими замечаниями Объект График относительно границ Панели. Всё заработало. Ну, вот как так. Очень интересно. 

Огромное спасибо! Благодарю за помощь. Буду рад, если тоже смогу оказаться чем - нибудь полезен. Удачи! :)
Причина обращения: