Galerie d'interfaces utilisateur écrites en MQL - page 78

 
Реter Konow #:
Ce n'est pas facile de faire quelque chose comme ça. )

Pour autant que je sache, dans la classe standard Ccanvas il n'y a pas de fonctionnalité pour dessiner un gradient de couleur, comment avez-vous résolu le problème avec un gradient dans votre GUI ?

Vous voulez parler des effets de lumière ? Eh bien, j'ai ajouté de la lumière :D Comme décrit, CCanvas n'est adapté que dans ses bases et sa structure, pas dans ses détails.

//+------------------------------------------------------------------+
//| Macro to generate color                                          |
//+------------------------------------------------------------------+
#define XRGB(r,g,b)    (0xFF000000|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b))
#define ARGB(a,r,g,b)  ((uchar(a)<<24)|(uchar(r)<<16)|(uchar(g)<<8)|uchar(b))
#define TRGB(a,rgb)    ((uchar(a)<<24)|(rgb))
#define GETRGB(clr)    ((clr)&0xFFFFFF)
#define GETRGBA(clr)   uchar((clr)>>24)
#define GETRGBR(clr)   uchar((clr)>>16)
#define GETRGBG(clr)   uchar((clr)>>8)
#define GETRGBB(clr)   uchar(clr)
#define COLOR2RGB(clr) (0xFF000000|(uchar(clr)<<16)|(uchar((clr)>>8)<<8)|uchar((clr)>>16))
#define RGB2COLOR(rgb) ((uchar(rgb)<<16)|(uchar((rgb)>>8)<<8)|uchar((rgb)>>16))


//+------------------------------------------------------------------+
//| Add light to rectangular area                                    |
//+------------------------------------------------------------------+
void CCanvasExt::AddLight(int x1, int y1, int x2, int y2, bool updown=true, double intensity=.5, int isoftedge=20, color lightcolor=C'255,255,255')
   {
   if (intensity==0)
      return;
      
   int tmp;
//--- sort vertexes
   if(x2<x1)
     {
      tmp=x1;
      x1 =x2;
      x2 =tmp;
     }
   if(y2<y1)
     {
      tmp=y1;
      y1 =y2;
      y2 =tmp;
     }
//--- out of screen boundaries
   if(x2<0 || y2<0 || x1>=m_width || y1>=m_height)
      return;
//--- stay withing screen boundaries
   if(x1<0)
      x1=0;
   if(y1<0)
      y1=0;
   if(x2>=m_width)
      x2=m_width -1;
   if(y2>=m_height)
      y2=m_height-1;


//--- calculate softedge
   isoftedge=MIN(100,isoftedge);
   int softedge=isoftedge>0 ? isoftedge*(y2-y1)/100 : 0;

//--- correct height
   y2-=(y2-y1)/2;
   y2+=(softedge/2);
   y2++;
   y2=MIN(m_height-1,y2);   
   
//--- prepare 
   COLOR_RGBA rgb=_ColorLumaMult(lightcolor,ABS(intensity));
   double r=(int)GETRGBR(rgb);
   double g=(int)GETRGBG(rgb);
   double b=(int)GETRGBB(rgb);  
   
   if (intensity<0)
      {
      r=0-r;
      g=0-g;
      b=0-b;
      }
   uint pixel;     
   int istart;
   int iend;
   int i;

//--- check direction
   if (updown)
      {
   //--- add main light   
      for(;y1<y2-softedge;y1++)
         {
         istart=y1*m_width+x1;
         iend=istart+(x2-x1);
         for (i=istart;i<=iend;i++)
            {
            pixel=m_pixels[i];
            m_pixels[i]=ARGB(GETRGBA(pixel),MIN(GETRGBR(pixel)+r,0xFF),MIN(GETRGBG(pixel)+g,0xFF),MIN(GETRGBB(pixel)+b,0xFF));// m_pixels[i]+=XRGB(r,g,b);
            //m_pixels[i]|=rgb;
            }
         }
      if (softedge==0)
         return;
   
   //-- Add soft edge 
      double decr=r/softedge;
      double decg=g/softedge;
      double decb=b/softedge;
   
   //--- Loop rows separate and adjust color each row   
      for (;y1<=y2;y1++)
         {
         r-=decr; r=MAX(0,r); 
         g-=decg; g=MAX(0,g); 
         b-=decb; b=MAX(0,b); 
         
         istart=y1*m_width+x1;
         iend=istart+(x2-x1);
         for (i=istart;i<=iend;i++)
            {
            pixel=m_pixels[i];
            m_pixels[i]=ARGB(GETRGBA(pixel),MIN(GETRGBR(pixel)+r,0xFF),MIN(GETRGBG(pixel)+g,0xFF),MIN(GETRGBB(pixel)+b,0xFF));// m_pixels[i]+=XRGB(r,g,b);
            }
         }
      }   
  }   
 
