Réaliser un projet de crowdsourcing sur Canvas - page 22

 
Nikolai Semko:
J'ai presque terminé l'exemple de la classe GButton, mais je dois m'absenter. Je le terminerai demain et le présenterai.
Super. Très intéressant. )
 
Реter Konow:
Super. Très intéressant. )


Voici ce que vous obtenez.


Le bouton peut être affiché en arrière-plan ou au premier plan, avec ou sans fonction de verrouillage.

Dans le fichier d'exemple CanvasButton.mq5, il est possible de faire glisser le bouton avec la souris. Pour ce faire, il suffit d'appuyer sur Ctrl pour déplacer le bouton bleu, et sur Shift pour déplacer le bouton rouge.

Comme la classe GButton est un descendant de la classe CCanvas, l'exemple démontre la possibilité d'utiliser les fonctions de la classe CCanvas sur l'exemple CircleWu (Ceci est implémenté dans OnInit). Il est donc possible d'écrire du texte sur le bouton en utilisant les fonctions de la classe CCanvas.

Cette classe, bien sûr, ne prétend pas être propre. Les graphismes ne brillent pas par leur perfection et la 3D est très conventionnelle ; les ombres ne sont pas implémentées, la vitesse d'exécution n'est pas optimisée. Et il est fort probable qu'il y ait beaucoup d'aspérités et l'absence de divers contrôles. Ne jugez donc pas sévèrement.

Si vous y consacrez un peu plus de temps, c'est bien sûr possible :


J'essayais juste de... on pourrait dire - définir la direction.


Le fichier Canvas.mqh ne diffère du fichier original que par le fait que le tableau m_pixels est défini comme public.

Dossiers :
GButton.mqh  20 kb
Canvas.mqh  152 kb
 
Nikolai Semko:


Voici ce que nous avons obtenu.


Le bouton peut être affiché en arrière-plan ou au premier plan et peut être cliqué ou non.

Dans le fichier d'exemple CanvasButton.mq5, il est possible de faire glisser le bouton avec la souris. Pour ce faire, il suffit de maintenir la touche Ctrl enfoncée pour déplacer le bouton bleu, et la touche Shift pour déplacer le bouton rouge.

Comme la classe GButton est un descendant de la classe CCanvas, l'exemple démontre la possibilité d'utiliser les fonctions de la classe CCanvas sur l'exemple CircleWu (Ceci est implémenté dans OnInit). Il est donc possible d'écrire du texte sur le bouton en utilisant les fonctions de la classe CCanvas.

Cette classe, bien sûr, ne prétend pas être propre. Les graphismes ne brillent pas par leur perfection et la 3D est très conventionnelle ; les ombres ne sont pas implémentées, la vitesse d'exécution n'est pas optimisée. Et il est fort probable qu'il y ait beaucoup d'aspérités et l'absence de divers contrôles. Ne jugez donc pas trop sévèrement.

Si vous passez un peu plus de temps, bien sûr, vous pouvez le faire :


J'essayais juste de... on pourrait dire - définir la direction.


Le fichier Canvas.mqh ne diffère du fichier original que par le fait que le tableau m_pixels est défini comme public.

Nikolay, à mon avis, ça s'est plutôt bien passé. Nous avons pris un bon départ et nous pouvons aller plus loin. J'appellerais ce type de bouton une clé. Si vous avez 4 lignes de cadre claires : - en haut, à gauche clair et à droite, le bas - foncé pour l'état pressé et vice versa, ce sera encore mieux (il suffit d'ajouter un fond clair, sinon les lignes sombres sur un graphique à fond noir ne seront pas visibles). Et ensuite, vous pouvez définir le texte et l'image.

Bref, bien essayé. )

 
Реter Konow:

. Si vous divisez les 4 lignes claires du cadre le long des bords : en haut, à gauche clair et à droite, en bas foncé pour l'état pressé et vice versa pour l'état pressé, ce sera encore mieux (il faut juste ajouter un fond clair, sinon les lignes sombres ne seront pas visibles sur le graphique noir).

Oui, il est clair que vous pouvez dessiner comme vous le souhaitez. Dans ce cas, je n'ai pas cherché à réaliser un chef-d'œuvre. Mais la première chose que je voudrais améliorer, c'est de générer tous les tableaux de l'image du bouton (deux tableaux dans ce cas) et ensuite de les copier uniquement par ArrayCopy, de sorte que nous ne devons pas créer une image à chaque fois. Cela réduira considérablement le travail, mais au prix d'une consommation supplémentaire de RAM, mais comme il est maintenant courant sur les ordinateurs de 16 Go de RAM, et s'il y a même beaucoup de boutons, la consommation de mémoire supplémentaire ne dépassera probablement pas 1 à 2 Mo, surtout si les mêmes boutons utilisent les mêmes tableaux. Donc, je ne pense pas que ce soit un problème. L'essentiel est la vitesse.
 
