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

 
Реter Konow:

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


C'est l'avantage de votre chemin - de la pratique à la théorie. Je l'ai fait de cette façon aussi. Mes tripes ont longtemps résisté au paradigme de la POO, car j'ai commencé à programmer alors qu'il n'existait pas dans la nature. Mais maintenant je comprends que c'est l'invention la plus précieuse de la programmation. Et parfois, il me semble que si le POA n'avait pas été inventé jusqu'à présent, je l'aurais inventé moi-même :))
Vous, Peter, l'aimerez et vous serez ravi lorsque vous réaliserez la génialité de la POO et les possibilités qu'elle ouvre. Je vous assure :)). Et il n'y a rien de compliqué et d'embrouillé dans la POO, surtout pour vous qui avez de l'expérience en programmation. Et il me semble que, dans votre cas, la documentation de Metacvots pourrait même suffire pour aller au fond des choses. Il y a beaucoup de littérature dans ce domaine.
Tag Konow:

Mais Nikolay, je ne comprends toujours pas ce que je demandais - y a-t-il une possibilité de définir une couleur spécifique pour les lignes de gradient du cadre dans la classe CCcanvas ? En regardant votre exemple, on pourrait penser qu'il y a... Si oui, pouvez-vous dessiner quelque chose de similaire à mon exemple ?

OK, OK. Bien que ce ne soit pas le sujet de ce fil, je vais essayer de clarifier des choses qui semblent évidentes pour les programmeurs avertis, mais qui ne le sont pas pour les programmeurs qui rencontrent Canvas pour la première fois.
Alors, qu'est-ce que Canvas. Traduit de l'anglais, c'est une toile. Il s'agit simplement de n'importe quelle zone de l'écran à l'intérieur d'une fenêtre à laquelle elle est ensuite attachée. Ses principales caractéristiques sont ses dimensions (largeur et hauteur). Et en fait, il s'agit d'un tableau unidimensionnel de points de type uint (4 octets) de taille Width*Height. Dans l'implémentation de la classe CCanvas, ce tableau est appelé m_pixels, et par défaut il est privat (ce qui signifie qu'il n'est accessible qu'à l'intérieur de la classe), mais personnellement je le rend toujours public (accessible non seulement à l'intérieur de la classe, mais aussi dans les applications de l'utilisateur), parce que je veux opérer avec le tableau de données directement. Chaque point de ce canevas peut prendre n'importe quelle valeur de type couleur (également 4 octets comme uint, un octet réservé), ce qui signifie un point de n'importe quelle couleur RGB. Chaque couleur (rouge, vert ou bleu) correspond à un octet (256 valeurs), il y a donc 256*256*256=16 777 216 couleurs RVB au total.

Pour placer un point rouge en coordonnées X,Y, où X peut prendre des valeurs de 0 à (Width-1) et Y de 0 à (Height-1), il suffit d'attribuer une valeur rouge à une cellule du tableau m_pixels numérotée (Y*Width+X) :

m_pixels[Y*Width+X]=clrRed;

ou ce qui est pareil :

m_pixels[Y*Width+X] = 0x0000FF; // 0x00FF00 зеленый, - 0xFF0000 - синий, 0x00FFFF - желтый и т.д.

C'est tout ! !!
Il n'est même plus possible d'utiliser les fonctions intégrées de la classe CCanvas (ce qui est bien sûr idiot, car il y a beaucoup de choses utiles). Si vous pouvez mettre un point sur l'écran, n'importe où et dans n'importe quelle couleur, vous devinez ce que vous voulez et vous le dessinez : boutons, graphiques, créer votre propre GDI, etc. etc.

