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

 
Anatoli Kazharski:

ElementSet, où vous devez spécifier (1) une propriété et une valeur ou (2) une propriété, un modificateur et une valeur.

Oui, c'est universel en termes d'accès aux propriétés du contrôle.

En général, PropGet/Set est un bon mécanisme pour gérer les classes modèles lorsque l'interface héritée est initialement inconnue.


Mais je veux ramener la discussion à ma question initiale - comment puis-je faire un "démarrage rapide" pour un programmeur sur le schéma de couleurs des contrôles ?

Et est-il possible d'implémenter non pas une fonction (SetBgColor ou SetProp(Enum_Color, ), etc.), mais une classe d'attributs plus universelle.
Ainsi, tous les contrôleurs accèdent à une classe universelle d'attributs et le codeur peut facilement comprendre quelle couleur est utilisée par quel contrôleur.

Mais tout ceci est mon raisonnement concernant mon schéma. Je n'exclus pas que cela change encore beaucoup quand je commencerai la transition. Ainsi, tout ce que j'ai écrit ci-dessus peut ne plus être pertinent pour le sujet discuté ici. )

Vous devez le développer jusqu'au résultat satisfaisant : plus les codeurs le comprendront, plus le seuil d'entrée sera bas dans vos classes de fonctionnalités également.
 
o_O:

En principe, je suis d'accord, il sera clair quelles couleurs il a et ce qui peut être changé.

Une question se pose alors : Thème implique-t-il la redondance des paramètres inutilisés ?

Oui, il est redondant, pour toutes les variantes. Mais il est alors pratique de créer un nouveau thème en repeignant et en modifiant les valeurs du thème précédent. Tout comme les thèmes dans Windows.

P.S.

Et je suis sceptique quant aux changements massifs de certaines valeurs par le codeur, différentes de celles utilisées dans le thème actuel. Cela me rappelle un projet Delphi dans lequel la première chose que vous essayez de faire est de peindre l'interface dans vos propres couleurs, qui ne changent ensuite pas lorsque vous changez le thème du système.

Et pourquoi maculer les styles de design quelque part ? Hériter d'une classe de thème de l'un des thèmes existants et redessiner uniquement les valeurs qui doivent être modifiées.

 

il y a cette technologie CSS

1) connu et bien documenté

2) familier et polyvalent

3) tags==contrôles en principe, ce qui le rend adapté à notre tâche


Essayez-le, il devrait fonctionner comme prévu.

 
o_O:

il existe une technologie CSS


Puis passez directement à LESS / SCSS (SASS)
 
Igor Volodin:

Puis passez directement à LESS / SCSS (SASS)

ugh, Lass est probablement bon, mais nous n'avons pas besoin de ses fonctionnalités. nous ne faisons pas un interprète.

Nous reprenons purement le principe de la construction et de la redéfinition des styles en cascade^sélectifs^points par points - comme ils le font.

 

Et veillez à inclure une option de conception réactive pour différentes résolutions. Voir Media Queries en CSS

Et certaines parties peuvent être de taille fixe, tandis que d'autres peuvent s'étirer autant qu'elles le peuvent.

 

Chers membres du forum, je n'ai aucune envie de démotiver qui que ce soit, mais à mon avis, la technologie dont il est question est si complexe qu'elle ne peut être mise en œuvre par des efforts conjoints dispersés. Nous ne pouvons pas combiner efficacement ces efforts car nous différons tous par nos niveaux de compréhension, notre professionnalisme et nos approches... Nous sommes également séparés par des distances et même des pays.

Ma conclusion est que cette technologie peut être mise en œuvre par un seul développeur qui y a travaillé longuement. Peut-être plus d'un an. Mais il est peu probable que cette personne fasse appel au crowdsourcing pour cette technologie, car elle a fourni trop d'efforts, trop d'âme, et s'est tout simplement épuisée dans ce travail... C'est son projet et il a le droit de ne pas le distribuer librement. (Peut-être au début, mais pas toujours).

