帆布很酷! - 页 73

 
Vitaliy Kuznetsov #:

请问是否有将编辑框转换为画布的现成代码。

我正在制作一个橡胶面板,需要这样一个元素。当您点击它时,您需要输入和删除数字,并看到一个闪烁的光标。

如果没有,我将在点击时进行正常的替换。

有人这样做了,但不是图形问题,而是输入问题 - MetaTrader "拖动/处理 "了常规按钮(Enter/Tab)和一般的按键/重按/释放。

使用 DLL 并嵌入 Windows 控制窗口或记事本.exe 会更容易。

虽然因为信息匮乏(如今低层次的东西很难找到,而且数量很少)而纠结了几天,但最终代码数量会减少两个数量级,而且运行效果会更好。

 
Vitaliy Kuznetsov #:

请问是否有将编辑框转换为画布的现成代码。

...

EasyAndFastGUI - 用于创建图形界面的库 >>>

参见TextBox.mqh 文件

EasyAndFastGUI - библиотека для создания графических интерфейсов
EasyAndFastGUI - библиотека для создания графических интерфейсов
  • www.mql5.com
Библиотека EasyAndFastGUI дает возможность создавать графические интерфейсы для своих MQL-программ.
 
谢谢大家,我会尝试不同的方案
 
Maxim Kuznetsov #:

有人做了,但不是图形问题,而是输入问题 - MetaTrader "拖动/处理 "了常规按钮(回车/Tab)和一般的按键/重按/释放。

使用 DLL 并嵌入 Windows 控制窗口或 Notepad.exe 会更容易。

虽然因为信息匮乏(如今低层次的东西很难找到,而且数量很少)而纠结了几天,但最终代码数量会减少两个数量级,而且运行效果会更好。

顺便说一下 "zambed "和记忆不同的实验:窗口是嵌入式的,但在重绘和输入方面存在问题。它根本无法使用,我在 "可能有效的事实 "上停了下来。

但这并不奇怪--EA 在一个轨道上运行,图表的图形用户界面在另一个轨道上运行,而且那里显然也有 不同的东西
有必要以某种方式解释 Windows,以便发送所有必要的信息并正确处理渲染。当有一个控件(就 Win 而言,它毕竟是一个窗口)将所有内容都放在另一个轨道上时,这就不是一个典型的图形用户界面设计了。

有必要给专家进程设置一些(什么?)标志(从操作系统的角度看,它并不像看起来那样是一个图形用户界面,它的某些部分并没有飞到它)和/或调用 AttachThreadInput。

如果这个问题得到解决,对于那些不怕 DLL 的人来说,前景将是光明的:

- 可以使用 Gtk/Qt/Lazarus,使用它们的设计器和非常好的图形,进行 "图表内部对话"(顶层对话已经完成,但并不总是很方便,用户仍然要与图表一起工作)。

- 可以在 MDI 中制作自己的 "标签",从 "在图表中绘制窗口 "到 "在 MT 中制作标签 "只需半步。各种板块/板块将无需打开新图表

是的,在黑客层面:-)

 
Vitaliy Kuznetsov #:

请问是否有将编辑框转换为画布的现成代码。

我正在制作一个橡胶面板,需要这样一个元素。当您点击它时,您需要输入和删除数字,并看到一个闪烁的光标。

如果没有,我将在点击时进行正常的替换。

此类 EditCtrl(基本)的示例代码

