none
VB2010 – Comment créer un contrôle personnalisé RRS feed

  • Question

  • Bonjour à tous,

    Pour créer un contrôle personnalisé (CustomControl) à partir d’un projet WinForm, le plus simple est d’aller dans le menu « Projet » et de sélectionner la commande « Ajouter un nouvel élément ». A partir de ce moment la boîte de dialogue ci-dessous s’affiche et il ne reste plus qu’à cliquer sur l’élément « Contrôle personnalisé » pour créer une fenêtre de conception pour ce contrôle. Mais au fait, où est donc cette commande ?

    Bonne année à tous

    Cordialement

    SL

    vendredi 2 janvier 2015 12:42

Réponses

Toutes les réponses

  • Bonjour,

    Si le template n'existe pas dans votre Visual Studio (ce qui est bizarre), un Custom Control est tout simplement une classe qui hérite de Control. Donc pour en créer un, il suffit d'ajouter une classe qui hérite de Control. POur que ce soit "cool" au niveau du design, créez d'abord un fichier MonControl.Designer.vb avec le code suivant :

    Partial Class MonControl
        Inherits System.Windows.Forms.Control
    
        'Control overrides dispose to clean up the component list.
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
    
        'Required by the Control Designer
        Private components As System.ComponentModel.IContainer
    
        ' NOTE: The following procedure is required by the Component Designer
        ' It can be modified using the Component Designer.  Do not modify it
        ' using the code editor.
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            Me.SuspendLayout()
            Me.ResumeLayout(False)
    
        End Sub
    
    End Class

    Puis ajoutez un autre fichier nommé MonControl.vb avec le code suivant :

    Public Class MonmControl
    
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(e)
    
            'Add your custom paint code here
        End Sub
    
    End Class

    Et ca roule...

    Enregistrez votre projet et relancez Visual Studio et les 2 fichiers devraient apparaître enfant l'un de l'autre.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    samedi 3 janvier 2015 08:28
  • Bonjour Richard,

    Merci pour votre réponse.

    Je rencontre un problème, auquel je ne m’attendais pas, avec cette classe. Dans un premier temps j’ai programmé un customControl exactement sur le même principe que le votre sans trouver de solution (Voir mon thread : VB2010 – Problème avec la méthode OnPaint d’un contrôle) puis dans un second temps, en pensant avoir oublié quelque chose dans la structure du document j’ai tenté de recréer cette en passant par un template de VB. Malheureusement la suite vous la connaissez … Bref un problème se pose directement dans ma méthode OnPaint, j’ai personnalisé un bouton mais celui-ci ne se redessine pas dans deux cas :

    •  Lorsque je redimensionne le formulaire
    • Lorsqu’une autre fenêtre passe au dessus

    Pouvez-vous me donner quelques conseils pour me sortir de ce mauvais pas ? Merci

    Voici le code simplifié du thread cité plus haut :

    Imports System.Drawing.Drawing2D

    Public Class Form1

        Dim cb As New CustomButton

        Sub New()

            InitializeComponent()

            Me.Text = "Bouton personnalisé"

            Me.SetClientSizeCore(300, 150)

            Me.SizeGripStyle = Windows.Forms.SizeGripStyle.Show

            Me.Controls.Add(cb)

        End Sub

    End Class

    Friend Class CustomButton

        Inherits Control

        Dim sf As New StringFormat

        Dim gp As New GraphicsPath

        Sub New()

            MyBase.New()

            sf.Alignment = StringAlignment.Center

            sf.LineAlignment = StringAlignment.Center

            Me.Size = New Size(100, 100)

            Me.Location = New Point(100, 25)

            Me.Cursor = Cursors.Hand

            gp.AddEllipse(Me.ClientRectangle)

            Me.Region = New Region(gp)

            Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)

            Me.SetStyle(ControlStyles.UserPaint, True)

            Me.SetStyle(ControlStyles.DoubleBuffer, True)

        End Sub

        Protected Overrides Sub OnPaint(pe As System.Windows.Forms.PaintEventArgs)

            MyBase.OnPaint(pe)

            Call OnPaintButton(pe)

        End Sub

        Friend Sub OnPaintButton(pe As System.Windows.Forms.PaintEventArgs)

            Dim Rc As Rectangle = pe.ClipRectangle

            Rc.Inflate(-2, -2)

            pe.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality

            pe.Graphics.FillEllipse(Brushes.White, Rc)

            pe.Graphics.DrawEllipse(New Pen(Brushes.Gray, 2), Rc)

            pe.Graphics.DrawString("CustomButton", New Font("Arial", 9), Brushes.Black, Rc, sf)

        End Sub

        Private Sub CustomButton_Click(sender As Object, e As System.EventArgs) Handles Me.Click

            Beep()

        End Sub

    End Class

    Bonne année 2015

    Cordialement

    SL

    samedi 3 janvier 2015 13:45
  • Dim Rc As Rectangle = New Rectangle()
            Rc.Width = Me.Width
            Rc.Height = Me.Height


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    samedi 3 janvier 2015 15:43
  • Bonjour Richard,

    Merci pour votre réponse.

    Bizarre le comportement de cette variable au regard de la classe Graphics !?

    J’ai présenté une réponse complète du code en réponse au thread cité plus haut et il fonctionne maintenant 10/10.

    Bonne année 2015

    Cordialement

    SL

    mardi 6 janvier 2015 11:49