캔버스 멋지다! - 페이지 28

 
Evgeny Potapov :

고맙습니다! 이것은 상당히 사실적으로 보입니다!

질문해주셔서 감사합니다. 답변하면서 제가 몰랐던 아주 중요한 사실 하나를 깨달았습니다.
누군가가 이것에 대해 알고 있다면 놀랐을 것입니다.

ObjectSetInteger 를 사용하여 캔버스 또는 해당 위치의 크기를 조정하면 다시 그릴 필요가 없습니다.

  • 생성된 캔버스의 크기를 줄인 후 이 크기를 반환하더라도 캔버스 데이터는 원래 그려진 그대로 유지됩니다.
  • 생성된 캔버스의 크기를 늘리면 데이터가 손실되지만 원래 크기를 반환하면 다시 나타납니다.
  • 캔버스의 크기를 조정하거나 위치를 변경할 때 Update() 또는 ChartRedraw()를 수행할 필요조차 없습니다. 새 눈금 또는 창 변경이 도착하면 업데이트됩니다.

이 표시기가 이를 보여줍니다. 캔버스는 한 번만 형성됩니다. 그러나 동시에 값의 배열이 보존되는 동안 크기와 위치를 변경할 수 있습니다. 화면에서 마우스를 움직이기만 하면 됩니다.

 #property indicator_chart_window

#define protected public    // увы, это необходимо, чтобы расширить наши возможности 
#include <Canvas\Canvas.mqh> 
#undef protected
CCanvas C;
int OnInit ()
  {
   if (!C.CreateBitmapLabel( 0 , 0 , "_Canvas" , 100 , 100 , 600 , 400 , COLOR_FORMAT_ARGB_NORMALIZE ))
       Print ( "Error creating canvas: " , GetLastError ());
   DrawCanvas( 600 , 400 );
   ChartSetInteger ( 0 , CHART_EVENT_MOUSE_MOVE , true );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   C.Destroy();
  }
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double & price[])       
  {
     return prev_calculated;               
  }

void OnChartEvent ( const int id,          
                   const long & lparam,   
                   const double & dparam, 
                   const string & sparam) 
  {
   if (id== CHARTEVENT_MOUSE_MOVE )  DrawCanvas(( int )lparam,( int )dparam);
  }
//+------------------------------------------------------------------+
void DrawCanvas( int x, int y)
{
 static bool first= true ;
 //Comment(string(x)+"   " +string(y));
 ObjectSetInteger (C.m_chart_id,C.m_objname, OBJPROP_XDISTANCE ,x/ 5 );
 ObjectSetInteger (C.m_chart_id,C.m_objname, OBJPROP_YDISTANCE ,y/ 5 );
 ObjectSetInteger (C.m_chart_id,C.m_objname, OBJPROP_XSIZE ,x);
 ObjectSetInteger (C.m_chart_id,C.m_objname, OBJPROP_YSIZE ,y);  
 if (first) // канвас формируется только один раз
 {
   C.Erase();
   C.FillCircle( 100 , 100 , 70 , ColorToARGB ( clrViolet , 200 ));
   C.FillCircle( 300 , 200 , 100 , ColorToARGB ( clrLightBlue , 100 ));
   C.Rectangle( 140 , 50 , 250 , 150 , ColorToARGB ( clrAqua ));
   C.Update(); 
   first= false ;
 }
 ChartRedraw (); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
파일:
 
동영상으로 저장할 수 있나요?
 
Andrey Dik :
동영상으로 저장할 수 있나요?
~할 수 있다
 
Nikolai Semko :
~할 수 있다

시원한! 나는 백만 개의 이미지를 만든 다음 일종의 비디오 편집기에서 비디오로 조합하지 않기를 바랍니다.))

실례가 안된다면 자세히 설명해주세요

 
Andrey Dik :

시원한! 나는 백만 개의 이미지를 만든 다음 일종의 비디오 편집기에서 비디오로 조합하지 않기를 바랍니다.))

실례가 안된다면 자세히 설명해주세요

물론 아닙니다.
어렵게 만드세요.

 
Nikolai Semko :

물론 아닙니다.
어렵게 만드세요.

코드는 필요하지 않습니다. 방법을 알려주세요.

 
Nikolai Semko :
  • 캔버스의 크기를 조정하거나 위치를 변경할 때 Update() 또는 ChartRedraw()를 수행할 필요조차 없습니다 . 새 틱 또는 창 변경이 도착하면 업데이트됩니다.

글쎄, 이러한 이벤트에 따르면 터미널 자체가 ChartRedraw();)

 
Andrey Dik :

코드가 필요하지 않습니다. 방법을 알려주세요.

촬영하려는 동영상의 종류에 따라 다양한 옵션이 있습니다. 마우스 포인터, 표시기, 개체, GUI가 있는 창의 실시간 창에서는 어떻게 됩니까? 아니면 뭔가 다른가요?

 
그리고 이 칩의 진정한 유용성은 무엇입니까? 거래에 도움이 될 가격 차트의 패턴을 찾는 데 도움이 되셨나요?
 
Andrey Khatimlianskii :

글쎄, 이러한 이벤트에 따르면 터미널 자체가 ChartRedraw();)

이것은 이해할 수 있습니다. 그냥 깊게 가지 않았습니다.
ChartRedraw() 중에 캔버스 객체를 다시 그리는 경우 다시 그리기가 발생하지 않고 Update() 중에만 발생하기 때문에 이 점에 중점을 두었습니다. 그리고 ObjectSetInteger를 사용 하여 캔버스 개체를 다시 그리는 경우 ChartRedraw()를 강제 실행하거나 Chatr가 변경되거나 새 틱이 도착할 때까지 기다리면 ChartRedraw()가 발생합니다.