CRect defining per size

Einloggen oder registrieren, um einen Kommentar zu schreiben
JHawk
60
JHawk  

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


Carl Schreiber
Moderator
8266
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?
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...
JHawk
60
JHawk  
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.


amando
1819
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 

Einloggen oder registrieren, um einen Kommentar zu schreiben