Diskussion zum Artikel "Graphisches Interface XI: Gezeichnete Steuerelemente (build 14.2)" - Seite 2

 
Artyom Trishkin:

Und noch eine Frage zur gleichen Zeit: beim Zeichnen einer Textbeschriftung (CTextLabel) auf dem Hintergrund eines Fensters, das eine gewisse Transparenz hat, werden die Beschriftungen auf ihrem undurchsichtigen Hintergrund gezeichnet, der nicht auf die Alpha()-Methode reagiert, und es sieht nicht gut aus ... Ist es möglich, den Hintergrund von Labels auch transparent zu machen?

Aus dem Artikel:

"Transparenz gilt in dieser Version nur für die Hintergrundfüllung und den Rahmen. Text und Bilder bleiben bei jedem eingestellten Alphakanalwert völlig undurchsichtig und scharf."

 
Artyom Trishkin:

Hi. Tol, ich habe in den Beispielen nichts gefunden, wie ich jetzt eine Trennlinie im Fenster zeichnen kann.

Was bedeutet index?

Welcher Index-Parameter, Index von was, soll da übergeben werden?

Und noch eine Frage zur gleichen Zeit: wenn ich eine Textbeschriftung (CTextLabel) auf dem Hintergrund eines Fensters zeichne, das eine gewisse Transparenz hat, werden die Beschriftungen auf dem undurchsichtigen Hintergrund gezeichnet, der nicht auf die Alpha()-Methode reagiert, und es sieht nicht gut aus .... Ist es möglich, auch den Hintergrund der Beschriftungen transparent zu machen?


Der Parameter mit dem Index sollte nicht vorhanden sein. Ich habe vergessen, ihn zu entfernen. Jetzt können Sie dort einen beliebigen Wert übergeben. Ich werde diesen Parameter in einem der nächsten Updates entfernen.

Beispiel:

//+------------------------------------------------------------------+
//| Erzeugt eine Trennungslinie|
//+------------------------------------------------------------------+
bool CProgram::CreateSepLine1(const int x_gap,const int y_gap)
  {
//--- Speichern des Fensterzeigers
   m_sep_line1.MainPointer(m_window);
//--- Abmessungen
   int x_size=2;
   int y_size=72;
//--- Eigenschaften
   m_sep_line1.DarkColor(C'150,150,150');
   m_sep_line1.LightColor(clrWhite);
   m_sep_line1.TypeSepLine(V_SEP_LINE);
//--- Erstellen eines Elements
   if(!m_sep_line1.CreateSeparateLine(0,x_gap,y_gap,x_size,y_size))
      return(false);
//--- Hinzufügen eines Zeigers auf das Element in der Basis
   CWndContainer::AddToElementsArray(0,m_sep_line1);
   return(true);
  }

//---

Artyom Trishkin:

...

Und noch eine Frage zur gleichen Zeit: wenn man ein Textlabel (CTextLabel) auf dem Hintergrund eines Fensters zeichnet, das eine gewisse Transparenz hat, werden die Labels auf ihrem eigenen opaken Hintergrund gezeichnet, der nicht auf die Alpha()-Methode reagiert, und das sieht nicht gut aus .... Ist es möglich, auch den Hintergrund der Beschriftungen transparent zu machen?

Die Transparenz der einzelnen Elemente kann nun manuell eingestellt werden. Im folgenden Beispiel ist der Hintergrund des Fensters auf den Alphakanal 200 eingestellt. Der Hintergrund der Textbeschriftung ist auf 0 eingestellt.

//---

Beispiel:

//+------------------------------------------------------------------+
//|| Erzeugt Textbeschriftung 1|
//+------------------------------------------------------------------+
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp"
//---
bool CProgram::CreateTextLabel(const int x_gap,const int y_gap,string text)
  {
//--- Speichern des Zeigers auf das Hauptelement
   m_text_label.MainPointer(m_window);
//--- Eigenschaften
   m_text_label.Alpha(0);
   m_text_label.XSize(190);
   m_text_label.YSize(20);
   m_text_label.LabelXGap(21);
   m_text_label.LabelYGap(3);
   m_text_label.IconFile("Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp");
//--- Erstellen eines Elements
   if(!m_text_label.CreateTextLabel(text,x_gap,y_gap))
      return(false);
//--- Hinzufügen eines Zeigers auf das Element in der Basis
   CWndContainer::AddToElementsArray(0,m_text_label);
   return(true);
  }
 
Oleksii Chepurnyi:

Aus dem Artikel:

"Die Transparenz in dieser Version gilt nur für die Hintergrundfüllung und den Rahmen. Text und Bilder bleiben bei jeder Alphakanal-Einstellung völlig undurchsichtig und scharf."

Dies ist die Regel für alle Elemente in der Bibliothek. Das heißt, der Alphakanal kann für jedes Element einzeln eingestellt werden.
 
Anatoli Kazharski:
Dies ist die Regel für alle Objekte in der Bibliothek. Das heißt, der Alphakanal kann für jedes Objekt einzeln festgelegt werden.

Vielen Dank für die Klarstellung. Eine weitere Frage:

In welchem Koordinatensystem werden die Koordinaten der Objekte zurückgegeben?

Wenn ich z. B. die Koordinate des rechten Rands der Schaltfläche m_button_text.X2() nehme, in welchem Koordinatensystem wird dann die Koordinate der Schaltfläche zurückgegeben? Das Formularfenster oder das Diagrammfenster?

Hier ist mein Punkt: Ich baue Objekte in einem Formularfenster. Wenn die Schaltflächen hintereinander angeordnet sind, nehme ich die X()-Koordinate der zweiten Schaltfläche als die X2()+2-Koordinate der ersten Schaltfläche. Die X()-Koordinate der dritten Schaltfläche ist die X2()+2-Koordinate der zweiten Schaltfläche, und so weiter ... .

Solange sich die Schaltfläche an der Koordinate 0 des Symboldiagramms befindet, ist alles in Ordnung. Wenn Sie es nach rechts verschieben und die TF umschalten, bewegen sich die Schaltflächen nach rechts. Und je weiter das Fensterformular vom linken Rand des Diagramms entfernt ist, desto weiter bewegen sich die Schaltflächen voneinander weg.

Wie kann ich die Koordinaten der einzelnen Schaltflächen so einstellen, dass sie sich nicht auf dem Bildschirm verschieben, wenn ich das Formularfenster an eine neue Stelle verschiebe und dann die TF umschalte?

 
Artyom Trishkin:

Vielen Dank für die Klarstellung. Eine weitere Frage:

...

Es werden absolute Koordinaten zurückgegeben. Ich muss sie in relative Koordinaten umwandeln. Relativ zu dem Element, an das das zu erstellende Element angehängt ist.

Wenn das Hauptelement ein Formular ist, dann:

...
   int x=(m_button1.X2()+5)-m_window.X();
   if(!CreateButton2(x,50,"Button 2"))
      return(false);
...

//---


 
Anatoli Kazharski:

Es werden absolute Koordinaten zurückgegeben. Sie müssen in relative Koordinaten umgewandelt werden. Relativ zu dem Element, an das das zu erstellende Element angehängt ist.

Wenn das Hauptelement ein Formular ist, dann:

//---


Danke! Seltsam, ich habe versucht, es auf diese Weise zu machen - die Schaltflächen gingen an den linken Rand des Diagrammfensters, wenn ich das tf änderte. Ich werde es noch einmal genauer versuchen.
 
Anatoli Kazharski:

Es werden absolute Koordinaten zurückgegeben. Sie müssen in relative Koordinaten umgewandelt werden. Relativ zu dem Element, an das das zu erstellende Element angehängt ist.

Wenn das Hauptelement ein Formular ist, dann:

//---


Seltsam. Wenn ich die von dieser Methode berechnete Koordinate an die Objektkonstruktionsmethode übergebe, ist alles in Ordnung....

int x=(m_button1.X2()+5)-m_window.X();

Aber wenn ich nur die berechnete Koordinate an die Methode übergebe:

int x=m_button1.X2()+5;

... und dann in der Methode sofort den Wert von m_window.X() von der übergebenen Koordinate abziehe, fließt alles.... Obwohl, welchen Unterschied macht es, wo man es subtrahiert? Sofort, oder schon in der Build-Methode....

Vielleicht habe ich etwas übersehen, aber ich kann nicht verstehen, warum das so ist?

 

Wenn Sie eine Zeile in Program.mqh in TestLibrary14 schreiben - Änderung der Fenstertitelfarbe:

//+------------------------------------------------------------------+
//|| Erzeugt die grafische Benutzeroberfläche des Programms.
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
  {
//--- Erstellen eines Panels
   if(!CreateWindow("EXPERT PANEL"))
      return(false);
   m_window.CaptionColor(clrDimGray);
   

Dann wird beim Minimieren des Fensters die Farbe auf den Standardwert zurückgesetzt. Und die Schaltflächen Tooltips, Minimieren/Entfernen und Schließen werden in der programmatisch eingestellten Fenstertitelfarbe neu gezeichnet. Und dann ändert sich die Farbe dieser Schaltflächen nur dann in die Standardfarbe, wenn der Mauszeiger darüber schwebt.

Ist es übrigens möglich, den Hintergrund dieser Schaltflächen transparent zu machen? Zum Beispiel ist der Fenstertitel grau, aber die Schaltflächen sind blau....

 

Tol, in welchem der Artikel dieser Serie können Sie etwas über CKeys lesen?

Manchmal werden bei der Eingabe von ZIFFERN in das Eingabefeld die Zeichen dieser Zifferntasten, die auf der Taste+Shift liegen, eingegeben. D.h., ich gebe 2 ein, aber @ wird eingegeben ....

In einigen Situationen - ich weiß nicht, in welchen (wahrscheinlich hängt es von der Anzahl und der Art der Steuerelemente im Formularfenster ab) - führt das Drücken der Rücktaste dazu, dass die Steuerelemente in der umgekehrten Reihenfolge ihres Hinzufügens aus dem Formularfenster gelöscht werden. Ich verstehe nicht, warum es das Drücken der Rücktaste nicht als Steuerzeichen für das Eingabefeld ansieht, wenn sich der Cursor darin befindet, sondern als einen Befehl zum Löschen der Steuerelemente im Formularfenster. D.h.: Ich starte das Programm und drücke die Rücktaste - mit jedem Drücken der Rücktaste werden alle Steuerelemente gelöscht, beginnend mit dem zuletzt hinzugefügten. Schließlich wird auch das bereits leere Formularfenster gelöscht.

Ist es möglich, die Reaktion auf Backspace zu deaktivieren, wenn sich der Cursor nicht im Eingabefeld befindet?

 
Artyom Trishkin:

...

Übrigens - ist es möglich, den Hintergrund dieser Schaltflächen transparent zu machen? Zum Beispiel ist der Fenstertitel grau, aber die Schaltflächen sind blau....

Verwenden Sie Methoden, um Zeiger auf zusammengesetzte Elemente zu erhalten. Die gleiche Regel gilt für alle Elemente.