Je pense que cette technologie a déjà été mise en œuvre dans MQL.

P.S. Même si c'est le cas, pourquoi ne pas essayer de le mettre en œuvre à nouveau ? ))

 
Igor Volodin:

Pourquoi cela pourrait être utile :

1. l'interface sur le bitmap est rapide. Si rapide qu'il est pratiquement impossible de le distinguer de l'interface du système. Par exemple, j'ai implémenté des éléments translucides avec des gradients, etmême lorsqu'ils se déplacent, ils sont rendus de manière fluide sans aucun retard visible, en tenant compte du mélange des couleurs et du calcul du canal alpha sur d'autres objets avec des gradients translucides.

2. L'interface est évolutive. Vous pouvez rendre l'application plus complexe et elle ne ralentira pas en raison de la suppression et de la création d'un grand nombre d'objets de graphe. Les coûts de redécoupage sont minimes, il s'agit simplement de remplacer une image, en millièmes de seconde.

3. Vous pouvez créer des contrôles prêts à l'emploi et offrir la possibilité d'en créer de nouveaux, car vous pouvez fournir votre propre pool d'événements, par exemple :

OnMouseDown - a appuyé sur le LKM

OnMouseUp - appui sur le bouton de la souris

OnMouseHoverOn - survol du curseur de la souris sur un objet

OnMouseHoverOut - éloigne le curseur de la souris de l'objet.

OnMouseClick : appuyer et cliquer dans les limites de l'objet.

OnMouseDblClick - double clic de souris dans les limites de l'objet.

OnDragStart - événement qui se produit une fois au début du mouvement avec le bouton gauche de la souris enfoncé

OnDragMove - événement généré lors d'un déplacement avec le bouton gauche de la souris

OnDragEnd - événement généré après un déplacement avec le LKM

OnPut - l'objet est transformé en un autre objet.

OnGet - l'objet est transféré vers un autre objet.

OnFocus - l'objet a reçu le focus

OnBlur - l'objet perd le focus

OnResize - l'objet a changé de taille

OnParentResize - l'objet parent a changé de taille.

OnKeyPress - une touche enfoncée

OnChange - la valeur d'un champ a changé

etc.

Vous exagérez un peu dans ce qui suit :

La vitesse à laquelle un bitmap est dessiné dépend de sa taille. Si vous redessinez l'ensemble du bitmap représentant la fenêtre lorsque vous redessinez la pièce, la réponse sera lente (vérifié). La solution évidente est de ne faire repeindre que la zone du bitmap.

Cependant, pour redessiner seulement une partie du bitmap représentant une fenêtre, vous devez stocker le masque numérique du bitmap en mémoire (dans un tableau). Ensuite, vous devez naviguer dans ce masque et y trouver le motif souhaité. Toutefois, il faut tenir compte du fait qu'il peut y avoir de nombreuses fenêtres. Maintenant, évaluez la quantité de mémoire nécessaire pour stocker les masques de toutes les fenêtres. Vous pourriez mettre au point un système de priorité pour choisir les fenêtres à retenir et celles à "oublier", et à quel moment. Cependant, ce n'est pas une tâche facile.

Il faut comprendre que redessiner, c'est réécrire des valeurs dans un tableau, et que si vous devez réécrire 1000000 valeurs (nombre approximatif de pixels dans l'image de la fenêtre et dans le bitmap), ce ne seront pas des "millièmes de secondes", mais des secondes. Par conséquent, il est préférable de ne dessiner entièrement une fenêtre qu'une seule fois, de la sauvegarder en mémoire et ensuite, lors d'événements, de redessiner chaque objet séparément. La vitesse sera alors très élevée.

Apparemment, vous n'avez implémenté que des objets séparés, mais essayez de créer une fenêtre et d'y implémenter l'interactivité de ses éléments. Vous comprendrez ce que je veux dire.

Quant aux événements que vous avez cités, leur mise en œuvre dans le programme n'est pas liée à la technologie des contrôles de dessin et devrait être présente dans toute interface.

 
Реter Konow:

