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

VB.NET Discussion :

Déclenchement de OnPaint [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut Déclenchement de OnPaint
    Bonjour, j'ai compris que l'exécution d'une application démarre par l'affichage du Form1 (par défaut) donc du déclanchement de l'évènement Form1_Load. Est-ce que l'affichage du Form1 génère un évènement OnPaint qui déclanche lui-même l'évènement Paint ?
    Dans le code qui suit je n'ai pas de déclancheur de l'évènement Paint, pourtant il s'exécute ???
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Public Class Form1
     
        Private Sub Fenetre_1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.SetDesktopLocation(50, 200)
            Me.Size = New Size(500, 500)
            Me.Text = "Fenêtre 1"
            Fenetre_2.Show()
        End Sub
        Private Sub Fenetre_1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
            Dim Position As New Point(100, 100)
     
            Deplace_Est(Position, e)
        End Sub
        Private Sub Deplace_Est(ByRef Position As Point, ByRef e As System.Windows.Forms.PaintEventArgs)
            Dim Point_Av As New Point
            Dim Point_Ar As New Point
            Dim i As Integer
     
            'direction Est
            For i = 1 To 100
                Position.X = Position.X + 1
                'image avant
                Point_Av.X = Position.X
                Point_Av.Y = Position.Y - 8
                e.Graphics.DrawImage(My.Resources.Cellule_Est_Av, Point_Av)
                'image arrière
                Point_Ar.X = Position.X - 16
                Point_Ar.Y = Position.Y - 8
                e.Graphics.DrawImage(My.Resources.Cellule_Est_Ar, Point_Ar)
     
                Pause(30)
            Next
     
        End Sub
        Private Sub Pause(ByVal Delai As Integer)
     
            System.Threading.Thread.Sleep(Delai)
        End Sub
     
    End Class
    Merci de me préciser ce point.
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  2. #2
    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
    en copiant ton code chez moi ca passe bien dans l'event paint du form



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Class Form1 / Sub Fenetre_1_Paint
    tu as renommé les choses à moitié ?

    il ne faut pas utiliser les variables par défaut ayant le même nom que les forms, mais faire un new du form avant le show (peut etre l'as tu fait ailleurs)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Threading.Thread.Sleep
    ceci est interdit sur le thread principal, sinon freeze de l'appli, message de windows "l'appli ne répond pas" ...

    il te faut un timer plutot qu'une boucle
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    Je te remercie Pol63 de tes remarques sur mon code mais ça ne répond pas à ma question. Le code marche aussi chez moi, et c'est ce que je ne comprends pas (il n'y a pas que ça - d'autres questions viendront ensuite). Je voudrais savoir ce qui déclanche l'évènement Paint. Il semble qu'il est lui-même déclanché par OnPaint ce qui déplace la question : Qu'est-ce qui déclanche OnPaint dans mon code ?

    P.S. je reviendrais ensuite sur les aspects timer et déclaration des forms
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  4. #4
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Citation Envoyé par horemheb Voir le message
    Qu'est-ce qui déclanche OnPaint dans mon code ?
    Ce qui déclenche OnPaint c'est toi, lorsque tu demandes l'affichage d'un control.
    La méthode OnPaint de la classe Control distribue simplement l'événement Paint aux récepteurs d'événements inscrits.

    Ils en parlent un peu ici : Rendu d'un contrôle Windows Forms ©MSDN
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  5. #5
    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
    dans le framework, tous (ou presque) les évènements sont déclenchés par des méthodes overridable OnEvent, c'est une norme que microsoft s'est imposée car elle est pratique

    pour l'event Paint on trouve donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Protected overridable sub Onpaint
      raiseevent paint
    keypress => onkeypress etc...
    Protected overridable permet en cas d'héritage de ne pas lever l'event si on ne le souhaite pas

    mais ca ne répond toujours pas à ta question ^^

    concernant paint, c'est windows et la hiérrarchie des controles en grande partie qui fait que c'est appelé
    windows pour gérer les fenêtres des applis (pas seulement .net) s'appuie sur un mécanisme de pompe à message
    quand une touche est appuyée et qu'une fenetre a le focus, windows le précise à la fenêtre, en .net on se retrouve donc avec onkeydown etc...
    quand windows veut qu'une fenetre soit affichée il envoie un message de rafraichissement demandé, qui se traduit par un onpaint
    à noter que la classe form hérite de la classe control, donc ce qui concerne form concerne control
    quand un form recoit onpaint, il y a ensuite une chaine de onpaint sur les controles enfants, qui se dessine chacun leur tour, en récursif
    modifier une propriété d'un control (ou d'un form donc) appelle invalidate, qui lui appelle onpaint (donc ici ca ne vient pas de l'OS)

    à noter qu'à partir de vista les fenêtres sont mises en cache, il y a donc peu d'event onpaint
    sur xp par exemple, déplacer une fenetre au dessus d'une autre fait que windows va demander à celle du dessous de se redessiner des centaines de fois (à partir de vista il y a un bitmap en cache donc moins de traitement)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut Une réponse amène une autre question
    Donc c'est bien l'affichage de la fenêtre qui déclanche un OnPaint qui lui-même renvoie sur Paint et exécute la suite de mon code.

    Concernant le code de départ c'est sûr, il n'est pas parfait. Il me semble anormal de mettre (comme je l'ai fait) le corps du programme dans une définition de classe. Je le verrais plutôt de la façon suivante :
    un module Main qui reprend le corps du programme qui, entre autres, déclare et ouvre (selon les besoins) les fenêtres,
    un module Fourre_tout pour y mettre toutes les déclarations et procédures diverses,
    un module WindowsForm par fenêtre, avec uniquement sa déclaration de Classe plus quelques compléments si nécessaire.
    Qu'en pensez-vous ?
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  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
    Citation Envoyé par horemheb Voir le message
    Donc c'est bien l'affichage de la fenêtre qui déclanche un OnPaint qui lui-même renvoie sur Paint et exécute la suite de mon code.
    oui mais par définition tu ne peux pas savoir quand paint va être appelé, donc il faut bien n'y faire que du dessin et pas du calcul et encore moins du traitement

    Citation Envoyé par horemheb Voir le message
    ...
    normalement il faut des classes pour les traitements
    les forms doivent contenir le code de gestion de l'interface et le code de navigation dans l'interface
    après y mettre du code "métier" n'est pas forcément grave, surtout sur des petits projets
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    Je commence à y voir plus clair
    Merci
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déclenchement inattendu de l'événement OnPaint
    Par ninaleo dans le forum Langage
    Réponses: 10
    Dernier message: 01/09/2014, 22h57
  2. [PaintBox] Persistance du dessin non créé dans onPaint
    Par princesse dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/04/2004, 17h47
  3. Déclenchement sur select
    Par sdinot dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 02/04/2004, 11h52
  4. 1er déclenchement d'un trigger d'auto-incrément
    Par babylone7 dans le forum Administration
    Réponses: 11
    Dernier message: 11/03/2004, 16h21
  5. Déclenchement Programme sur Virtual Key
    Par Tom-G dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 09/05/2003, 12h58

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