CRect defining per size

 

Hello @all,

I try to use the standard lib to make an CAppDialog panel, which is aligned to the right in the chart area, while I stumbled over what I would call a bug in CRect.

Defining a CSize based on the Chart width and height is simple.

Defining the CRect based on the CSize with SetBound(const CPoint& point,const CSize& size) will result in a CRect, which is +1 point in width and height and so my code didn't work.

Is it intended that the CRect.right and CRect.bottom member vars contain positions that are not part of the area?

To make it totally clear what I mean: A CRect(CPoint(0,0), CSize(1,1)), will start at position 0 and has right and bottom at position 1.

I used it in this code and had to correct the CRect for the Align method respectively to make it work. So at least the Align method cannot work with CRect without a correction.


bool CPanelDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
  
   m_chart0.Attach(chart);
   int chart_width=m_chart0.WidthInPixels();
   int chart_height=m_chart0.HeightInPixels(subwin);
   CRect chart_rect;
   chart_rect.SetBound(0,0,chart_width-1,chart_height-1);
 
   this.Alignment(WND_ALIGN_RIGHT | WND_ALIGN_HEIGHT, 0,0,0,0);
     
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);

   //Move(1154,0);
   //Size(390,685);
   //Move(1054,0);
   //Size(390,585);
    Align(chart_rect);

   return(CreateControls());
  
   }


 
  1. Herzlich willkommen und viel Erfolg schon mal.. :)
  2. Wir sprechen hier deutsch.
  3. Wenn Du Code postest, dann verwenden bitte den Code-Konpf (</> oder gleich Alt+s)!!
  4. Hier ist ein ganzer Artikel über ein Paneel: https:https://www.mql5.com/de/articles/345 (inkl. Links zu Anwendungen am Ende)
  5. Bedenke, dass es fast nichts gibt, was nicht schon für MT4/5 programmiert wurde!
  6. Da ist in den aller meisten Fällen Suchen viel schneller als selber machen.
  7. Warum das Rad neu erfinden, wenn es hier auf den Servern in versch. Versionen herumliegt?
Erstellen Ihrer eigenen grafischen Panels in MQL5
Erstellen Ihrer eigenen grafischen Panels in MQL5
  • www.mql5.com
In der Standardbibliothek steht Ihnen eine Reihe neuer Klassen zur Verfügung. Diese Klassen dienen der unabhängigen Entwicklung von Kontrolldialogen und Anzeigefeldern in MQL5-Programmen. Mit den neuen Klassen kann jeder benutzerdefinierte Oberflächenkomponenten mithilfe des zugrundeliegenden ereignisbasierten Modells erstellen. Alles basiert...
 
Carl Schreiber:
  1. Herzlich willkommen und viel Erfolg schon mal.. :)
  2. Wir sprechen hier deutsch.
  3. Wenn Du Code postest, dann verwenden bitte den Code-Konpf (</> oder gleich Alt+s)!!
  4. Hier ist ein ganzer Artikel über ein Paneel: https:https://www.mql5.com/de/articles/345 (inkl. Links zu Anwendungen am Ende)
  5. Bedenke, dass es fast nichts gibt, was nicht schon für MT4/5 programmiert wurde!
  6. Da ist in den aller meisten Fällen Suchen viel schneller als selber machen.
  7. Warum das Rad neu erfinden, wenn es hier auf den Servern in versch. Versionen herumliegt?


Vielen herzlichen Dank für deine Antwort.

Ich habe normalerweise immer englisch eingestellt, aber irgendwas an der Webseite hat wohl gedacht Germany = german.

Den  Standardartikel zu Panels kannte ich tatsächlich noch nicht.

Ich bin mittlerweile aber schon weiter und habe es halbwegs zum Laufen gebracht. Der Fehler liegt woanders. Auch wenn ich CRect wahrscheinlich so definieren würde, dass right und bottom in der Fläche enthalten sind, hebt sich das Ganze auf, wenn alle Teile des Programms es gleich machen.

Aber da die ganze Panel-Logik davon ausgeht, dass man entweder ein Panel im Indikatorfenster hat oder ein verschiebbares Dialogfenster, hätte ich eben gerne einen Dialog wie ihn Photoshop früher hatte oder wie Visual Studio es mit seinen Docking Windows hat.

Einfach rechts im Chartfenster auf voller Höhe aligned.


Da stört leider dieser DEFINE:

#define CONTROLS_BORDER_WIDTH               (1)      // border width