//+------------------------------------------------------------------+
//|                                                     EditCtrl.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Canvas/Canvas.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CControl : protected CCanvas
  {
public:

   bool              Create(int x,int y,int w,int h)
     {
      if(!CCanvas::CreateBitmapLabel("TEST_EDIT",x,y,w,h,COLOR_FORMAT_ARGB_NORMALIZE))
         return(false);
      if(!OnCreate())
         return(false);

      Update();
      return(true);
     }

   void              TimerSet(uint msec)
     {
      if(msec)
         EventSetMillisecondTimer(msec);
      else
         EventKillTimer();
     }

   void              Update(void)
     {
      OnDraw(this);
      CCanvas::Update();
     }

   virtual bool      OnCreate(void) { return(true); }
   virtual void      OnKeyDown(int key,uint flags) { }
   virtual void      OnTimer(void) { }
   virtual void      OnDraw(CCanvas &canvas) { }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CEditCtrl : public CControl
  {
protected:
   string            m_text;
   uint              m_cursor_pos;
   bool              m_cursor_visible;

public:
   virtual bool      OnCreate(void)
     {
      m_cursor_pos    =0;
      m_cursor_visible=true;
      m_text          ="";
      TimerSet(500);
      return(true);
     }

   virtual void      OnKeyDown(int key,uint flags)
     {
      short code;

      switch(key)
        {
         case 35: // END
            if(m_cursor_pos==m_text.Length())
               return;
            m_cursor_pos=m_text.Length();
            break;
         case 36: // HOME
            if(m_cursor_pos==0)
               return;
            m_cursor_pos=0;
            break;
         case 37: // LEFT
            if(m_cursor_pos==0)
               return;
            m_cursor_pos--;
            break;
         case 39: // RIGHT
            if(m_cursor_pos>=m_text.Length())
               return;
            m_cursor_pos++;
            break;
         default:
            if((code=TranslateKey(key))==-1)
               return;

            if(code<32)
              {
               if(code==8 && m_cursor_pos)
                 {
                  m_text=m_text.Substr(0,m_cursor_pos-1) + m_text.Substr(m_cursor_pos,-1);

                  if(--m_cursor_pos>m_text.Length())
                     m_cursor_pos=m_text.Length();
                     
                  break;
                 }

               return;
              }

            if(m_cursor_pos!=m_text.Length())
               m_text = m_text.Substr(0,m_cursor_pos) + "\xFFFF" + m_text.Substr(m_cursor_pos,m_text.Length());

            m_text.SetChar(m_cursor_pos,code);
            m_cursor_pos++;
            break;
        }

      Update();
     }

   virtual void      OnTimer(void)
     {
      m_cursor_visible=!m_cursor_visible;
      Update();
     }

   virtual void      OnDraw(CCanvas &canvas)
     {
      CCanvas::Erase(ARGB(255,255,255,255));

      if(m_text.Length())
         canvas.TextOut(0,0,m_text,ARGB(255,0,0,0));

      if(m_cursor_visible)
        {
         int x=0,y;

         if(m_cursor_pos)
            canvas.TextSize(m_text.Substr(0,m_cursor_pos),x,y);

         canvas.FillRectangle(x,0,x,canvas.Height(),ARGB(255,0,0,0));
        }
     }
  };

CEditCtrl ExtEditCtrl;
CControl *ExtInputFocus=&ExtEditCtrl;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   ExtEditCtrl.Create(100,100,200,20);

   ChartSetInteger(0,CHART_QUICK_NAVIGATION,false);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer(void)
  {
   ExtInputFocus.OnTimer();
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_KEYDOWN)
      ExtInputFocus.OnKeyDown((int)lparam,(uint)sparam);
  }
//+------------------------------------------------------------------+
 
Ilyas #:

此类 EditCtrl(基本)的示例代码

谢谢。我稍后会在 MT5 上试用。

 
Ilyas #:

此类 EditCtrl(基本)的示例代码

感谢 Ilyas 提供的高质量代码示例教程
 
Ilyas #:

此类 EditCtrl(基本)的示例代码

有什么方法可以禁用退格键,从而不删除对象?

 
Aleksei Beliakov #:

有没有办法禁用退格键,从而不删除对象?

int OnInit()
  {
   ChartSetInteger(0,CHART_EVENT_OBJECT_CREATE,true);   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_CREATE)
     {
      ObjectSetInteger(0,sparam,OBJPROP_HIDDEN,true);
      ChartRedraw();
      Print(sparam);
     }
  }
 
Ilyas #:
即使我设置了这个属性,对象也会被退格删除,也许是因为它被选中了?
如果创建时间较短,有没有办法将一个对象放在另一个对象的上面?
例如,我创建了一个位图标签对象,然后又创建了其他对象,那么位图标签就会位于在它之后创建的对象之下。
问题:除了删除并重新创建之外,有什么方法可以将位图标签放到在它之后创建的对象之上?