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 :

Control personnalisé complexe


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Par défaut Control personnalisé complexe
    Bonjour à tous,

    Je cherche depuis longtemps à créer un control personnalisé complexe, composé de plusieurs sous-controls.

    Quelques exemples d'utilisation pour bien comprendre :

    - un control représentant le support d'une carte d'identitié dans lequel un autre control représente la photo.
    - un control représentant un camembert de Trivial Poursuit dans lequel un/des control(s) représentent des portions.
    - etc.

    Dans ces 2 exemples les sous-controls auront leurs propres évènements.

    Pour les controls principaux et secondaires j'ai créé une classe. Dans mon cas, n'étant pas des controls rectangulaires, j'ai utilisé des régions d'une forme particulière que j'ai affecté à mes classes (j'espère être clair... ).

    Dans ma classe n°1 (mon camembert par exemple), j'ajoute le control n° 2 (ma portion) via une commande du sytle "me.controls.add(maPortion)". Le problème est qu'à partir de cet ajout le système semble boucler (tout devient lent et impossible de débugger). --> en testant diverses possibilités j'ai constaté que le fait d'affecter une région au control n°2 provoquait le problème (mais peut être que je me trompe...)

    Pour vous aider à mieux comprendre mon problème, je vous joins un programme exemple (mon camembert est représenté par un control "Triangle" et ma portion par un control "Cercle"). A la ligne 53 de la classe n°1, le simple fait de décommenter la ligne, entraîne le problème évoqué ci-dessus...

    Peut être qu'il existe une meilleure façon, plus simple et efficace, que celle que j'ai utilisée (c'est même certain...)

    Je vous remercie pour votre aide !

    Aukys.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Tu as essayer de faire du pas à pas pour vérifier que tu n'as pas une boucle foireuse à un endroit?

  3. #3
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Par défaut
    Oui j'ai débuggé pas à pas sans détecté de boucle... La seule chose qui semble bloquer est l'affectation de la région à mon control n°2... Sans cette région cela fonctionne correctement (mais cela ne répond pas à mon besoin car un clic en dehors de la zone voulue tout en étant sur le support de ce control, provoque l'évènement Click).

  4. #4
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut CUSTOM CONTROL IN CUSTOM CONTROL
    bonjour
    ton probleme vient d'un usage peu orthodoxe de composer 2 controles (qu'il soit perso ou custom).
    tu as ajoute le 2eme controle dans l'evenement de peinture du 1er (onpaint).
    Sache que cette evenement est reserve exclusiment à sa peinture propre et qu'il est declenche des milliers de fois par windows lors des mouvements divers que nous executon s à l'ecran -pour chaque controle affiche-.
    Ce qui fait que à chaque event. peinture du control1 tu une instance de controle2 ce qui sature la memoire et ton pc "hangle" ou bloque par manque de memoire.

    Il faut deplacer simplement l'ajout de ton controle Cl_CercleControl dans le sub new de Cl_TriangleControl.
    code repris plus quelque suggestions:
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
     
    Imports System
    Imports System.ComponentModel
    Imports System.Drawing
    Imports System.Windows.Forms
    Imports System.Drawing.Drawing2D
     
    Public Class Cl_CercleControl
     
        Inherits Control
     
        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
            Me.PaintCercleControl(e)
            'RAJOUTE CECI
            'APPEL A LA CLASSE DE BASE OnPaint
            MyBase.OnPaint(e)
        End Sub
     
        Protected Sub PaintCercleControl(ByVal e As PaintEventArgs)
     
            Dim myPath As New Drawing2D.GraphicsPath
            Dim reg1 As New Region
            Dim g As Graphics = e.Graphics
     
            '******************************************************************************
            ' Dessin du rectangle support
            '******************************************************************************
     
            e.Graphics.FillRectangle(New SolidBrush(Color.Red), Me.ClientRectangle)
     
            Dim Rec_Support As New Rectangle(0, 0, Me.ClientRectangle.Width - 1, Me.ClientRectangle.Height - 1)
     
            myPath.StartFigure()
     
            myPath.AddEllipse(Rec_Support)
     
            myPath.CloseFigure()
     
            '******************************************************************************
            ' Définition des régions
            '******************************************************************************
     
            Me.Region = New Region(myPath)
     
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality
     
            e.Graphics.FillPath(Brushes.Pink, myPath)
            e.Graphics.DrawPath(Pens.Black, myPath)
     
     
        End Sub
     
     
        Private Sub Quartier_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
     
            MsgBox("Cercle !")
            'PEINTURE A RAFRAICHIR
            Me.Refresh()
        End Sub
     
        Public Sub New()
     
            MyBase.New()
     
            ' Enable Double Buffering to remove flicker
            Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(ControlStyles.UserPaint, True)
            Me.SetStyle(ControlStyles.DoubleBuffer, True)
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
            'RAJOUTE CECI POUR GERER LA REPEINTURE  DU CONTROLE LORS DU RESIZE
            Me.SetStyle(ControlStyles.ResizeRedraw, True)
        End Sub
     
    End Class
     
    Imports System
    Imports System.ComponentModel
    Imports System.Drawing
    Imports System.Windows.Forms
    Imports System.Drawing.Drawing2D
     
    Public Class Cl_TriangleControl
     
        Inherits Control
        'RAJOUTE CECI PORTEE GLOBALE
        Dim myCercle As New Cl_CercleControl
     
        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
            Me.PaintTriangleControl(e)
            'RAJOUTE CECI
            'APPEL A LA CLASSE DE BASE OnPaint
            MyBase.OnPaint(e)
     
        End Sub
     
        Protected Sub PaintTriangleControl(ByVal e As PaintEventArgs)
     
            Dim myPath As New Drawing2D.GraphicsPath
            Dim reg1 As New Region
            Dim g As Graphics = e.Graphics
     
            '******************************************************************************
            ' Dessin du rectangle support
            '******************************************************************************
     
            e.Graphics.FillRectangle(New SolidBrush(Color.Transparent), Me.ClientRectangle)
     
            Dim Rec_Support As New Rectangle(0, 0, Me.ClientRectangle.Width - 1, Me.ClientRectangle.Height - 1)
     
            myPath.StartFigure()
     
            myPath.AddLine(Rec_Support.X, Rec_Support.Y, Rec_Support.Width, Rec_Support.Height - 1)
            myPath.AddLine(Rec_Support.Width, Rec_Support.Height - 1, Rec_Support.X, Rec_Support.Height - 1)
     
            myPath.CloseFigure()
     
            '******************************************************************************
            ' Définition des régions
            '******************************************************************************
     
            Me.Region = New Region(myPath)
     
            e.Graphics.SmoothingMode = SmoothingMode.HighQuality
     
            e.Graphics.FillPath(Brushes.Aqua, myPath)
            e.Graphics.DrawPath(Pens.Black, myPath)
            'DEPLACER
            'l'ajout d'un control au container parent ne peut pas
            'dans l"evenement peinture du parent
            'zone reserve exclusiment à peinture du parent.
            'Dim myCercle As New Cl_CercleControl
     
            'myCercle.Width = 50
            'myCercle.Height = 50
     
            'Me.Controls.Add(myCercle)
     
        End Sub
     
     
        Private Sub Quartier_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
     
            MsgBox("Triangle !")
            'PEINTURE A RAFRAICHIR
            Me.Refresh()
        End Sub
     
        Public Sub New()
     
            MyBase.New()
     
            ' Enable Double Buffering to remove flicker
            Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            Me.SetStyle(ControlStyles.UserPaint, True)
            Me.SetStyle(ControlStyles.DoubleBuffer, True)
            Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
            'RAJOUTE CECI POUR GERER LA REPEINTURE  DU CONTROLE 
            Me.SetStyle(ControlStyles.ResizeRedraw, True)
     
            'ICI AJOUT DU 2EME CONTROL "MYCERCLE" ET SON POSITION SE FERONT ICI
            myCercle.Width = 50
            myCercle.Height = 50
     
            Me.Controls.Add(myCercle)
            'POSITION PEUT ETRE DOCKE ou PERSONNALISE 
            myCercle.Dock = DockStyle.Fill
     
        End Sub
     
     
     
     
    End Class
    bon appetit moi j'ai pas cette marque de fromage chez ,mais ca doit etre bon si un francais s'y interesse et vous saver apprecier les chose de ce bas monde(j'aime beaucoup les fromages de chevre).....
    bon code........

  5. #5
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Par défaut
    Bonjour Mabrouki,

    Merci beaucoup pour ton aide et tes explications !

    (Je n'ai pas [trop] compris ta dernière remarque... mais ce n'est qu'un détail....)

    Aukys.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/02/2008, 12h16
  2. Controle personnalisé & Boite à outils
    Par Totanne dans le forum Windows Forms
    Réponses: 6
    Dernier message: 31/12/2007, 17h53
  3. Création Controle personnalisé
    Par moumoune65 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 05/09/2007, 22h18
  4. DataGridView dans Controle personnalisé
    Par Andrenn dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/07/2007, 16h37
  5. [VB.NET] Evenement par défaut sur controle personnalisé
    Par anthony70 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 31/08/2004, 16h19

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