Doerk Hilger #: Vous voulez parler des effets d'éclairage ? Eh bien, de la lumière ajoutée :D Comme indiqué, CCanvas est également adapté uniquement dans les bases et la structure, mais pas dans les détails.
Je vois, merci. )
 
Реter Konow #:
Je vois, merci. )

N'hésitez pas à l'utiliser :)
PS : updown est en fait inutile, comme je le vois. De toute façon, la lumière vient d'en haut en général

 
Doerk Hilger #:

N'hésitez pas à l'utiliser :)
PS : updown est en fait inutile pour autant que je sache. De toute façon, la lumière vient généralement d'en haut.

Oui, vous avez une option intéressante, je vais l'essayer :)

Je fais fonctionner la distribution de la lumière dans l'autre sens - d'une couleur d'origine donnée vers une couleur plus claire. Je m'explique : l'algorithme de partitionnement des couleurs fonctionne correctement et écrit 256 nuances dans le tableau. C'est-à-dire la gamme complète de chaque couleur acceptée par la fonction. Mais l'algorithme de peinture n'applique le gradient sur les surfaces des éléments que dans une seule direction. Pendant longtemps, j'ai voulu ajouter des fonctionnalités, et faire un dégradé multidirectionnel, qui donnerait du volume et des éléments plans complexes. En principe, ce n'est pas une tâche difficile. Cependant, il y a beaucoup d'autres tâches plus importantes à accomplir).

 
Mon ami, si vous pouvez trouver comment utiliser l'interface graphique lors du backtesting de votre EA, je vous en serais reconnaissant.
 
Реter Konow #:
Ce n'est pas facile à faire. )

Pour autant que je sache, il n'y a pas de fonctionnalité dans la classe standard Ccanvas pour dessiner un gradient de couleur, comment avez-vous résolu le problème avec un gradient dans votre GUI ?
Tout est résolu par des formules dans le code
Dossiers :
 
Yu Zhang backtesting de votre EA, je vous en serais reconnaissant.

Rien de plus simple.

Le noyau décrit gère TOUS les événements, peu importe qu'il s'agisse d'un tick ou d'un événement graphique. Vous pouvez simplement obtenir la position de la souris, etc. également dans un tick, vérifier les changements et ensuite déclencher le OnEACylce() pour l'événement graphique. Vous n'êtes plus limité à quoi que ce soit.

 
Demain, je publierai une mise à jour détaillée de l'état d'avancement du développement.

Aujourd'hui, je peux dire que deux des six fondations de l'éditeur ont été posées.
 

État actuel du développement :

1. Un travail important a été réalisé pour intégrer des centaines de propriétés d'objets, d'éléments, de fenêtres et de paramètres dans les onglets et les tableaux de l'éditeur. Il était nécessaire de les séparer et de les trier. Environ 70 % de cette tâche a été accomplie. Toutes ces propriétés ne seront pas nécessaires aux utilisateurs dans leur travail, mais j'en ai besoin pour poursuivre le développement de l'éditeur.