Nikolai Semko:
Oui, il est clair que vous pouvez dessiner comme vous le souhaitez. Dans ce cas, je ne me suis pas fixé comme objectif de réaliser un chef-d'œuvre. Mais la première chose que je voudrais améliorer, c'est de générer tous les tableaux de l'image du bouton (deux tableaux dans ce cas) et ensuite de les copier uniquement par ArrayCopy, de sorte que nous ne devons pas créer une image à chaque fois. Cela réduira considérablement le travail, mais au prix d'une consommation supplémentaire de RAM, mais comme il est maintenant courant sur les ordinateurs de 16 Go de RAM, et s'il y a même beaucoup de boutons, la consommation de mémoire supplémentaire ne dépassera probablement pas 1 à 2 Mo, surtout si les mêmes boutons utilisent les mêmes tableaux. Donc, je ne pense pas que ce soit un problème. L'essentiel est la vitesse.

Je vois. Lorsque j'ai posé la question sur le bouton, je voulais savoir s'il était possible de faire cela avec un canevas :


Pressé :

Pressé :

Dans cet exemple, chaque côté du cadre est constitué de plusieurs lignes. Il y a un total de 4 lignes de gradient de chaque côté du cadre. Chaque ligne a une teinte différente qui dépend de l'état du bouton et de la forme donnée du cadre. Si CCanvas a la possibilité de définir la couleur de lignes de gradient spécifiques du cadre, il est facile de réaliser l'exemple ci-dessus. C'est exactement ce que je voulais découvrir.

 
Реter Konow:

Je vois. Lorsque j'ai posé la question sur le bouton, je voulais savoir s'il était possible de faire cela avec un canevas :


Pressé :

Pressé :

Dans cet exemple, chaque côté du cadre est constitué de plusieurs lignes. Il y a au total 4 lignes de gradient de chaque côté du cadre. Chaque ligne a une teinte différente, qui dépend de l'état du bouton et de la forme donnée du cadre. Si CCanvas a la possibilité de définir la couleur de lignes de gradient spécifiques du cadre, il est facile de réaliser l'exemple ci-dessus. C'est exactement ce que je voulais découvrir.

Je ne te comprends pas, Peter. Tu parles de la viande et je parle du squelette. Si vous aviez des os, vous pouviez faire pousser de la viande. Mon exemple ne comporte-t-il pas les états Pressed, Pressed ? Avez-vous seulement regardé à l'intérieur de la classe GButton ? Peter, mon conseil : quittez tout et étudiez d'urgence la POO. Vous venez de toucher un plafond dans votre projet, ce qu'on appelle du code gonflé. Elle est facilement surmontée par la POO.
Et avec CCanvas, vous pouvez tout faire, même écrire Windows à l'intérieur de la fenêtre MT5, en mode d'émulation visuelle complète bien sûr :), car il n'y a pas d'accès au matériel.

 
Nikolai Semko:
Je ne te comprends pas, Peter. Vous parlez de viande et je parle de squelette. Si vous avez des os, vous pouvez ajouter de la viande. Mon exemple ne comporte-t-il pas les états Pressed, Pressed ? Avez-vous seulement regardé à l'intérieur de la classe GButton ? Peter, mon conseil : quittez tout et étudiez d'urgence la POO. C'est juste que dans votre projet, vous avez atteint un plafond, qui est appelé code gonflé, il est facilement surmonté avec l'aide de la POO.
Et avec Canvas, vous pouvez tout faire, même écrire des fenêtres à l'intérieur de la fenêtre MT5.

))) Alors pourquoi ai-je lancé ce sujet ? ) Je vais étudier la POO maintenant.

Votre exemple comporte des boutons, des événements de clic et les états de ces boutons. Tout va bien. Mais Nikolaï, je ne comprends toujours pas ce que je demandais - y a-t-il une option dans la classe CCcanvas pour définir une couleur spécifique aux lignes de gradient du cadre ? En regardant votre exemple, vous pouvez penser qu'il y a... Si oui, pouvez-vous dessiner quelque chose de similaire à mon exemple ? Je m'intéresse à la facilité et aux possibilités de dessiner en tant que tel en utilisant la fonctionnalité de cette classe, et vous parlez de vitesse et d'améliorations de la fonctionnalité de la classe. C'est un sujet légèrement différent.

 
Реter Konow:

))) Alors pourquoi ai-je lancé ce sujet ? ) Je vais étudier la POO maintenant.

Il est préférable de commencer à apprendre la POO avec quelque chose de plus simple, pas avec Canvas.
 
Vasiliy Sokolov:
Il est préférable de commencer à apprendre la POO avec quelque chose de plus simple que Canvas.
Vous avez raison. Je devrais peut-être commencer par un manuel. Vraiment, la POO est une chose compliquée. C'est confus...
 
Nikolai Semko:
Avez-vous seulement regardé à l'intérieur de la classe GButton ?


J'ai regardé à l'intérieur de la classe. Cela semble cool, mais je ne comprends pas tout le mécanisme de la classe CCanvas. C'est pourquoi je n'ai pas vu la réponse à ma question ici.