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

 
Vitaliy Kuznetsov #:

캔버스에 편집 상자를 사용할 수 있는 코드가 준비되어 있는지 알려주세요.

고무 패널을 만들고 있는데 그런 요소가 필요합니다. 그것을 클릭하면 숫자를 입력하고 삭제해야하며 깜박이는 커서가 표시됩니다.

그렇지 않은 경우 클릭 할 때 정상적인 대체물을 만들 것입니다.

누군가가 해냈고 그래픽이 아니라 입력에 문제가있었습니다-MetaTrader는 일반적으로 일반적인 버튼 (Enter / Tab)과 키 누르기 / 반복 / 릴리스를 "드래그 / 처리"했습니다.

DLL을 가져와 Windows 제어창 또는 메모장.exe를 임베드하는 것이 더 쉽습니다.

정보 부족에 대해 며칠 동안 친구를 사귀었지만 (요즘에는 낮은 수준의 것을 찾기가 어렵고 거의 없습니다) 결국 코드는 두 배로 줄어들고 더 잘 작동 할 것입니다.

 
Vitaliy Kuznetsov #:

캔버스에 편집 상자를 사용할 수 있는 코드가 준비되어 있는지 알려주세요.

...

EasyAndFastGUI - 그래픽 인터페이스 생성을 위한 라이브러리 >>>

TextBox.mqh 파일 참조

EasyAndFastGUI - библиотека для создания графических интерфейсов
EasyAndFastGUI - библиотека для создания графических интерфейсов
  • www.mql5.com
Библиотека EasyAndFastGUI дает возможность создавать графические интерфейсы для своих MQL-программ.
 
감사합니다, 다른 옵션을 시도해 보겠습니다.
 
Maxim Kuznetsov #:

누군가가 그래픽이 아닌 입력에 문제가 있었는데, MetaTrader가 일반적인 버튼(Enter/Tab)과 키 누르기/반복/해제 버튼을 "드래그/처리"하는 것이었습니다.

DLL을 가져와서 Windows 제어창 또는 메모장.exe를 임베드하는 것이 더 쉽습니다.

정보 부족에 대해 며칠 동안 친구를 사귀었지만 (요즘에는 낮은 수준의 것을 찾기가 어렵고 거의 없습니다) 결국에는 코드가 두 배로 줄어들고 더 잘 작동합니다.

그건 그렇고, "잠 베드"와 다른 실험을 기억하는 것에 대해 : 창이 내장되어 있지만 다시 그리기 및 입력에 문제가 있습니다. 그것은 단지 사용할 수 없으며, 나는 "잠재적으로 작동한다는 사실"에서 멈췄습니다.

EA는 한 트랙에서 작동하고 차트의 GUI는 다른 트랙에서 작동하며 분명히 다른 것도 있습니다.
필요한 모든 메시지가 전송되고 렌더링이 올바르게 처리되도록 Windows를 어떻게 든 설명해야합니다. 다른 트랙에 모든 것이 있는 컨트롤(승리의 관점에서 보면 결국 창입니다)이 있을 때 일반적인 GUI 디자인은 아닙니다.

물론, 나는 여기서 약간의 막 다른 골목에 있습니다. Linux 관행은 호의적이지 않습니다. 전문가 프로세스에 일부 (무엇?) 플래그를 설정하거나 (OS 용어로 볼 때 GUI 트레드가 아니며 일부는 그냥 날아 가지 않습니다) AttachThreadInput을 가져와야합니다.

이러한 문제가 해결되면 DLL을 두려워하지 않는 사람들에게는 전망이 밝습니다:

- "차트 내부의 대화"를 위해 디자이너와 정말 좋은 그래픽과 함께 Gtk / Qt / 라자루스를 사용할 수 있습니다 (그리고 상위 수준은 완료되었지만 항상 편리한 것은 아니며 여전히 사용자가 차트로 작업합니다).

- 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 #:

이러한 편집 컨트롤의 샘플 코드(기본)

감사합니다. 조금 후에 MT5에서 시도해 보겠습니다.

 
Ilyas #:

이러한 편집 컨트롤의 샘플 코드(기본)

품질 코드에 대한 좋은 튜토리얼 예제를 제공해 주셔서 감사합니다.
 
Ilyas #:

이러한 편집 컨트롤의 샘플 코드(기본)

개체가 삭제되지 않도록 백스페이스를 비활성화할 수 있는 방법이 있나요?

 
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 #:
이 속성을 설정해도 개체가 백스페이스에 의해 삭제되는 것은 선택되어 있기 때문일까요?
생성 시간이 더 짧은 경우 객체를 다른 객체 위에 배치 할 수있는 방법이 있습니까?
예를 들어 비트 맵 레이블 객체를 만든 다음 다른 객체를 만들면 비트 맵 레이블이 그 다음에 생성 된 객체 아래에 있습니다.
질문 삭제하고 다시 생성하는 것 외에 비트맵 레이블을 그 뒤에 생성된 객체 위에 놓을 수 있는 방법이 있나요?