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 :

créer un control container


Sujet :

Windows Forms

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut créer un control container
    bonjour

    je voudrais créer un controle containeur en héritant de system.windows.forms.control (c'est la contrainte)
    j'entends pas controle containeur que l'on puisse une fois posé lui poser d'autres chose dessus (comme un panel, un tabcontrol etc...)

    que faut il donc faire ?
    j'ai essayé d'hériter de IContainerControl mais ca ne suffit pas (j'ai tenté ca en regardant via reflector comment faisait les autres ... mais j'ai pas trop vu ce qui apportait cette fonctionnalité)

    merci
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  2. #2
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Qu'implémenter IContainerControl ne suffise pas ce n'est pas étonnant, ce n'est qu'une vulgaire interface et non pas une classe abstraite contenant un début d'implémentation.

    Mais pourquoi hériter de control? A priori ça s'appelle créer des composants customs pauvres en fonctionnalités et bien buggés au lieu d'utiliser les standards.

    Deja, j'essaierai d'hériter d'un conteneur existant style UserControl ou Panel.
    Ca fournira deja toutes les fonctionnalités nécessaires au rendu des controles enfants (ce dont tu as besoin). Sinon tu es bon pour te payer toutes les méthodes de dessins ainsi que la gestion des coordonnées.
    Ensuite, si tu veux pouvoir poser des trucs dessus dans l'éditeur de vs2005 t'as besoin de créer une autre classe pour gérer cela, qui indiquera la façon dont ces enfants se serialisent.

    Ce n'est pas rien.

  3. #3
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    Par défaut
    Bonjour.

    A mon avis, ce que tu veux c'est simplement avoir le "look" panel dans le designer. Il faut donc ajouter un <designer> à la class héritée de control.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Imports System.ComponentModel
    <Designer("System.Windows.Forms.Design.ParentControlDesigner")> _
    Public Class testcontainer
        Inherits Control
    End Class
    Aprés faut customizer, mais l'idée est là.

    Cdt.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    oui j'avais trouvé entre temps pour le parentcontroldesigner et ca fonctionne

    en fait je fais ca pour remplacer la gestion graphique déplorable du framework (entre autre la transparence)

    ca avance enfin il me reste quelques points encore ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    Par défaut
    Bonjour.

    Pour gérer la transparence, j'ai un control hérité de panel qui marche trés bien.

    J'ai pas le code sous la main, je te le poste ce soir au cas où.

    EDIT --> Voilà :
    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
     
    Public Class CLFWAddPanel
        Inherits Panel
        Private Sub PaintParentBackground(ByVal e As PaintEventArgs)
            If Not Me.Parent Is Nothing Then
                Dim rect As Rectangle = New Rectangle(Left, Top, Width, Height)
                e.Graphics.TranslateTransform(-rect.X, -rect.Y)
                Dim pea As PaintEventArgs = New PaintEventArgs(e.Graphics, rect)
                pea.Graphics.SetClip(rect)
                InvokePaintBackground(Parent, pea)
                InvokePaint(Parent, pea)
                e.Graphics.TranslateTransform(rect.X, rect.Y)
            Else
                e.Graphics.FillRectangle(SystemBrushes.Control, ClientRectangle)
            End If
        End Sub
        Protected Overrides Sub OnPaintBackground( _
            ByVal pevent As PaintEventArgs)
            PaintParentBackground(pevent)
        End Sub
        Protected Overrides Sub OnScroll( _
        ByVal se As ScrollEventArgs _
    )
            PaintParentBackground(New PaintEventArgs(Me.CreateGraphics, Me.Bounds))
            MyBase.OnScroll(se)
     
        End Sub
    End Class
    Normalement ça marche mais en terme de performance y'a des améliorations a apporter puisque l'on repeind systématiquement l'ensemble du bound du panel.

    Mais bon, je te laisse voir.

    Cdt.

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

    Sperot51, comme j'ai éditer bêtement , je remonte le post ...

    Cdt.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    oui ms passe aussi par la méthode InvokePaintBackground

    et finalement je suis passé par un usercontrol en overridant onpaint et onpaintbackground
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    Par défaut
    Bonjour.

    T'as joué sur le createparams pour la transparence ?

    Parce qu'effectivement le InvokePaintBackground, j'ai pas trouvé mieux...
    (fixer la transparence via le createparams me mets la grouille lors du déplacement d'un form sur l'autre ou la sortie partielle de la form de l'écran).

    Donc je suis preneur d'une solution qui marcherait sans cette invoke et sans le createparams.

    Nota : je suppute au vue des échanges qu'on a déjà eu dans d'autres posts que tu "sauvegardes" en bitmap le background avec une capture à l'init !

    Cdt.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    pas à l'init mais sur le onpaintbackground
    car le plus souvent cet évènement est lancé quand effectivement le fond est changé (meme suite à un changement de taille)

    et j'ai une proc récursive qui regarde le parent, s'il est transparent, on regarde le parent etc... et après on remonte avec une série de drawimage s'il en faut (et avec un clear de la couleur de fond au début de la pile)

    mais ca reste quand meme un peu lent, malgré qu'apparemment dans la plupart des cas ca reste plus rapide que les controles microsoft
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 183
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 183
    Par défaut
    Bonjour.

    Ok.

    Je n'ai pas de soucis avec le invoke car j'ai créé pour chacun des types de controls que j'utilise dans mes applis une class hérité du control de base avec en plus la gestion de la transparence par cette méthode.

    Bonne continuation.
    Cdt.

Discussions similaires

  1. créer un controle calendar à un événement
    Par celiaaa dans le forum IHM
    Réponses: 2
    Dernier message: 04/04/2007, 17h08
  2. [VBA-E] Comment créer un control sur une liste de choix ?
    Par Soulsurfer dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/02/2007, 12h42
  3. Réponses: 3
    Dernier message: 09/06/2006, 20h45
  4. comment créer son controle et l'utiliser
    Par bajazet dans le forum MFC
    Réponses: 2
    Dernier message: 02/12/2005, 00h45
  5. Réponses: 11
    Dernier message: 02/09/2005, 15h41

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