Canvas - это круто! - страница 27

Nikolai Semko
8273
Nikolai Semko  
Aлександр Антошкин:
Орел с двумя головами в разном виде, цвете и исполнении находился на нашем гербе свыше пяти веков - со времен Московского государства времен Ивана III и до 1918 года ,как следствии  генной мутации.....
Что же вы хотите исправить у Петра?

что-то логики не поймал. Где Вы увидели, что я что-то у кого-то хочу  исправить?

Реter Konow
10257
Реter Konow  
Nikolai Semko:

что-то логики не поймал. Где Вы увидели, что я что-то у кого-то хочу  исправить?

Это такой тонкий троллинг. Намек что я, - неисправимое следствие генной мутации.)) Почитал другие посты автора, и подумалось что он сам, - экспериментальный ИИ запущенный на нашем форуме. ))

https://www.mql5.com/ru/forum/221552/page1485#comment_12959767

От теории к практике
От теории к практике
  • 2019.08.23
  • www.mql5.com
Добрый вечер, уважаемые трейдеры! Решил было на какое-то время покинуть форум, и сразу как-то скучно стало:)))) А просто читать, увы - неинтересно...
Aleksey Vyazmikin
17791
Aleksey Vyazmikin  
fxsaber:

Я про то, что бы тики представить в виде баров - по 5 секунд допустим.

Evgeny Potapov
1953
Evgeny Potapov  

Здравствуйте!

А возможно использовать Canvas для создания панелей? (CAppDialog)

Напрямую, при помощи Add() объект CCanvas, очевидно, не добавить к панели.

Может быть существует обходной путь, например, в начале создать ресурс, а потом, рассматривая его как более простой объект, можно привязать к CAppDialog?

Но я не очень даже понимаю, какие функции использовать, чтобы попробовать провернуть такой трюк.

В общем, помогите!

В этой теме столько всего великолепного, что моя задачка кажется на этом фоне совсем простенькой!

Nikolai Semko
8273
Nikolai Semko  
Evgeny Potapov:

Здравствуйте!

А возможно использовать Canvas для создания панелей? (CAppDialog)

Напрямую, при помощи Add() объект CCanvas, очевидно, не добавить к панели.

Может быть существует обходной путь, например, в начале создать ресурс, а потом, рассматривая его как более простой объект, можно привязать к CAppDialog?

Но я не очень даже понимаю, какие функции использовать, чтобы попробовать провернуть такой трюк.

В общем, помогите!

В этой теме столько всего великолепного, что моя задачка кажется на этом фоне совсем простенькой!

Боюсь, что не получится.
Ибо CAppDialog рисуется на объектах OBJ_RECTANGLE, а CCanvas это объект OBJ_BITMAP_LABEL и их никак не скрестить.
Но можно канвас рисовать сверху окна панели и отслеживать изменения панели и одновременно перерисовывать канвас.

Например так:

// это эксперт
#define protected public  // увы, это необходимо, чтобы расширить наши возможности 
#include <Controls\Dialog.mqh>
#include <Canvas\Canvas.mqh> 
#undef protected
CAppDialog D;
CCanvas C;
int OnInit()
  {
   if(!D.Create(0,"AppWindow",0,100,100,400,300))
      return(INIT_FAILED);
   D.Run();
   if(!C.CreateBitmapLabel(D.m_chart_id,D.m_subwin,D.m_name+"_Canvas",D.m_rect.left,D.m_rect.top,D.m_rect.right-D.m_rect.left,D.m_rect.bottom-D.m_rect.top,COLOR_FORMAT_ARGB_NORMALIZE))
      Print("Error creating canvas: ",GetLastError());
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   D.Destroy(reason);
   C.Destroy();
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,          
                  const long& lparam,   
                  const double& dparam, 
                  const string& sparam) 
  {
   static int X=0, Y=0;
   D.ChartEvent(id,lparam,dparam,sparam);
   if (D.m_rect.left!=X || D.m_rect.top!=Y) 
   { DrawCanvas(); X=D.m_rect.left; Y=D.m_rect.top;}
  }
//+------------------------------------------------------------------+
void DrawCanvas()
{
 // изменяем канвас в соответсвии положения и размера панели
 static int w=0, h=0, tf=0;
 int x=D.m_rect.left;
 int y=D.m_rect.top;
 int width = D.m_rect.right-x;
 int height =D.m_rect.bottom-y;
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XDISTANCE,x);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YDISTANCE,y);
 if (w!=width) ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XSIZE,width);
 if (h!=height) ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YSIZE,height);
 
 if(w!=width || h!=height || tf!=_Period)
 {
   C.Erase();
// здесь формируем рисунок на панели
   C.FillCircle(50,20,30,ColorToARGB(clrViolet,200));
   C.FillCircle(100,100,50,ColorToARGB(clrLightBlue,100));
   C.Rectangle(200,50,250,150,ColorToARGB(clrAqua));
//----------------------------------
   C.Update(); 
   
   tf=_Period;
   w=width;
   h=height;
 }
}



но так как панель - это набор объектов, то просто добавиться к этому набору еще один. 

Так что вариант вполне рабочий и канвас рисуется только в одном месте( в данном случае функция DrawCanvas) в координатах панели и не надо заботиться о его привязки к панели и перерисовке.

Aleksei Beliakov
53882
Aleksei Beliakov  
   if (D.m_rect.left!=X || D.m_rect.top!=Y) DrawCanvas();
   else {X=D.m_rect.left; Y=D.m_rect.top;}
Else сработает только когда left=x и top=y , тогда зачем их присваивать ещё раз
Nikolai Semko
8273
Nikolai Semko  
Aleksei Beliakov:

Да, спасибо, Алексей. Тормознул ))
Поправил.

Evgeny Potapov
1953
Evgeny Potapov  
Nikolai Semko:

Боюсь, что не получится.
Ибо CAppDialog рисуется на объектах OBJ_RECTANGLE, а CCanvas это объект OBJ_BITMAP_LABEL и их никак не скрестить.

Спасибо! Этот вариант вполне реалистично выглядит!

А возможно расширить CAppDialog, и включить в него OBJ_BITMAP_LABEL?

Nikolai Semko
8273
Nikolai Semko  
Evgeny Potapov:

Спасибо! Этот вариант вполне реалистично выглядит!

А возможно расширить CAppDialog, и включить в него OBJ_BITMAP_LABEL?

Конечно можно, было бы желание и время.