Fred a écrit :../..Personnellement, je ferais un canvas par gadget, ce sera plus simple à gerer../..
De ce côté là, dans mon implémentation en tous cas, cela revient au même car chaque 'viewport' est concu pour être autonome, même si il reçoit les events de son 'parent' au lieu de son canvas (si il en a un). Donc la complexité est identique en terme de code.
Fred a écrit :../.. et bien plus rapide à rafraichir (StartDrawing() lock toute la surface, donc si la resolution de ton ecran est 4K par exemple, ton PC va morfler à chaque modif, meme mineure (genre un cursor qui clignote dans un champ d'entrée)../..
C'est ça que j'ai du mal à comprendre. D'après mes essais, même avec un Canvas qui rempli tout un écran en 1920x1200 (ou presque, moins les bord de la fenêtre), cela reste très rapide et je n'ai aucun problème de curseur clignotant ou autre. Mais il y a sans doute un truc qui m'échappe.
D'un autre côté, je n'arrive pas à m'enlever de l'idée que si chaque 'viewport' a son propre Canvas, lors d'un resize global de la fenètre ou du déplacement d'un des splitter de plus haut niveau, un seul Canvas me semble beaucoup plus efficace.
Voici un exécutable du projet en cours:
raafal.gui.20130829.rar
Vous pouvez vous amuser à splitter et re-splitter les viewports (en cliquant sur les V,H,Q) et les redimensionner et observer le vitesse. De mon côté cela me semble correct, dites-moi ce que vous en pensez.
(en cliquant sur M on maximise, X pour fermer, ALT+M on crée un groupe de maximisation, il faut alors splitter ce viewport et maximiser un viewport fils pour comprendre l'effet. En cliquant sur le 'o' en haut à gauche de chaque viewport on toggle le header. Lorsque qu'il n'est pas visible il suffit d’amener la souris en haut à gauche ou en haut à droite pour le faire apparaître. Les 'tabs' ne sont pas opérationnels pour l'instant).
Ne vous attardez pas trop sur les 'fonctionnalités' en elles-mêmes mais plutôt sur la rapidité du redimensionnement des viewports, votre avis m'intéresse beaucoup.
Dans cette exemple, il n'y a donc qu'un seul Canvas, et un seul StartDrawing() par update (c'est le viewport 'root' qui le déclenche et demande ensuite à tous ses 'fils' de redessiner, si besoin, car un viewport peu 'Invalider' sa zone, ce qui déclenche le StrartDrawing() du root, mais seul le viewport ayant appelé le invalidate est redessiné dans ce cas).