Afficher des boutons ou autre contrôle dans un backbuffer

orobin38 Messages postés 5 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 21 décembre 2007 - 12 déc. 2007 à 11:14
noah56 Messages postés 9 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 27 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

7 réponses

Beetlejuice1988 Messages postés 13 Date d'inscription mercredi 14 février 2007 Statut Membre Dernière intervention 13 décembre 2007 1
13 déc. 2007 à 09:55
As-tu essayé d'utiliser Application.DoEvents() afin que tout se charge avant de passer à la suite?
0
orobin38 Messages postés 5 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 21 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.

je continue à chercher.

merci
Olivier
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
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.

Voilà
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
19 déc. 2007 à 23:35
Et j'ajoute, pour les buffers graphiques, va voir ca:

http://msdn2.microsoft.com/en-us/library/system.drawing.bufferedgraphics.aspx

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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
orobin38 Messages postés 5 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 21 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(

merci pour l'aide
Olivier
0
orobin38 Messages postés 5 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 21 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.

merci
Olivier
0
noah56 Messages postés 9 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 27 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.
0
Rejoignez-nous