Et si quelqu'un pense que Kanvas est lent, il se trompe. Kanvas est incroyablement rapide et c'est tout à l'honneur de l'équipe de développement. J'ai testé la vitesse de dessin des kanvas à de nombreuses reprises en utilisant des bibliothèques Dll écrites en C++ également. Maintenant, après les mises à jour de l'année dernière, le canevas sur MT5 est presque aussi rapide que si vous l'aviez écrit dans Visual Studio en C++. Il n'est que de 10 à 15 % plus lent. Et n'oubliez pas que Windows est écrit en C++ et qu'il s'agit de Canvas. C'est la beauté et la promesse de MT5 avec son MQL5 ! !! Ni Java ni C# ne pourront se targuer d'une telle rapidité, comme certains l'ont écrit dans ce fil.

Ce n'est pas pour rien que les développeurs ont récemment introduit une nouvelle propriété CHART_SHOW pour désactiver le rendu du graphique.
Je vais vous le démontrer à l'aide d'un exemple de script :

//+------------------------------------------------------------------+
//|                                                  CleanScreen.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

// Внимание !!! В классе CCanvas массив m_pixels должен быть определен как public
#include <Canvas\Canvas.mqh>

void OnStart()
  {
   ChartSetInteger(0,CHART_SHOW,false); // очищаем экран от всего
   int Width =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // получаем Ширину экрана
   int Height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту экрана

   CCanvas C;   // создаем объект Canvas
   if(!C.CreateBitmapLabel(0,0,"CleanScreen",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // Создаем холст на весь экран
      Print("Error creating canvas: ",GetLastError());

// Теперь что-нибудь нарисуем на этом чистом экране
// например красную точку в центре экрана
   int X=Width/2;
   int Y=Height/2;
   C.m_pixels[Y*Width+X]=0xFF0000; // красный
                                   // или нарисуем окружность в центре с радиусом 100 по точкам фиолетового цвета
   int r=100;
   int q=(int)ceil(r*M_SQRT1_2);
   int r2=r*r;
   for(int x=0; x<=q; x++)
     {
      int y=(int)round(sqrt(r2-x*x));
      C.m_pixels[(Y+y)*Width+X+x]=0xFF00FF;
      C.m_pixels[(Y+y)*Width+X-x]=0xFF00FF;
      C.m_pixels[(Y-y)*Width+X+x]=0xFF00FF;
      C.m_pixels[(Y-y)*Width+X-x]=0xFF00FF;
      C.m_pixels[(Y+x)*Width+X+y]=0xFF00FF;
      C.m_pixels[(Y+x)*Width+X-y]=0xFF00FF;
      C.m_pixels[(Y-x)*Width+X+y]=0xFF00FF;
      C.m_pixels[(Y-x)*Width+X-y]=0xFF00FF;
     }
// конечно же можно окружность построить проще :) - через встроенную функцию класса CCanvas:
   C.Circle(X,Y,r+20,0xFFFF00); // желтого цвета
   C.Update(); // Теперь выводим это на экран
  }

Fonctionnement de ce script :


L'écran est effacé, mais l'accès aux cotations demeure et nous pouvons utiliser cette toile vierge pour créer notre propre interface graphique, comme celle-ci avec un dégradé :


Regex Konow:

Mais Nikolaï, je n'ai toujours pas compris 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, on pourrait penser qu'il y a... Si oui, pouvez-vous dessiner quelque chose de similaire à mon exemple ?

La couleur est définie à l'intérieur de la classe GButton, et il y a même deux fonctions pour mélanger les deux couleurs et créer un tableau de couleurs pour passer d'une couleur à l'autre, c'est-à-dire juste pour le gradient. Il s'agit juste de définir le concept de gradient. D'après moi, un gradient (ou remplissage de gradient) est un passage fluide d'une couleur à une autre. Dans votre exemple, il n'y a pas de gradient, seulement 4 couleurs. Dans mon exemple, à l'intérieur de la classe GButton, 4 couleurs supplémentaires sont formées avec différentes luminosités de la couleur et un tableau de couleurs est formé pour le remplissage en dégradé. Ceci est fait précisément pour faciliter la vie de l'utilisateur final de la classe. Pourquoi devrait-il se soucier de la formation de ces couleurs ?
Dessinez quelque chose de similaire à votre exemple - c'est votre devoir, Peter :)) Allez, commencez à comprendre les classes, donc la POO.
Bonne chance !
 
Nikolai Semko:

Bonne chance !

OK, Nikolaï. Merci et bonne chance à vous aussi !
 
Nikolai Semko:

Nikolaï, je voulais répondre à votre post informatif d'hier, mais je n'ai pas pu rassembler mes pensées. Maintenant, j'ai rassemblé mes pensées et j'ai réalisé que je devais écrire avec mon cœur, et non avec ma tête, sinon je n'expliquerai rien. Bien sûr, ce serait hors-sujet et les modérateurs le supprimeraient probablement, mais quand même...

Ce que vous écrivez sur la POO est une source d'inspiration. J'ai déjà commencé à l'étudier avec la sérieuse intention de la maîtriser. Cependant, en l'apprenant, j'ai été constamment bombardé de questions du type "pourquoi prendre le chemin le plus long quand il y a un raccourci ?". Je voyais constamment des façons faciles, concises et claires de résoudre les problèmes, et c'était comme si on me disait : "Non ! En POO, ce n'est pas une solution. Vous devez le faire d'une manière formelle, officielle et noble." En réponse, je me suis demandé : "Mais comment est-ce possible ? Je n'ai pas besoin de ces entités. Pourquoi devrais-je les ajouter au code ? Ils sont superflus. Je veux réduire le code." Et j'ai dit, "Non, ce n'est pas professionnel. C'est un mauvais code."

Je discutais beaucoup sur le sujet de la POO en essayant de comprendre quels étaient ses avantages pour moi. Je me suis dit : "Si je peux résoudre des tâches parfaitement bien et facilement sans la POO, pourquoi devrais-je l'utiliser ? Pourquoi devrais-je compliquer davantage des choses simples et claires pour moi ? Comment, où et pourquoi devrais-je mettre dans mon code quelque chose dont je n'ai pas besoin ?". Ensuite, j'ai décidé que je n'avais pas besoin de la POO parce que je fais tout moi-même et que je suis très bon dans ce domaine. Lorsque vous faites tout vous-même sans vous attendre à boucher quoi que ce soit et que, de surcroît, vous cherchez et trouvez les solutions les plus efficaces, une question naturelle se pose : "Pourquoi faire autrement ? Il semblerait que la POO donne du confort et de l'ordre à un programme. Oui, c'est vrai. Mais j'ai mon propre ordre. Ma propre structure. Mes propres entités. Mes propres règles. Alors pourquoi devrais-je le rejeter ?

Tout comme notre corps rejette les tissus étrangers, je ne pouvais pas "fusionner" avec le produit d'une pensée étrangère. Partout et en tout, je me sentais rejeté. Pour moi, l'OLP était un ordre créé par la pensée de quelqu'un d'autre et il ne passait pas mon test d'efficacité. C'est ce test qui a été le facteur décisif pour moi. J'ai réalisé que si j'utilisais la POO, je serais un programmeur plus faible que si je suivais ma propre voie et résolvais tous les problèmes moi-même. Ma "force de programmation" réside dans le fait que j'écris dans une langue russe compréhensible, que j'utilise une mémoire globale partagée pour les objets graphiques, que j'appelle "noyau", et que je crée des mécanismes importants et complexes qui fonctionnent avec ce noyau. Voici mon approche.

Je ne programmerai pas la POO jusqu'à ce que quelqu'un me batte avec cette approche. Jusqu'à ce qu'il fasse ce que je fais, mais de manière encore plus efficace.

J'ai posé des questions sur kanvas parce que je voulais comprendre pourquoi mon mécanisme s'avère plus efficace en fait. Pas dans les théories, pas dans la beauté des codes, mais dans la pratique.

Quoi qu'il en soit, merci Nikolay de m'avoir inspiré et guidé. ))

 
Реter Konow:

