キャンバスがカッコいい! - ページ 73

 
Vitaliy Kuznetsov #:

どなたか、エディットボックスをキャンバスに表示するためのコードがあれば教えてください。

私はラバーパネルを作っていて、そのような要素が必要なのです。それをクリックすると、数字を入力したり削除したりする必要があり、点滅するカーソルが表示されます。

もしなければ、クリックしたときに通常の置換をします。

MetaTraderは通常のボタン(Enter/Tab)やKeyPress/Repeate/Releaseを "ドラッグ/処理 "する。

それは、DLLを取り、Windowsのコントロールウィンドウ、またはNotepad.exeを埋め込む方が簡単です。

数日間、情報不足に悩まされましたが(低レベルのものは今時見つけるのが難しい、数が少ない)、最終的にはコードは2桁少なくなり、より良く動作するようになります。

 
Vitaliy Kuznetsov #:

どなたか、エディットボックスをキャンバスに表示するコードがあれば教えてください。

...

EasyAndFastGUI - グラフィカルインターフェイスを作成するためのライブラリ >>...

TextBox.mqh ファイルを参照

EasyAndFastGUI - библиотека для создания графических интерфейсов
EasyAndFastGUI - библиотека для создания графических интерфейсов
  • www.mql5.com
Библиотека EasyAndFastGUI дает возможность создавать графические интерфейсы для своих MQL-программ.
 
ありがとう、いろいろ試してみるよ。
 
Maxim Kuznetsov #:

MetaTraderは通常のボタン(Enter/Tab)やKeyPress/Repeate/Releaseを "ドラッグ/処理 "する。

DLLを使ってWindowsのコントロールウィンドウやNotepad.exeを埋め込む方が簡単です。

数日間、情報不足に悩まされましたが(低レベルのものは今時見つけるのが難しい、数が少ない)、最終的にはコードは2桁少なくなり、より良く動作するようになります。

ところで、「zambed」とさまざまな実験の記憶について:ウィンドウは埋め込まれているが、再描画と入力に問題がある。ただ使えないだけで、"動く可能性があるという事実 "で止まっている。


必要なメッセージがすべて送信され、レンダリングが正しく処理されるように、何らかの方法でウィンドウズを説明する必要がある。別のトラックにすべてを持つコントロール(winという点では、結局はウィンドウだ)がある場合、典型的なGUIデザインとは言えない。

もちろん、私はここで行き詰まりを感じている。Linuxのプラクティスは好ましくない。Expertプロセス(OSの用語では、それはGUIトレッドではないようだ、そして、その一部がそれに飛ばないだけである)にいくつかの(何?

このような問題が解決されれば、DLLを恐れない人には明るい展望が開ける:

- Gtk/Qt/Lazarusとそのデザイナーと本当に良いグラフィックを使って、"チャートの中のダイアログ "を使うことができるようになります。

- 独自の「タブ」を作ることが可能になる - MDIの内部で、「チャートの中にウィンドウを描く」から「MTの中にタブを作る」までの半歩。あらゆる種類のボード/板が、新しいチャートを開く必要がなくなる。

そう、ハックレベルで :-)

 
Vitaliy Kuznetsov #:

どなたか、エディットボックスをキャンバスに表示するためのコードがあれば教えてください。

私はラバーパネルを作っていて、そのような要素が必要なのです。それをクリックすると、数字を入力したり削除したりする必要があり、点滅するカーソルが表示されます。

もしなければ、クリックしたときに通常の置換をします。

このようなEditCtrlのサンプルコード(base)

//+------------------------------------------------------------------+
//|                                                     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 (base) のサンプルコード

イリヤス、質の高いコードの良いチュートリアル例をありがとう。
 
Ilyas #:

EditCtrl (base) のサンプルコード

オブジェクトが削除されないようにバックスペースを無効にする方法はありますか?

 
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 #:
このプロパティを設定しても、オブジェクトはバックスペースで削除されてしまいますが、選択されているからでしょうか?
オブジェクトの作成時間が短い場合、オブジェクトを他のオブジェクトの上に置く方法はありますか?
例えば、私がビットマップラベルオブジェクトを作成した後、他のオブジェクトを作成すると、ビットマップラベルはその後に作成されたオブジェクトの下にあります。
質問 ビットマップラベルを、削除して再度作成する以外に、その後に作成されたオブジェクトの上に置く方法はありますか?
理由: