Diskussion zum Artikel "Die Betrachtung der CCanvas-Klasse. Wie man transparente Objekte zeichnet"

 

Neuer Artikel Die Betrachtung der CCanvas-Klasse. Wie man transparente Objekte zeichnet :

Sie wollen mehr als nur komische Grafiken von gleitenden Mittelwerten? Sie möchten etwas Schöneres in Ihrem Terminal abbilden, als nur ein schlichtes, gefülltes Rechteck? Das geht! Im Terminal kann man nämlich tatsächliche attraktive Grafiken zeichnen. Und zwar durch Implementierung der CСanvas-Klasse, die zur Erzeugung von individuell angepassten Grafiken benutzt wird. Mit dieser Klasse können Sie Transparenz umsetzen, Farben mischen und sogar den Anschein von Transparenz durch Überlappung und Ineinanderlaufen von Farben erreichen.

Keine Angst, ich habe die Transparenz des Glases nicht vergessen. Dazu kommen wir aber erst im zweiten Teil dieses Beitrags.

Die ARGB-Farbwiedergabe ist ein uint Type aus vier Bytes, in dem die folgenden Werte aufgezeichnet werden: ein Alpha-Kanal, Rot, Grün und Blau. Um also der Farbe im RGB-Format Transparenz zu verleihen, wird ein extra Byte mit dem Wert 'Transparenz' hinzugefügt - nämlich der sog. Alpha-Kanal.

Abb. 3 ARGB

Abb. 3 ARGB

Autor: Karputov Vladimir

 
Vladimir, ich bin nicht gut auf Leinwänden. Hier ist eine Frage. Es gibt eine Leinwand. Darauf befindet sich eine Textmarke. Warum sieht das Terminal das Ereignis des Klickens auf die Markierung als ein Ereignis des Klickens auf die Leinwand? Kann dieser Konflikt irgendwie aufgelöst werden?
 
denkir:
Vladimir, ich bin nicht gut auf Leinwänden. Hier ist eine Frage. Es gibt eine Leinwand. Auf ihr befindet sich ein Textetikett. Warum sieht das Terminal das Ereignis des Klickens auf das Etikett als ein Ereignis des Klickens auf die Leinwand an? Kann dieser Konflikt irgendwie aufgelöst werden?
Geben Sie mir den Code. Schauen wir uns das mal an.
 
denkir:
...

Es gibt eine Eigenschaft, um die Priorität dafür festzulegen:

OBJPROP_ZORDER - Priorität des grafischen Objekts, das Mausklick-Ereignisse im Diagramm empfangen soll (CHARTEVENT_CLICK). Standardmäßig ist der Wert bei der Erstellung auf Null gesetzt, aber Sie können die Priorität bei Bedarf erhöhen. Wenn sich überlappende Objekte das CHARTEVENT_CLICK-Ereignis empfangen, wird es nur von einem Objekt empfangen, dessen Priorität höher ist als die der anderen.

 

Ich werde Ihnen den Code später schicken. OBJPROP_ZORDER - für Kanvas kann nicht gesetzt werden...

Ich habe die Ursache für die fehlerhafte Verarbeitung gefunden... Es gibt 2 Leinwände, eine überlagert die andere. Und es gibt eine Textbeschriftung oben drauf. Das ist, was OnChartEvent() nicht sieht.

 
denkir:

Ich werde Ihnen den Code später schicken. OBJPROP_ZORDER - für Kanvas kann nicht eingestellt werden...

Ich habe herausgefunden, was die Ursache für die fehlerhafte Verarbeitung ist... Es gibt 2 Leinwände, eine überlagert die andere. Und es gibt eine Textbeschriftung oben drauf. Das ist es, was OnChartEvent() nicht sehen kann.

Doch, das kann es. Es ist ein gewöhnliches Objekt wie OBJ_BITMAP_LABEL oder OBJ_BITMAP.

 
tol64:

Sie können. Es ist ein gewöhnliches Objekt wie OBJ_BITMAP_LABEL oder OBJ_BITMAP.

Richtig. Danke.

Dazu müssen Sie den Namen des gebundenen Diagrammobjekts heranziehen und ihm Priorität einräumen.

So sieht es aus (Auszug aus dem Initialisierungsblock):

//--- Erstellen der 1. Leinwand
   if(!myCanvas1.CreateBitmapLabel("My canvas1",_X,_Y,Width,Height,COLOR_FORMAT_ARGB_RAW)) 
     {
      Print("Error creating base canvas: ",GetLastError());
      return INIT_FAILED;
     }
//--- Anzeige
   myCanvas1.Erase(XRGB(0x1F,0x1F,0x1F)); 
   myCanvas1.Update();
   string obj_name=myCanvas1.ChartObjectName();
   if(!ObjectSetInteger(0,obj_name,OBJPROP_ZORDER,0))
      return INIT_FAILED;
 

Hallo Vladimir,

vielen Dank für diesen interessanten Artikel.

Es gibt einen kleinen Fehler in Ihrer Tabelle 3.

С'255,0,255' 0xFF00FF 1111 1111 0000 0000 1111 1111


XOR
C'255,255,255' 0xFFFFFF 1111 1111 1111 1111 1111 1111 Weiß (Hintergrund)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
Sollte sein:
0000 0000 1111 1111 0000 0000
Grün
 
angevoyageur:

Hallo Vladimir,

vielen Dank für diesen interessanten Artikel.

Es gibt einen kleinen Fehler in Ihrer Tabelle 3.

С'255,0,255' 0xFF00FF 1111 1111 0000 0000 1111 1111


XOR
C'255,255,255' 0xFFFFFF 1111 1111 1111 1111 1111 1111 Weiß (Hintergrund)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
Sollte sein:
0000 0000 1111 1111 0000 0000
Grün
Спасибо за найденную ошибку.
 

Die Frage ist folgende. Was könnte die beste Implementierung für das Bewegen der Leinwand im Diagramm sein? Eine Art von Methode:

bool CUserCanvas::Move(int _new_x,int _new_y);
 
denkir:

Die Frage ist folgende. Was könnte die beste Implementierung für das Bewegen der Leinwand im Diagramm sein? Eine Art von Methode:

Was ist der Zweck des Verschiebens? Wäre es besser, die Zeichnung auf dem Canvas neu zu zeichnen?