...

Je ne programmerai pas OOP jusqu'à ce que quelqu'un me batte avec cette approche.

...


Ce quelqu'un est probablement l'un de ces moulins à vent que vous combattez si frénétiquement dans votre imagination. )
 
Anatoli Kazharski:

Ce quelqu'un doit être un de ces moulins à vent que vous combattez si frénétiquement dans votre imagination. )
Et voilà ! Les trolls arrivent...))
 
Реter Konow:
Et voilà ! Les trolls arrivent...))
Calme-toi, Peter. Ce ne sont que des moulins. Ils se tiennent juste là, remplissent une certaine fonction et n'essaient pas de vous battre. Mais qui sait comment il est visualisé dans votre imagination fertile. Selon toute apparence, il est très spectaculaire. )
 
Реter Konow:

Je ne suis absolument pas un fan de la POO, mais vous devez la connaître et être capable de l'utiliser clairement si vous vous considérez comme un programmeur, au moins dans un souci d'auto-éducation.

Mais c'est à vous de l'utiliser ou non pour résoudre vos tâches applicatives.

 
Anatoli Kazharski:
Calme-toi, Peter. Ce ne sont que des moulins. Ils sont juste là, à remplir une certaine fonction et n'essaient pas de vous battre. Bien que qui sait comment il est visualisé dans votre imagination fertile. Selon toute apparence, il est très spectaculaire. )

