Discussion de l'article "Étudier la classe CCanvas. Comment dessiner des objets transparents"

 

Un nouvel article Étudier la classe CCanvas. Comment dessiner des objets transparents a été publié :

Avez-vous besoin de plus que des graphiques maladroits de moyennes mobiles ? Voulez-vous dessiner quelque chose de plus beau qu'un simple rectangle rempli dans votre terminal ? Des graphiques attrayants peuvent être dessinés dans le terminal. Cela peut être implémenté via la classe CСanvas, qui est utilisée pour créer des graphiques personnalisés. Avec cette classe, vous pouvez implémenter la transparence, mélanger les couleurs et produire l'illusion de la transparence au moyen de superpositions et de mélanges de couleurs.

Nous vivons dans un monde en trois dimensions et percevons tout ce qui nous entoure en trois dimensions. Nous avions l'habitude de voir ou même de ressentir la tridimensionnalité. Dans le monde tridimensionnel, nous pouvons comprendre lequel des objets est le plus proche de nous.

Certains objets peuvent être translucides. Par exemple, prenez un verre transparent contenant un liquide translucide sur fond bleu. Le fond bleu est visible à travers le verre avec du liquide. Les détails de l'arrière-plan dépendent du degré de transparence du liquide.


Fig. 1 Vue commune de la dimensionnalité

Fig. 1 Vue commune de la dimensionnalité

Auteur : Vladimir Karputov

 
Vladimir, je ne suis pas douée pour les toiles. Voici une question. Il y a une toile. Il y a une étiquette de texte dessus. Pourquoi le terminal voit-il l'événement de clic sur l'étiquette comme un événement de clic sur le canevas ? Ce conflit peut-il être résolu d'une manière ou d'une autre ?
 
denkir:
Vladimir, je ne suis pas douée pour les toiles. Voici une question. Il y a une toile. Il y a une étiquette de texte dessus. Pourquoi le terminal voit-il l'événement de clic sur l'étiquette comme un événement de clic sur le canevas ? Ce conflit peut-il être résolu d'une manière ou d'une autre ?
Donnez-moi le code. Voyons ce qu'il en est.
 
denkir:
...

Il existe une propriété permettant de définir la priorité de cet événement :

OBJPROP_ZORDER - Priorité de l'objet graphique devant recevoir l'événement de clic de souris sur le graphique (CHARTEVENT_CLICK). Par défaut, la valeur est fixée à zéro lors de la création, mais vous pouvez augmenter la priorité si nécessaire. Lorsque des objets qui se chevauchent reçoivent l'événement CHARTEVENT_CLICK, seul l'objet dont la priorité est supérieure aux autres le recevra.

 

Je vous enverrai le code plus tard. OBJPROP_ZORDER - pour kanvas ne peut pas être défini...

J'ai trouvé la cause de l'erreur de traitement... Il y a 2 toiles, l'une superposée à l'autre. Et il y a une étiquette de texte au-dessus. C'est ce que OnChartEvent() ne voit pas.

 
denkir:

Je vous enverrai le code plus tard. OBJPROP_ZORDER - pour kanvas ne peut pas être défini...

J'ai trouvé la cause de l'erreur de traitement... Il y a 2 toiles, l'une superposée à l'autre. Et il y a une étiquette de texte au-dessus. C'est ce que OnChartEvent() ne voit pas.

Si, il le peut. Il s'agit d'un objet ordinaire comme OBJ_BITMAP_LABEL ou OBJ_BITMAP.

 
tol64:

Vous pouvez le faire. Il s'agit d'un objet ordinaire comme OBJ_BITMAP_LABEL ou OBJ_BITMAP.

C'est vrai. Merci.

Pour ce faire, vous devez extraire le nom de l'objet graphique lié et lui donner la priorité.

Voilà comment cela se passe (extrait du bloc d'initialisation) :

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

Bonjour Vladimir,

Merci pour cet article intéressant.

Il y a une petite erreur dans votre tableau 3.

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


XOR
C'255,255,255' 0xFFFF 1111 1111 1111 1111 1111 1111 Blanc (arrière-plan)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
Devrait être :
0000 0000 1111 1111 0000 0000
Vert
 
angevoyageur:

Bonjour Vladimir,

Merci pour cet article intéressant.

Il y a une petite erreur dans votre tableau 3.

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


XOR
C'255,255,255' 0xFFFF 1111 1111 1111 1111 1111 1111 Blanc (arrière-plan)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
Devrait être :
0000 0000 1111 1111 0000 0000
Vert
Спасибо за найденную ошибку.
 

La question est la suivante. Quelle pourrait être la meilleure implémentation pour déplacer le kanvas autour du graphique ? Une sorte de méthode :

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

La question est la suivante. Quelle pourrait être la meilleure implémentation pour déplacer le kanvas autour du graphique ? Une sorte de méthode :

Quel est l'objectif de ce déplacement ? Serait-il préférable de redessiner le dessin sur le kanvas ?