Der wiederum beim Verarbeiten der Chartevents in AppDialog in den Höhenvergleich einfließt:

//+------------------------------------------------------------------+
//| Charts event processing                                          |
//+------------------------------------------------------------------+
void CAppDialog::ChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {

...

         if(m_chart.HeightInPixels(m_subwin)<Height()+CONTROLS_BORDER_WIDTH)
           {
            m_button_minmax.Pressed(true);
            Minimize();
            m_chart.Redraw();
           }

...


Das wiederum sorgt dafür, dass mein Fenster einen Punkt kleiner sein muss, als das Chartfenster, sonst wird es zwangsminimiert.

Ich habe ChartEvent jetzt erst einmal überschrieben und es funktioniert. Aber es fehlt noch an der ganzen Resize-Logik, die es in der Standardlib nicht gibt.

Wenn ich also mein Terminal-Fenster in der Größe verändere, wird mein Panel wieder zwangsminimiert.

Das ist dann doch ein Stück Arbeit, für das ich zur Zeit keine Zeit habe.

Aber vielleicht hilft es dem einen oder anderen.

Hier meine Änderung von Appdialog, die einfach eine Sonderbehandlung bei Panels im Chartfenster macht und die CONTROLS_BORDER_WIDTH rausnimmt:


      //--- if subwindow height is less that dialog height, minimize application window (always)
      if(m_subwin==0) 
         {
         if(m_chart.HeightInPixels(m_subwin)<Height())
           {
            m_button_minmax.Pressed(true);
            Minimize();
            m_chart.Redraw();
           }
         }
            else 
         {
         if(m_chart.HeightInPixels(m_subwin)<Height()+CONTROLS_BORDER_WIDTH)
           {
            m_button_minmax.Pressed(true);
            Minimize();
            m_chart.Redraw();
           }
         }

Und hier ein Bild dazu. Man kann das Fenster verschieben, aber es bleibt oben und unten docked und behält seine Höhe. Sehr praktisch finde ich.


 

Ich versteh den aufwand grad nicht

du musst doch nur dein fenster oben verankern und den rest über die chart grösse anpassen

die pixel size des charts gibt dir mt5 zurück 

 
amando:

Ich versteh den aufwand grad nicht

du musst doch nur dein fenster oben verankern und den rest über die chart grösse anpassen

die pixel size des charts gibt dir mt5 zurück 


Der Aufwand kommt daher, dass ich das mit der StdLib versucht habe, in der CWnd diese nette Alignment Funktion hat, die den Eindruck erweckt, genau das zu können:

this.Alignment(WND_ALIGN_RIGHT | WND_ALIGN_HEIGHT, 0,0,0,0); 

Das ist aber leider nur für die enthaltenen Controls gedacht und nicht für ein Alignment des ganzen Fensters.

An der Standardlib  vorbei lässt sich natürlich alles zu Fuß machen, was dann ein anderes Thema wäre.

Vielleicht habe ich dich auch nicht richtig verstanden. Nochmal: Wenn du den Appdialog oben verankerst und die Höhe des Charts angibst, wird das Fenster zwangsminimiert. Das ist so nicht nutzbar. Benutzt du eine Höhe von Charthöhe minus 1 geht es.

 
JHawk:


Der Aufwand kommt daher, dass ich das mit der StdLib versucht habe, in der CWnd diese nette Alignment Funktion hat, die den Eindruck erweckt, genau das zu können:

Das ist aber leider nur für die enthaltenen Controls gedacht und nicht für ein Alignment des ganzen Fensters.

An der Standardlib  vorbei lässt sich natürlich alles zu Fuß machen, was dann ein anderes Thema wäre.

Vielleicht habe ich dich auch nicht richtig verstanden. Nochmal: Wenn du den Appdialog oben verankerst und die Höhe des Charts angibst, wird das Fenster zwangsminimiert. Das ist so nicht nutzbar. Benutzt du eine Höhe von Charthöhe minus 1 geht es.

Das hatte ich mal, zu zeiten als ich noch das panal verwendet habe. Mittlerweile bin ich auf die objects umgestiegen, da ich damit aus dem indikatorfenster eine order absetzen kann.

Das indikatorfenster lasse ich automatisch als letztes unten anordnen

die sdr libary hat zwar ein paar vorteile, ist aber gesamt extrem mühsam, weil ich alles 3x machen muss 😂

Grund der Beschwerde: