帆布很酷! - 页 27

 
Aлександр Антошкин:
双头鹰以不同的形状、颜色和版本出现在我们的国徽上已经有五个多世纪了--从伊凡三世时期的莫斯科国家到1918年,作为基因突变的结果.....。
你想在彼得身上纠正的是什么呢?

我不明白这个逻辑。你在哪里看到我想纠正某人的东西?

 
Nikolai Semko:

我不明白这个逻辑。你在哪里看到我想从别人那里纠正什么?

这是一种微妙的嘲弄。暗示我是基因突变的一个不可救药的后果)。我看了作者的其他帖子,认为他自己是我们论坛上的一个实验性人工智能。))

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

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

蜱虫是这样呈现的吗?

 
fxsaber:

我的意思是,刻度线应该以条形 呈现--比如说,每条5秒。

 

你好!

是否可以使用Canvas来创建面板?(CAppDialog)。

直接使用 Add() ,显然不能将 CCanvas 对象添加到面板中。

也许有一个变通办法,例如先创建一个资源,然后,把它当作一个更简单的对象,你可以把它绑定到CAppDialog上?

但我甚至不确定该用什么功能来尝试玩这样的把戏。

不管怎么说,帮助!

这条线上有这么多好东西,在这种背景下,我的任务似乎很简单!"。

 
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;
 }
}



但由于面板是一个对象的集合,只需在这个集合中再添加一个对象。

所以,这样一来,kanvas就只在面板坐标的一个地方(本例中的DrawCanvas函数)绘制,我不需要担心把它附加到面板上并重新绘制。

 
   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 , тогда зачем их присваивать ещё раз
 
Aleksei Beliakov:

是的,谢谢你,阿列克谢。慢下来了 ))
纠正了。

 
Nikolai Semko:

我担心这将不会起作用。
因为CAppDialog是使用OBJ_RECTANGLE对象绘制的,而CCanvas是OBJ_BITMAP_LABEL对象,没有办法将它们合并。

谢谢你!这个变体看起来相当逼真!

是否可以扩展CAppDialog并在其中包括OBJ_BITMAP_LABEL

 
Evgeny Potapov:

谢谢你!这个变体看起来相当逼真!

是否可以扩展CAppDialog并在其中包括OBJ_BITMAP_LABEL

当然这是有可能的,如果你有愿望和时间。