IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET]Mes controles graphiques se redessinent trop lentement


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 11
    Points
    11
    Par défaut [VB.NET]Mes controles graphiques se redessinent trop lentement
    J'ai des panels sur lesquels j'ajoute des controls (combobox, checkbox) dans mon code. C'est à dire que je ne le fais pas dans le designer car ça doit être dynamique.

    Pour passer d'un panel à un autre j'utilise sa propriété visible.

    Mais lorsque j'affiche un panel, les controls apparaissent rapidement de haut en bas ce qui donne un effet de déroulement des controls assez désagréable à l'utilisation.

    A quoi cela est il dû ? y'a til un moyen de contourner se problème ?

    voici un bout de mon coe qui ajoute les controls :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        Private Function CreateNewCheckBox(ByVal name As String, ByVal text As String, ByRef controlLocation As Point) As CheckBox
     
            Dim newCheckBox As New CheckBox
     
            newCheckBox.Name = name
            newCheckBox.Text = text
            newCheckBox.Appearance = Appearance.Button
            newCheckBox.Size = New Size(26, 23)
            newCheckBox.TextAlign = ContentAlignment.MiddleCenter
            newCheckBox.Location = New Point(controlLocation.X, controlLocation.Y)
            controlLocation.Y += 25
            newPanel.Controls.Add(newCheckBox)
     
            Return newCheckBox
     
        End Function

    Merci !

  2. #2
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut
    Tu as essayé d'ajouter tes contrôles avec la propriété visible à false, puis de les rendre visible une fois que tous les contrôles ont été ajoutés pour voir ce que ca donne ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    oui c'est ce qui est fait, les panels sont superposés et tous non-visibles
    dès que l'utilisateur clique à un endroit, un seul panel se met à visible = true

    les controls eux sont sur le panel et deviennent visible ou non suivant la propriété visible du panel

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    J'ai remarqué que sur le studio .Net 2005 c'est toujours le cas.
    J'ai décidé d'utiliser des contrôle Infragitics et c'est pire.
    Pour utiliser un programme créé avec Sutio .net, j'ai l'impression qu'il
    faut avoir une machine de course pour ne pas se rendre compte des lenteurs
    graphique. Je désepère. Ya peut-être une solution mais je ne l'ai pas trouvé.
    Si de votre coté vous avez trouvé quelques chose, je suis preneur, Merci

  5. #5
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Salut

    Essaie de rajouter MonPanelParent.SuspendLayaout avant d'ajouter tes controles et MonpanelParent.ResumeLayout a la fin de l'operation

  6. #6
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Personnellement, jouer sur le layout ne donne rien chez moi ...

    Cependant j'ai remarqué que cela tenait beaucoup de la capacité de la carte graphique --> sur mon PC (assez pourri avec une carte graphique avec cache 8Mo) ça s'affiche en saccades ... sur le PC du boulot beaucoup plus gonflé notamment au niveau de la carte graphique, tout s'affiche d'un coup sans saccade.

    Donc ça m'inquiéte pas personnellement tant que le matos derriére tient le choc.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si le layout ne change rien, il reste 2 propriétés à mettre sur le form.load
    me.Setstyle(allpaint quelque chose, true)
    me.Setstyle(doublebuffer,true)
    et avec un peu de chance le pannel a cette propriété setstyle aussi et donc lui faire la meme chose ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut
    Bonjour,

    J'ai le même genre de problème, mais avec des contrôles persos. En fait je pense que le problème apparait quand il y a bcp de contrôles sur une form.

    J'ai essayer de jouer sur le layout et les propriétés "SetStyle", mais sans grand succés.

    Le plus râlant, c'est que mon programme a été développé à l'origine avec VB6, et qu'il n'y avait pas ce problème de rafraichissement

    Ci dessus un exemple de mon application, le problème de rafraichissement ce produit à l'ouverture, puis à chaque changement d'onglets.
    Effectivement, avec une bonne carte graphique, le phénomène se voit moins, mais bon..., je me vois mal dire à mes clients qu'il faut un PC digne d'un hardcore-gamer, pour afficher une centaines de Textbox

    Nom : sample.JPG