2- Le mécanisme de défilement a été débogué. Désormais, chaque onglet "se souvient" de la position du curseur et lorsque vous revenez, le canevas défile automatiquement jusqu'au dernier endroit où vous l'avez vu.

3) Correction des décalages liés au défilement. Par exemple, lors du défilement avec la molette de la souris, les éléments interactifs ne réagissent pas au curseur au seuil de vitesse spécifié. Si le taux d'arrivée des événements de la roue est supérieur à 3 par seconde (300 ms entre les événements), les éléments tombant sous le curseur ne sont pas redessinés. De plus, seuls l'espace de la bande et ses composants sont dessinés pendant le défilement. Le reste de l'espace de la toile n'est pas ignoré.

4. Le travail des éléments T_FOLDER - table collapsers - a été ajusté. On peut le voir clairement sur la vidéo.

5. Des problèmes ont été trouvés et corrigés en ce qui concerne le phénomène des éléments.

6. La conception de la sous-fenêtre de l'éditeur est mieux pensée. Des solutions pratiques et esthétiques ont été trouvées. Cependant, il reste encore beaucoup de travail à faire dans ce sens.


Les projets les plus proches :

1. Ecrire les fonctions Get_property() et Set_property(). Elles permettront d'éditer des instances copiées à partir de modèles. La première fonction récupérera toutes les propriétés (plus de 300) de chaque élément en une fois et les placera dans les éléments d'édition dans les onglets de l'éditeur (ceux de la vidéo). La seconde fonction enverra les valeurs personnalisées de l'élément d'édition à la propriété d'instance modifiable sur le canevas principal (au centre).

2. Rétablir la fonctionnalité d'édition manuelle des éléments qui fonctionnait bien il y a 4 ans.


 
Nous sommes aujourd'hui le 21 décembre. Je m'attendais à ce que la version minimale de l'éditeur soit prête dans les dix premiers jours de décembre, c'est-à-dire avant le 20, et en principe il en aurait été ainsi si j'avais restauré la version minimale précédente qui fonctionnait auparavant, mais j'ai décidé de créer une version complète de l'éditeur. C'est pourquoi il y a eu beaucoup plus de travail que prévu.

Plus tôt, j'ai parlé des 6 principes de base d'un éditeur visuel. Permettez-moi de les rappeler :

1. Cloner des éléments/fenêtres.

Créer de nouvelles instances d'éléments en copiant des modèles et en modifiant leurs propriétés.

2. Suppression d'éléments/fenêtres.

Effacer les instances précédemment clonées du noyau.


3. Récupération des propriétés des fenêtres/éléments.

Les éléments de l'éditeur de propriétés doivent récupérer les valeurs des propriétés des instances qui se trouvent dans le champ d'édition.

4. Modification des propriétés des éléments/fenêtres.

Il existe au total deux façons de modifier les propriétés : (1) par l'intermédiaire des éditeurs d'éléments et (2) par l'édition manuelle des instances. Par exemple, l'ondulation, le déplacement, l'impression sur une surface x, etc.


5. Chargement de modèles/projets.

Fonctionnalité permettant de charger des modèles et des projets enregistrés dans l'éditeur pour une édition ultérieure.

6. Sauvegarde des modèles/projets.

Fonctionnalité permettant d'enregistrer les modèles et projets d'interface graphique terminés dans des fichiers en vue d'un transfert ultérieur vers des programmes personnalisés ou d'une utilisation en tant que version bêta et d'un rechargement en vue de l'édition ou de la copie de parties.

En général, il s'agit là des six éléments de base d'un éditeur visuel.

Comme septième base, j'ajouterais une interface d' éditeur graphique sans laquelle il ne peut pas fonctionner.


Avant la nouvelle année, je prévois de mettre en œuvre le clonage, la suppression et l'édition visuelle à la fois avec les éditeurs d'éléments et en mode manuel. Nous verrons ce que je peux faire à temps.