Afficher des boutons ou autre contrôle dans un backbuffer
orobin38
Messages postés5Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention21 décembre 2007
-
12 déc. 2007 à 11:14
noah56
Messages postés9Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention27 février 2008
-
28 janv. 2008 à 14:19
Bonjour,
je travaille sur un projet en VB.NET, type WinApp.
dans mes Forms, j'ai, entres autres, des boutons, type graphique :
je veut dire par là que le bouton est une image, de petite taille (60x60 pixel par exemple), affiché en modifiant la propriété backgroundimage de chaque bouton.
mon problème est que sur une form complexe, avec plusieurs boutons, un datagrid, des textbox, des labels, ma Form se compose avec un effet vilain de clignotement, on a l'impression parfois que l'on vois pendant un quart de seconde le fond du bureau, ou d'une fenêtre placée sous la fenêtre de mon application, ceci le temps que tout s'affiche.
une fois la forme affichée, tout réagit correctement.
j'ai essayé de passer ma Form en gestion avec Doubuffer, en faisant comme suis :
Me.SetStyle(ControlStyles.AllPaintingInWmPaint
Or ControlStyles.UserPaint
Or ControlStyles.DoubleBuffer,
True)
placé dans la méthode Load() de ma Form.
cela ne suffit pas, cela améliore un tout petit peu mon problème d'affichage, mais cela continue à se composer avec des effets visuels bizarre.
après avoir fait pliens d'essais de toute sorte, j'arrive à la conclusion :
il me faudrait pouvoir composer la Form, dans un backbuffer, et n'afficher ce backbuffer qu'un fois tout composé dedans.
j'ai réussi à créer un backbuffer, pour dessiner des trait, des point, mais je n'arrive pas à créer un backbuffer, et lui dire que tout composant de ma form doit s'afficher dedans.
ou il me faudrait pouvoir composer la frame, de manière invisible, puis la rendre visible d'un coup. cela non plus je n'y suis pas arrivé.
quelqu'un aurait t-il une idée du procéder pour me permettre de dessiner des boutons, des labels, de panels dans un backbuffer, pour afficher ce backbuffer d'un coup, à un moment choisi par moi même ?
merci
Olivier
A voir également:
Afficher des boutons ou autre contrôle dans un backbuffer
orobin38
Messages postés5Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention21 décembre 2007 17 déc. 2007 à 12:41
oui, j'ai essayé. cela ne suffit pas.
il semble que je vais devoir écrire mes propres composants, par contre je ne trouve aucun tutorial sur la création d'un composant, avec écriture de la partie affichage, et éventullement comment gérer un double buffer.
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 19 déc. 2007 à 23:09
Salut Olivier,
Moi qui aime bien faire de jolies interfaces, je connais aussi ce problème... et d'ailleur pas besoins d'y avoir bcp d'images pour que l'apparition des contrôles se fasse par étape, en affichant un carré noir à la place avant qu'ils ne soient dessinés...
Ma solution? très simple
A la création, fixe l'opacité de ta form à 1%, puis donne lui sa valeur normale dans l'événement Shown:
Private Sub Shown(Sender as Object, e as EventArgs)
Me.Opacity = 1
End Sub
De cette façon, lors du chargement de la page et de ses contrôle, la fenêtre sera pratiquement transparente, et donc tous les défauts que tu cite ne seront pas visibles. Une fois la page complètement chargé (lors de l'appel de la fonction Shown), le tout sera affiché un 1 seule fois, sans scintillement, sans étape, sans aucun défaut.
Essaie l'exemple, ca montre 3 techniques de dessins:
- La standard, celle qui fait tout scintiller
- La méthode que tu as utlisé, avec
SetStyle
- Et enfin, le méthode que je conseil: l'utilisation de BufferedGraphics
Cette dernière méthode te permet de dessiner directement dans le buffer grace à sa propriété Graphics, puis de l'afficher très rapidement:
Private Buffer As BufferedGraphics
Private Sub CreateBuffer()
' Appeler cette fonction au chargement de la form et lorsque on veut
' modifier le fond
Dim context As New BufferedGraphicsContext
context.MaximumBuffer = New Size(400, 400)
Dim g As Graphics = me.CreateGraphics
Buffer
= context.Allocate(g, me.ClientRectangle)
' Et là tu peux dessiner ce que tu veux dans Buffer.Graphics
' Lorsque on change le buffer, on veut le plus souvent directement l'afficher:
me.Invalidate ' Pour demander un Paint de la form
' ou (méthode direct cette fois, sans attendre l'événement Paint):
Buffer.Render(g)
End Sub
Private Sub Form_Paint(Sender as Object, e as PaintEventArgs) Handles me.Paint
Buffer.Render(e.Graphics)
End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
orobin38
Messages postés5Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention21 décembre 2007 21 déc. 2007 à 13:44
bonjour,
merci pour la réponse, mais j'ai une info qui semble peu difusée :
l'opacité ne marche pas avec des fenêtre fille dans une fenetre MDI
:o(
cela est mon cas.
de ce fait, je suis toujours bloqué.
de plus, pour aider comme je peux, j'ajoute :
le fait de passer une fenêtre fille en MDI la rends bizarre.
j'ai par exemple tenté de créer ma form, de la rendre invisible, le simple fait de la rattacher au parent MDI la rends visible, et fait tout clognoter de manière très pourrie
bref, je suis un peu coincé, car le coté MDI, cela m'est imposé :o(
orobin38
Messages postés5Date d'inscriptionmardi 11 septembre 2007StatutMembreDernière intervention21 décembre 2007 21 déc. 2007 à 13:48
re bonjour,
la méthode qui permet d'écrire directement dans un buffer me semble la mieux, mais elle impose de refaire ses composants personnels : bnoutons, labels, panel, groupbox, datagridview.
car en effet, on peut déssiner directement dans un graphique : des lignes, des carré, des textes, des cercles, des images.
c'est là ou je bloque : j e n'arrive pas à créer un custom control, je n'arrive pas à comprendre comment je pourrais relier mon backbuffer de mon application, avec le backbuffer d'un custom control.
bon, je met à tête à bouillir, je ne laisser pas encore tomber.
noah56
Messages postés9Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention27 février 2008 28 janv. 2008 à 14:19
Salut
Si quelq'un peut m'aider ? Voilà! je me suis amusé a écrire un control bouton avec plusieurs option en autre bouton rond, rectangle arrondie...
par contre je n'arrive pas à mettre en ligne le bouton suivant ne fonctionne pas. Faut-il être abnné pour mettre des programmes sur vbfrance ?
Merçi de vos réponses.