...

Apparemment, vous n'avez implémenté que des objets individuels, mais essayez de créer une fenêtre et d'y implémenter l'interactivité de vos éléments. Vous verrez ce que je veux dire.

...

Lisez ce post(lien) et regardez les exemples d'animations gif là aussi.
Обсуждение статьи "Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1)"
Обсуждение статьи "Графические интерфейсы I: Подготовка структуры библиотеки (Глава 1)"
  • www.mql5.com
Включение в проект классов для хранения указателей и обработки событий.
 
Реter Konow:

Vous exagérez légèrement ce qui suit :

La vitesse de dessin des bitmaps dépend de leur taille. Si vous repeignez l'ensemble du bitmap représentant une fenêtre, la réponse sera lente (testé). La solution évidente est de ne faire repeindre que la zone de la pièce à repeindre.

Cependant, pour redessiner seulement une partie d'un dessin bitmap représentant une fenêtre, vous devez avoir un masque numérique de ce bitmap stocké en mémoire (dans un tableau). Ensuite, vous devez naviguer dans ce masque, et trouver la partie que vous voulez. Toutefois, il faut tenir compte du fait qu'il peut y avoir de nombreuses fenêtres. Maintenant, évaluez la quantité de mémoire nécessaire pour stocker les masques de toutes les fenêtres. Vous pourriez mettre au point un système de priorité pour choisir les fenêtres à retenir et celles à "oublier", et à quel moment. Cependant, ce n'est pas une tâche facile.

Il faut comprendre que redessiner, c'est réécrire des valeurs dans un tableau, et que si vous voulez réécrire 1000000 valeurs (nombre approximatif de pixels dans l'image de la fenêtre et dans le bitmap), cela prendra des secondes, pas des "millièmes de seconde". Par conséquent, il est préférable de ne dessiner entièrement une fenêtre qu'une seule fois, de la sauvegarder en mémoire et ensuite, lors d'événements, de redessiner chaque objet séparément. La vitesse sera alors très élevée.

Vous n'avez probablement implémenté que des objets uniques, mais essayez de créer une fenêtre et d'y implémenter l'interactivité de vos éléments. Vous comprendrez ce dont je parle.

Quant aux événements que vous avez cités, leur mise en œuvre dans le programme n'est pas liée à la technologie des contrôles de dessin et doit être présente dans toute interface.

Je voudrais apporter une petite précision :

Tout d'abord, nous créons un masque numérique de la fenêtre avec tous ses éléments. Ensuite, nous créons un bitmap avec ResourceCreate(). On a notre fenêtre sur la carte.

Ensuite, nous déplaçons la souris sur l'interface de cette fenêtre et attrapons, par exemple, l'événement de pointage (_Object_Pointed).

Je vais décrire deux approches de la mise en œuvre de l'interactivité des objets - l'une mauvaise, l'autre meilleure :

1. Si le masque numérique de notre fenêtre n'a pas été sauvegardé dans le tableau après sa création, alors pour modifier un détail du dessin de cette fenêtre, nous devons le recréer entièrement. C'est-à-dire que vous devez le re-digitaliser. Cette opération prend du temps en soi, car il faut initialiser le tableau avec les valeurs de couleur des pixels de tous les détails de la fenêtre afin de le transmettre à ResourceCreate(). Plus la fenêtre est grande et plus elle contient de détails, plus le processus sera long (environ 250 millisecondes à 2 secondes). Et ainsi de suite, sur chaque événement de chaque élément. Cette option est trop défectueuse.

2. Si un masque numérique a été stocké dans un tableau, nous devons seulement réinitialiser les valeurs qui se rapportent à une partie spécifique de cette fenêtre. Nous trouvons cette partie dans le tableau et réécrivons ses valeurs. Ensuite, - nous envoyons le tableau à ResourceCreate() et obtenons immédiatement le résultat.

C'est en fait toute la technologie. Presque))