Anatoly, moulins ou pas, j'aime me battre et gagner. Surtout dans ce à quoi je suis bon. J'aime la compétition en direct, les duels et tout ça... Tout cela fait partie de l'évolution et de la sélection naturelle. Donc c'est bon... Tant que les règles sont équitables.

Collaborer avec des personnes partageant les mêmes idées, participer à des projets communs, travailler en équipe, c'est aussi cool. Et l'imagination, bien sûr, ne doit pas remplacer la réalité. Si c'est ce que vous voulez dire, je suis d'accord.

 
Комбинатор:

... Mais vous devez le connaître et être capable de l'utiliser clairement si vous vous considérez comme un programmeur, au moins dans un souci d'auto-éducation.

Mais c'est à vous de décider de l'utiliser ou non pour résoudre vos problèmes d'application.

On ne peut pas être en désaccord avec cela.
 
Реter Konow:

Je ne programmerai pas la POO jusqu'à ce que quelqu'un me batte avec cette approche. Jusqu'à ce qu'ils en fassent ce que je fais, mais de manière encore plus efficace.

J'ai posé des questions sur kanvas parce que je voulais comprendre pourquoi mon mécanisme s'avère plus efficace en fait. Pas dans les théories ou la beauté des codes, mais dans la pratique.

En tout cas, merci Nikolay de m'avoir inspiré et guidé. ))

Si deux programmeurs ayant la même expérience et la même intelligence sont en concurrence pour la création degrands projets similaires. Mais la première n'utilise que des fonctions, tandis que la seconde utilise des fonctions et des classes. Le second va certainement gagner. Mais, je le répète, s'il s'agit d'un projet volumineux, ce dernier le rendra plus rapide car il y aura moins de bugs et plus d'ordre. Et le produit de la seconde sera plus lisible, plus facile à entretenir et plus aisément mis à jour et complété. Ce n'est même pas mon avis, c'est juste une déclaration de fait. Il est plus facile de creuser un trou avec une pelle qu'avec une truelle. Si vous implémentiez votre mécanisme non seulement sur les fonctions mais aussi sur les classes, il deviendrait plus efficace. C'est mon avis.

Et, Peter, j'ai jeté un coup d'œil rapide à votre code et je me suis rendu compte que vous utilisez le canvas au maximum (bien que ce ne soit pas la classe CCanvas, mais qui s'en soucie). Pourquoi toutes ces questions sur la toile et pourquoi j'essaie d'expliquer toutes ces choses ici ? :)).