Affichages : 675
Taille : 142,5 Ko

    Donc si quelqu'un a une solution ou explication de ce problème, ca m'interresse aussi.

  9. #9
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    as-tu essayé au changement de panel

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.DoEvents();

    Bye

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    une réponse qui à priori marche (moi je l'ai pas encore testé mais un de mes collègues à trouvé apparement)

    me.opacity = 0
    me.show
    timer à 10 millisecondes .start

    sur l'evenement du timer :
    me.opacity = 100
    timer.stop
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Je vois que je ne suis pas le seul a chercher une solution viable pour afficher une form avec plein de controls ou avec une image en background (pire)

    Juste je rajoute le fait que meme avec une super bete de course, c'est strictement la meme chose, c'est tjrs lent (teste avec biproc intel 2x3Ghz avec 8Mo Cache et 3Go Ram)

    La solution de sperot51 fonctionne sans probleme, on en a deja parle il y a peu, mais uniquement à l'ouverture de la form ... apres c'est 8088 powa !!!

    Perso je continue a chercher une solution, mais je commence a penser que c'est peine perdue !!!
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  12. #12
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    J'avais souvent ce problème lorsque le form_load contenait beaucoup d'instructions. En supprimant le code du form_load et en le déplaçant dans le constructeur, ça a résolu le problème. C'est une des raisons possibles pour les problèmes de rafraichissement.
    Il peut aussi être bon de n'affecter les eventhandler qu'après l'initialize components, histoire d'éviter le déclenchement d'event intempestifs. Dans une méthode addEventListeners par exemple, et de ne pas les paramétrer dans le designer directement.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  13. #13
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Malheureusement, meme avec un form_load vide, c'est la meme chose.

    Durant mes nombreux tests, j'ai pu remarquer que les dimensions de la form rentrent en compte sur les performances d'affichage.
    cad qu'un form en 1280x1024 sera plus lent que le meme form en 200x180 avec le meme nombre d'objects et tous visibles ...
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  14. #14
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ca ne vient pas du code dans le form load ou autre, c'est bien les controles du framework qui sont lent
    surtout quand les controles sont transparents
    par exemple poser 50 labels avec des images qui clignotent toutes les 500ms et meme pc de gamer, ca peut prendre plusieurs 10aine de pourcent en ressources processeur. bien du n'importe quoi !
    mais il y a des solutions, on arrive maintenant à 0%

    la meilleure solution pour ne pas bricoler c'est de réécrire les composants selon son usage en héritant de system.windows.forms.control (voir meme de component pour les fous)
    ou alors de trouver des autres méthodes moins gourmandes pour faire la meme chose
    ou encore refaire des controles en retirant des choses, par exemple hériter de bouton et overrider les méthodes qui sont lentes

    tu peux détailler un peu ce que tu as sur tes feuilles si tu veux quelques pistes

    enfin si tu as des controles transparents et un fond sur ta feuille il faudra refaire des composants, si tes controles ne sont pas transparents, y a ptete des méthodes plus simples comme faire les drawimage toi meme plutot que d'utiliser les propriétés image
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Merci pour toutes ses infos sperot51.
    Pour l'instant, j'ai abandonne l'idee de mettre une image en background en attendant que ...

    Sur mes feuilles, il y a quasi de tout (des images à des tableaux de data) et la solution de reecrire tous les composants n'est pas vraiment envisageable.

    Sinon tu me parles de drawimage, peux tu m'en dire un peu plus et eventuellement un petit exemple.

    Au plaisir.
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  16. #16
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ce qui ralenti les controles c'est les évènements onpaint et onpaintbackground
    réécrire des controles dans le sens descendants doit etre faisable dans votre cas quand meme


    enfin il faut faire quelques tests pour voir si c'est mieux
    mais par exemple si vous voulez gérer l'image vous meme, il faut objet.CreateGraphics.DrawImage(image,...)

    enfin mieux encore c'est d'avoir un objet bufferedgraphics
    qui a une méthode render qui prend environ 10x fois moins de temps que de faire un drawimage (drawimage est utilisé aussi par le framework)


    début de piste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class monbouton
    inherits button
     
    private _Buffer as system.drawing.bufferedgraphics
    private _BackgroundImage as system.Drawing.image
     
    overrider property Backgroundimage pour stocker l'image en privé et ne pas la renvoyer sur mybase
    et au passage si <> nothing faire buffer.graphics.drawimage()
     
    overrider onpaint et mettre dedans :
    if _backgroundimage isnot nothing then buffer.render
     
    et dans le new :
    buffer = system.drawing.bufferedgraphicsmanager.current.allocate()


    ce code doit faire en sorte qu'une image de fond sur un bouton soit rapide
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 682
    Points : 1 952
    Points
    1 952
    Par défaut
    Citation Envoyé par sperot51
    ce code doit faire en sorte qu'une image de fond sur un bouton soit rapide
    En fait, l'affichage du background est sans probleme, ce sont les controles qui posent problemes.
    Je vais qd meme tester et voir un peu.

    Sinon le objet.CreateGraphics.DrawImage(image,...) j'ai deja fait et sans aucun resultat.
    Idem pour le doublebuffered ou c'est l'inverse (qui affiche plus rapidement les controls, mais ou le background est lent), qui doit peut etre etre exploitable avec la deuxieme solution.

    Si je vous dit que j'ai mal à la tete quand je recommence a parler de ce sujet
    Que les neurones soient avec toi, jeune padawan.
    Ne pas oublier, qu'un métier, développer être.
    Effectuer des recherches et lire les tutos, avant de poster, tu dois.
    Aucune question technique, faites par MP, tu ne dois.

  18. #18
    AP
    AP est déconnecté
    Membre confirmé
    Avatar de AP
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 480
    Points : 538
    Points
    538
    Par défaut
    Bonsoir,
    J'ai également le même problème que toi, une form contenant pas mal de contrôle est assez vite inexploitable. J'ai cherché pas mal de temps comment optimiser la chose.
    Il y a quelques petites pistes (suspend layout & cie) mais le gain de performance est assez négligeable.
    Je pense comme l'a dit sperot51 que cela vient de l'implémentation des contrôles du framework. Tous les contrôles héritent de control, qui est géré par le système d'exploitation comme (en fait c'est) une fenêtre.
    En général les programme VB6 utilisaient des control windowless ce qui évitait les ralentissements.
    La solution est de réécrire ses composants en héritant de de component afin de ne pas avoir de fenêtre sous-jacente.
    J'ai commencé à réécrire ma propre bibliothèque de contrôle "light" pour .NET. Ce n'est pas une mince affaire car réaliser qqlch de pratique, rapide, réutilisable, qui soit joli dispose en plus d'un mode design tient assez d'une mission impossible.
    Cependant je ne désespère pas d'arriver à qqlch d'utilisable.
    Si vous trouvez uen autre solution je suis preneur

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    moi j'suis dans une boite ou on a pas le choix il faut utiliser plein de controles sur la meme feuille

    j'ai refait des tests pour avoir des mesures plus précises
    avec 100 labels sur une feuille et une image qui clignote sur chaque toutes les 500ms ca me donne 20% de ressources processeurs sur un dual core ! et en plus il faut bien une bonne demie seconde entre le 1er et le dernier qui change

    avec mon label refait je tombe à 3% et c'est quasi instantané

    donc c'est faisable
    enfin j'y ai bien mis une bonne semaine
    enfin j'ai refait un control et je repars de celui là pour avoir un label, une image et un bouton

    après, beaucoup de fonctions sont reprises du framework, en passant par reflector pour certaines
    ca fait moins de code à écrire ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  20. #20
    AP
    AP est déconnecté
    Membre confirmé
    Avatar de AP
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    480
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 480
    Points : 538
    Points
    538
    Par défaut
    Citation Envoyé par sperot51
    moi j'suis dans une boite ou on a pas le choix il faut utiliser plein de controles sur la meme feuille

    j'ai refait des tests pour avoir des mesures plus précises
    avec 100 labels sur une feuille et une image qui clignote sur chaque toutes les 500ms ca me donne 20% de ressources processeurs sur un dual core ! et en plus il faut bien une bonne demie seconde entre le 1er et le dernier qui change

    avec mon label refait je tombe à 3% et c'est quasi instantané

    donc c'est faisable
    enfin j'y ai bien mis une bonne semaine
    enfin j'ai refait un control et je repars de celui là pour avoir un label, une image et un bouton

    après, beaucoup de fonctions sont reprises du framework, en passant par reflector pour certaines
    ca fait moins de code à écrire ...
    Aurais-tu une liste des fonctions les plus consommatrice de temps à éviter et leur remplacement?

    Merci et bonne journée

Discussions similaires

  1. [VS .NET] Dessiner un graphique
    Par joujoukinder dans le forum Visual Studio
    Réponses: 2
    Dernier message: 15/05/2005, 20h12
  2. [vb.net] line control ?
    Par graphicsxp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/05/2005, 15h01
  3. [Crystal Reports 10] [VB.NET] Afficher un graphique
    Par nanou_toulouse dans le forum SDK
    Réponses: 7
    Dernier message: 24/01/2005, 12h55
  4. Réponses: 5
    Dernier message: 10/06/2004, 21h00
  5. [CR9][VB.NET] Crénelage des graphiques
    Par Bazoom dans le forum SDK
    Réponses: 5
    Dernier message: 24/02/2004, 02h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo