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

C# Discussion :

développement d'un composant pour office


Sujet :

C#

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut développement d'un composant pour office
    Bonjour,

    tout d'abord, je vous explique ce que je voudrais faire.
    Je voudrais implémenter un petit composant en C#, qui comprendrait:
    - une interface graphique simplissime: 1 bouton
    - une fonction qui prend 2 paramètres, de type entier, qui est appelée lorsqu'on clique sur le bouton.

    La partie métier (la fonction) est déjà implémentée.

    Ensuite, ce que je voudrais c'est que cet objet soit utilisable dans les produits office, le plus simplement possible. Prenons un exemple concret: dans Excel.

    Je voudrais donc pouvoir, dans Excel, faire comme suit:
    1. menu -> inserer -> objet
    2. dans la liste des objets, cliquer sur mon composant (ce qui implique donc d'avoir préalablement fait ce qu'il faut pour que mon objet apparaisse dans cette liste)
    3. l'objet (avec son bouton donc) apparait dans Excel
    4. je fais le lien entre les deux paramètres de la fonction appelée et deux cellules (disons A1 et A2) de Excel

    résultat souhaité: lorsque je clique sur le bouton, la fonction est appelée avec, comme paramètres, le contenu des cellules A1 et A2.

    Dois-je hériter ma classe principale de Component ou de UserControl?

    J'ai commencé à tenter des trucs. J'ai créé un projet Test1 avec ma classe qui hérite de Component. J'ai glissé un bouton dans la fenêtre design de Test1.cs, etc. J'ai ensuite enregistré ma dll avec regasm, puis je l'ai mis dans le gac avec gacutil, mais mon composant n'apparait pas dans la liste des objets de Excel. Or tout s'est déroulé sans erreur (compilation de la dll, regasm et gacutil). Savez-vous pourquoi mon composant n'apparait pas dans Excel?

    Avez-vous des liens qui expliquent en détail tout ceci, ou bien un exemple de code source? J'ai beaucoup cherché, mais je ne trouve que des explications dans les grandes lignes, rien en détail. La msdn est très succinte à ce sujet, ou alors je n'ai pas cherché où il faut.

    Merci par avance.
    Cordialement.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut ole container,inserer un objet
    bonjour
    Tu es sur le mauvais menu "codeur" .Inserer un objet est reserve à un objet "olecontainer" c.à.d invoquer un activex serveur(.exe) par exemple :
    - un simple raccourci pour executer AdodeReader,MS Word dans Excel sans echanger des donnees.
    Ce que tu cherches en fait c'est un peu la Boite à Outils Controles (cree du temps des Cntroles Activex Com extension .ocx).
    Malheureusement un simple UserControl .Net (.dll) n'est pas pris en charge par notre Boite à Outils Controles .
    Pour ce faire il faut telecharger l'utilitaire InteropToolkit du site Microsoft.
    le lien:
    http://www.google.fr/url?sa=t&source...DeSk4iiFBVhbvA

    Apres installation du Toolkit tu as un modele de projet UserControlVB6 dans VisualStudio de type Control ActiveX(compatible Com).
    Ton UserControl ActiveX sera accessible dans la Boite à Outils d'Excel cité ci-dessus.
    La Boite à Outil possede :
    1/ Onglet sup. à gauche(toggle bouton) qui donne access à mode Designer ou Run-Time pour Excution.
    2/ Dernier Onglet donne access à Ajouter Controle Activex pour charger ton UserControlVB6.
    Une fois en place sur la feuille il faut un peux de code VBA dans le classeur pour utiliser le controle.
    voici un exemple de UserControleVB6 cree avec InteropToolkit et accessible dans la boite à outils:

    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
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
     
    Public Class InteropUserControl
     
    #Region "VB6 Interop Code"
     
    #If COM_INTEROP_ENABLED Then
     
    #Region "COM Registration"
     
        ' These  GUIDs provide the COM identity for this class 
        ' and its COM interfaces. If you change them, existing 
        ' clients will no longer be able to access the class.
     
        Public Const ClassId As String = "4d98c4df-113f-4b2d-a5d8-141e7167487c"
        Public Const InterfaceId As String = "75232e50-1dfe-42d2-af2c-01c15c9541b5"
        Public Const EventsId As String = "f91c84a5-2c50-4ff5-8e4e-1c2fcdff1499"
     
        'These routines perform the additional COM registration needed by ActiveX controls
        <EditorBrowsable(EditorBrowsableState.Never)> _
        <ComRegisterFunction()> _
        Private Shared Sub Register(ByVal t As Type)
            ComRegistration.RegisterControl(t)
        End Sub
     
        <EditorBrowsable(EditorBrowsableState.Never)> _
        <ComUnregisterFunction()> _
        Private Shared Sub Unregister(ByVal t As Type)
            ComRegistration.UnregisterControl(t)
        End Sub
     
    #End Region
     
    #Region "VB6 Events"
     
        'This section shows some examples of exposing a UserControl's events to VB6.  Typically, you just
        '1) Declare the event as you want it to be shown in VB6
        '2) Raise the event in the appropriate UserControl event.
     
        Public Shadows Event Click() 'Event must be marked as Shadows since .NET UserControls have the same name.
        Public Event DblClick()
     
        Private Sub InteropUserControl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
            RaiseEvent Click()
        End Sub
     
        Private Sub InteropUserControl_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick
            RaiseEvent DblClick()
        End Sub
     
    #End Region
     
    #Region "VB6 Properties"
     
        'The following are examples of how to expose typical form properties to VB6.  
        'You can also use these as examples on how to add additional properties.
     
        'Must Shadow this property as it exists in Windows.Forms and is not overridable
        Public Shadows Property Visible() As Boolean
            Get
                Return MyBase.Visible
            End Get
            Set(ByVal value As Boolean)
                MyBase.Visible = value
            End Set
        End Property
     
        Public Shadows Property Enabled() As Boolean
            Get
                Return MyBase.Enabled
            End Get
            Set(ByVal value As Boolean)
                MyBase.Enabled = value
            End Set
        End Property
     
        Public Shadows Property ForegroundColor() As Integer
            Get
                Return ActiveXControlHelpers.GetOleColorFromColor(MyBase.ForeColor)
            End Get
            Set(ByVal value As Integer)
                MyBase.ForeColor = ActiveXControlHelpers.GetColorFromOleColor(value)
            End Set
        End Property
     
        Public Shadows Property BackgroundColor() As Integer
            Get
                Return ActiveXControlHelpers.GetOleColorFromColor(MyBase.BackColor)
            End Get
            Set(ByVal value As Integer)
                MyBase.BackColor = ActiveXControlHelpers.GetColorFromOleColor(value)
            End Set
        End Property
     
        Public Overrides Property BackgroundImage() As System.Drawing.Image
            Get
                Return Nothing
            End Get
            Set(ByVal value As System.Drawing.Image)
                If value IsNot Nothing Then
                    MsgBox("Setting the background image of an Interop UserControl is not supported, please use a PictureBox instead.", MsgBoxStyle.Information)
                End If
                MyBase.BackgroundImage = Nothing
            End Set
        End Property
     
    #End Region
     
    #Region "VB6 Methods"
     
        Public Overrides Sub Refresh()
            MyBase.Refresh()
        End Sub
     
        'Ensures that tabbing across VB6 and .NET controls works as expected
        Private Sub UserControl_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LostFocus
            ActiveXControlHelpers.HandleFocus(Me)
        End Sub
     
        Public Sub New()
     
            ' This call is required by the Windows Form Designer.
            InitializeComponent()
     
            ' Add any initialization after the InitializeComponent() call.
     
            'Raise Load event
            Me.OnCreateControl()
        End Sub
     
        <SecurityPermission(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.UnmanagedCode)> _
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
     
            Const WM_SETFOCUS As Integer = &H7
            Const WM_PARENTNOTIFY As Integer = &H210
            Const WM_DESTROY As Integer = &H2
            Const WM_LBUTTONDOWN As Integer = &H201
            Const WM_RBUTTONDOWN As Integer = &H204
     
            If m.Msg = WM_SETFOCUS Then
                'Raise Enter event
                Me.OnEnter(New System.EventArgs)
     
            ElseIf m.Msg = WM_PARENTNOTIFY AndAlso _
                (m.WParam.ToInt32 = WM_LBUTTONDOWN OrElse _
                 m.WParam.ToInt32 = WM_RBUTTONDOWN) Then
     
                If Not Me.ContainsFocus Then
                    'Raise Enter event
                    Me.OnEnter(New System.EventArgs)
                End If
     
            ElseIf m.Msg = WM_DESTROY AndAlso Not Me.IsDisposed AndAlso Not Me.Disposing Then
                'Used to ensure that VB6 will cleanup control properly
                Me.Dispose()
            End If
     
            MyBase.WndProc(m)
        End Sub
     
        'This event will hook up the necessary handlers
        Private Sub InteropUserControl_ControlAdded(ByVal sender As Object, ByVal e As ControlEventArgs) Handles Me.ControlAdded
            ActiveXControlHelpers.WireUpHandlers(e.Control, AddressOf ValidationHandler)
        End Sub
     
        'Ensures that the Validating and Validated events fire appropriately
        Friend Sub ValidationHandler(ByVal sender As Object, ByVal e As EventArgs)
     
            If Me.ContainsFocus Then Return
     
            'Raise Leave event
            Me.OnLeave(e)
     
            If Me.CausesValidation Then
                Dim validationArgs As New CancelEventArgs
                Me.OnValidating(validationArgs)
     
                If validationArgs.Cancel AndAlso Me.ActiveControl IsNot Nothing Then
                    Me.ActiveControl.Focus()
                Else
                    'Raise Validated event
                    Me.OnValidated(e)
                End If
            End If
     
        End Sub
     
    #End Region
     
    #End If
     
    #End Region
     
        'Please enter any new code here, below the Interop code
        'ICI COMMENCE LE CODE PERSONNEL
     
        Public Event onParam1 As EventHandler
        Public Event onParam2 As EventHandler
        Public Event onParam3 As EventHandler
        Public Event onChaine As EventHandler
        'CHARGEMENT DU CONTROLE.IL N' Y A PAS DE SUB NEW ATTENTION C'EST RESERVE
        Private Sub InteropUserControl_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.m_param1 = 0.0
            Me.m_param2 = 0.0
            Me.m_param3 = 1.0
            Me.rdButtonDouble.Checked = True
            Me.TextBoxChaine.Text = "Concatener 2 cellules"
            AddHandler Me.onParam1, AddressOf affectParam1
            AddHandler Me.onParam2, AddressOf affectParam2
            AddHandler Me.onParam3, AddressOf affectParam3
            AddHandler Me.onChaine, AddressOf affectChaine
     
        End Sub
        'ICI FONCTION DOUBLE
        Public Function CalculDouble() As Double
            Dim resultatDouble As Double = 0.0
            Try
                resultatDouble = Double.Parse(Me.lblParam1.Text) * Double.Parse(Me.lblParam2.Text) / Double.Parse(Me.lblParam3.Text)
            Catch ex As Exception
                MessageBox.Show("Erreur sur donnees cellules ..." & ex.Message)
            End Try
            Return resultatDouble
        End Function
        'ICI FONCTION ENTIER
        Public Function CalculInteger() As Integer
            Dim resultatInteger As Integer = 0
            Try
                resultatInteger = CInt(Double.Parse(Me.lblParam1.Text)) * CInt(Double.Parse(Me.lblParam2.Text)) / CInt(Double.Parse(Me.lblParam3.Text))
            Catch ex As Exception
                MessageBox.Show("Erreur sur donnees cellules ..." & ex.Message)
            End Try
            Return resultatInteger
        End Function
        Public Sub btnCalcul_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalcul.Click
            If Me.rdButtonDouble.Checked Then
                Me.TextBoxResult.Text = Me.CalculDouble.ToString
     
            ElseIf Me.rdButtonInteger.Checked Then
                Me.TextBoxResult.Text = Me.CalculInteger.ToString
            End If
     
        End Sub
        'ICI PROPRIETES 
        Private m_param1 As Double
        Public Property Param1() As Double
            Get
                Return m_param1
            End Get
            Set(ByVal value As Double)
                Try
                    m_param1 = Double.Parse(value)
                Catch ex As Exception
                    MessageBox.Show("erreur sur donnees cellules ..." & ex.Message)
                End Try
            End Set
        End Property
        Private m_param2 As Double
        Public Property Param2() As Double
            Get
                Return m_param2
            End Get
            Set(ByVal value As Double)
                Try
                    m_param2 = Double.Parse(value)
                Catch ex As Exception
                    MessageBox.Show("erreur sur donnees cellules ..." & ex.Message)
                End Try
            End Set
        End Property
        Private m_param3 As Double
        Public Property Param3() As Double
            Get
                Return m_param3
            End Get
            Set(ByVal value As Double)
                Try
                    If Double.Parse(value) <> 0.0 Then
                        m_param3 = Double.Parse(value)
                    End If
                Catch ex As Exception
                    MessageBox.Show("Erreur sur donnees cellules ..." & ex.Message)
                End Try
            End Set
        End Property
        Private m_chaine As String
        Public Property Chaine() As String
            Get
                Return m_chaine
            End Get
            Set(ByVal value As String)
                m_chaine = value
            End Set
        End Property
     
        Private Sub btnParam1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnParam1.Click
            RaiseEvent onParam1(Me, EventArgs.Empty)
        End Sub
        Public Sub affectParam1()
            Me.lblParam1.Text = Me.Param1
        End Sub
        Private Sub btnParam2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnParam2.Click
            RaiseEvent onParam2(Me, EventArgs.Empty)
        End Sub
        Public Sub affectParam2()
            Me.lblParam2.Text = Me.Param1
        End Sub
        Private Sub btnParam3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnParam3.Click
            RaiseEvent onParam3(Me, EventArgs.Empty)
        End Sub
        Public Sub affectParam3()
            Me.lblParam3.Text = Me.Param3
        End Sub
     
        Private Sub btnAfficheChaine_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAfficheChaine.Click
            RaiseEvent onChaine(Me, EventArgs.Empty)
        End Sub
        Public Sub affectChaine()
            Me.TextBoxChaine.Text = Me.Chaine
        End Sub
    End Class
    ici le code vba pour l'utiliser dans la feuille 1 du classeur:
    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
     
    Dim WithEvents ControlNameEvents As InteropUserControl
     
    'recupere la cellule active pour la mettre dans TextBoxChaine
    Private Sub ControlNameEvents_onChaine(ByVal sender As Variant, ByVal e As mscorlib.EventArgs)
    ControlNameEvents.Chaine = Application.ActiveCell
     
    End Sub
     
    'recupere la cellule active pour la mettre dans lblParam1
     
    Private Sub ControlNameEvents_onParam1(ByVal sender As Variant, ByVal e As mscorlib.EventArgs)
    ControlNameEvents.Param1 = Application.ActiveCell
    End Sub
     
    Private Sub ControlNameEvents_onParam2(ByVal sender As Variant, ByVal e As mscorlib.EventArgs)
    ControlNameEvents.Param2 = Application.ActiveCell
     
    End Sub
     
    Private Sub ControlNameEvents_onParam3(ByVal sender As Variant, ByVal e As mscorlib.EventArgs)
    ControlNameEvents.Param3 = Application.ActiveCell
     
    End Sub
     
    'initialise le controle activex
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set ControlNameEvents = InteropUserControl1
    End Sub
    Ne t'effraye pas un click sur btnParam1,btnParam2 ,btnParam3 ou btnAfficheChaine il recupere la cellule active (cellule du curseur carre excel),ou btnCalcul et il affiche les resultats.

    piece-jointe :le projet avec le classeur excel test (office excel 2003).

    bonne code...

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour, et merci infiniment de vous pencher sur mon problème.
    Seulement je suis un développeur c++ et linuxien, du coup j'ai du mal à comprendre votre message. Suis je puis me permettre, je vais vous demander quelques précisions (puis je vais regarder en détail le code et les pièces jointes que vous m'avez fourni).

    Citation Envoyé par MABROUKI Voir le message
    Tu es sur le mauvais menu "codeur".
    Que voulez-vous dire? J'ai posté ma question au mauvais endroit?

    La solution que vous m'avez fourni est spécifique pour Excel. Ne serait-il pas possible de faire quelque chose de générique pour toutes les applications office?

    La solution que vous proposez utilise VB. Or nous avons la partie métier du composant qui est déjà codée, en C#. Le traduire en VB nous prendrais des mois. Comment peut-on (si c'est possible) "brancher" notre code C# sur votre solution?

    Pour quelqu'un comme moi qui connais mal windows, il y a beaucoup de termes qui me sont inconnus (OLE, ActiveX, COM, UserControl, Component, etc.). Existe-t-il une sorte de glossaire qui regroupe tous ces termes spécifiques à windows et qui en fait un petit résumé?

    Encore merci infiniment pour votre aide précieuse.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut développement d'un composant pour office
    Bonjour
    La pour le glossaire il faut se payer SDK Win 32 dans MSDN Lib.
    En fait OLE='"activation in place" ou activation sur place d'une appli.exe serveur par un simple click.
    Microsoft l' a developpe en vue de simplifier la vie à un utilisateur :lier and activer sur place un document par exemple acad,paint quand il est dans excel ,ou word (s'applique en vice-versa par exemple dans Autocad ,Photoshop ou la plupart des Logiciels grand public qui supportent OLE avec le fameux racourci lien ou link).
    Mais OLE dans ces logiciels est destine à l'utilisateur pas au developpeur.
    Quand j'ai dit "mauvais menu" ,parce ce que tu es developpeur.
    Pour eux ils ont cree les Boite à Outils Controles qui ne sont familieres qu'aux developpeurs,et les classes COM qui permettent d'avoir de l'OLE.
    Maintenant les affirmations ou suppositions?
    1/Depuis quand une API controle Activex(ou un controle .Net meme) est
    specifique à une application ,ni à un language?Jeune Padavan.Tu as fait C++,MFC et tu ne connais pas les controles Activex COM ATL.C'est kifkif sauf que en VB c'est emballe derriere et plus rapide à creer.
    2/Generique :à condition que tu crees un "controle generique?".
    En tout cas tu connais mal la suite OFFICE(la boite à outils mentionne est " generique si tu veux un terme à la mode " i.e existe dans tous les composants office,powerpoint,visio,outlook ,word etc....).
    3/Code specifique à VB .Non.C'est un simple UserControl dote des attributs de classe COM.On aurait pu le faire en C++/CLI ou VB.Net ou C#.

    Bref il faut travailler et pour un developpeur c'est /
    -une vue d'ensemble des moyens à sa disposition (languages,lib..)
    -un objectif clair et bien defini
    -et......coder,beaucoup de code....sinon on a rien....
    ici le code en c# du meme usercontrol(genere par un modele de projet de chez code project):
    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
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
     
    using System.ComponentModel;
    using System.Runtime.InteropServices;
    using Microsoft.VisualBasic;
    using System.Windows.Forms;
    using System.Security.Permissions;
    using System.Drawing;
     
    namespace InteropUserControlLibrary2
    {
     
        #region Interfaces
     
        [ComVisible(true), Guid(InteropUserControl.EventsId), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
        public interface __InteropUserControl
        {
            [DispId(1)]
            void Click();
            [DispId(2)]
            void DblClick();
            //add additional events visible in VB6
     
        }
     
        [Guid(InteropUserControl.InterfaceId), ComVisible(true)]
        public interface _InteropUserControl
        {
            [DispId(1)]
            bool Visible { [DispId(1)] get; [DispId(1)] set; }
            [DispId(2)]
            bool Enabled { [DispId(2)] get; [DispId(2)] set; }
            [DispId(3)]
            int ForegroundColor { [DispId(3)] get; [DispId(3)] set; }
            [DispId(4)]
            int BackgroundColor { [DispId(4)] get; [DispId(4)] set; }
            [DispId(5)]
            Image BackgroundImage { [DispId(5)] get; [DispId(5)] set; }
            [DispId(6)]
            void Refresh();
            //add additional properties visible in VB6
     
        }
        #endregion
     
        [Guid(InteropUserControl.ClassId), ClassInterface(ClassInterfaceType.None)]
        [ComSourceInterfaces("InteropUserControlLibrary2.__InteropUserControl")]
        [ComClass(InteropUserControl.ClassId, InteropUserControl.InterfaceId, InteropUserControl.EventsId)]
        public partial class InteropUserControl : UserControl, _InteropUserControl
        {
            #region VB6 Interop Code
     
    #if COM_INTEROP_ENABLED
     
            #region "COM Registration"
     
            //These  GUIDs provide the COM identity for this class 
            //and its COM interfaces. If you change them, existing 
            //clients will no longer be able to access the class.
     
            public const string ClassId = "68c4345b-19c5-4b8d-990a-d7179e84f8f0";
            public const string InterfaceId = "0869d72b-1518-4b14-af0d-8b4adc95b27a";
            public const string EventsId = "9e22b7cf-a5a1-46ea-a949-f500874025a1";
     
            //These routines perform the additional COM registration needed by ActiveX controls
            [EditorBrowsable(EditorBrowsableState.Never)]
            [ComRegisterFunction]
            private static void Register(System.Type t)
            {
                ComRegistration.RegisterControl(t);
            }
     
            [EditorBrowsable(EditorBrowsableState.Never)]
            [ComUnregisterFunction]
            private static void Unregister(System.Type t)
            {
                ComRegistration.UnregisterControl(t);
            }
     
     
            #endregion
     
            #region "VB6 Events"
     
            //This section shows some examples of exposing a UserControl's events to VB6.  Typically, you just
            //1) Declare the event as you want it to be shown in VB6
            //2) Raise the event in the appropriate UserControl event.
            public delegate void ClickEventHandler();
            public delegate void DblClickEventHandler();
            public new event ClickEventHandler Click; //Event must be marked as new since .NET UserControls have the same name.
            public event DblClickEventHandler DblClick;
     
            private void InteropUserControl_Click(object sender, System.EventArgs e)
            {
                if (null != Click)
                    Click();
            }
     
            private void InteropUserControl_DblClick(object sender, System.EventArgs e)
            {
                if (null != DblClick)
                    DblClick();
            }
     
     
            #endregion
     
            #region "VB6 Properties"
     
            //The following are examples of how to expose typical form properties to VB6.  
            //You can also use these as examples on how to add additional properties.
     
            //Must Shadow this property as it exists in Windows.Forms and is not overridable
            public new bool Visible
            {
                get { return base.Visible; }
                set { base.Visible = value; }
            }
     
            public new bool Enabled
            {
                get { return base.Enabled; }
                set { base.Enabled = value; }
            }
     
            public int ForegroundColor
            {
                get 
                {
                    return ActiveXControlHelpers.GetOleColorFromColor(base.ForeColor);
                }
                set
                {
                    base.ForeColor = ActiveXControlHelpers.GetColorFromOleColor(value);
                }
            }
     
            public int BackgroundColor
            {
                get
                {
                    return ActiveXControlHelpers.GetOleColorFromColor(base.BackColor);
                    }
                set
                {
                    base.BackColor = ActiveXControlHelpers.GetColorFromOleColor(value);
                }
            }
     
            public override System.Drawing.Image BackgroundImage
            {
                get{return null;}
                set
                {
                    if(null != value)
                    {
                        MessageBox.Show("Setting the background image of an Interop UserControl is not supported, please use a PictureBox instead.", "Information");
                    }
                    base.BackgroundImage = null;
                }
            }
     
            #endregion
     
            #region "VB6 Methods"
     
                public override void Refresh()
                {
                    base.Refresh();
                }
     
                //Ensures that tabbing across VB6 and .NET controls works as expected
                private void InteropUserControl_LostFocus(object sender, System.EventArgs e)
                {
                    ActiveXControlHelpers.HandleFocus(this);
                }
     
                public InteropUserControl()
                {
                    //This call is required by the Windows Form Designer.
                    InitializeComponent();
     
                    //' Add any initialization after the InitializeComponent() call.
                    this.DoubleClick += new System.EventHandler(this.InteropUserControl_DblClick);
                    base.Click += new System.EventHandler(this.InteropUserControl_Click);
                    this.LostFocus += new System.EventHandler(InteropUserControl_LostFocus); 
                    this.ControlAdded += new ControlEventHandler(InteropUserControl_ControlAdded);
     
                    //'Raise custom Load event
                    this.OnCreateControl();
                }
     
                [SecurityPermission(SecurityAction.LinkDemand, Flags =SecurityPermissionFlag.UnmanagedCode)]
                protected override void WndProc(ref System.Windows.Forms.Message m)
                {
     
                    const int WM_SETFOCUS = 0x7;
                    const int WM_PARENTNOTIFY = 0x210;
                    const int WM_DESTROY = 0x2;
                    const int WM_LBUTTONDOWN = 0x201;
                    const int WM_RBUTTONDOWN = 0x204;
     
                    if (m.Msg == WM_SETFOCUS)
                    {
                        //Raise Enter event
                        this.OnEnter(System.EventArgs.Empty);
                    }
                    else if( m.Msg == WM_PARENTNOTIFY && (m.WParam.ToInt32() == WM_LBUTTONDOWN || m.WParam.ToInt32() == WM_RBUTTONDOWN))
                    {
     
                        if (!this.ContainsFocus)
                        {
                            //Raise Enter event
                            this.OnEnter(System.EventArgs.Empty);
                        }
                    }
                    else if (m.Msg == WM_DESTROY && !this.IsDisposed && !this.Disposing)
                    {
                        //Used to ensure that VB6 will cleanup control properly
                        this.Dispose();
                    }
     
                    base.WndProc(ref m);
                }
     
     
     
                //This event will hook up the necessary handlers
                private void InteropUserControl_ControlAdded(object sender, ControlEventArgs e)
                {
                    ActiveXControlHelpers.WireUpHandlers(e.Control, ValidationHandler);
                }
     
                //Ensures that the Validating and Validated events fire appropriately
                internal void ValidationHandler(object sender, System.EventArgs e)
                {
                    if( this.ContainsFocus) return;
     
                    //Raise Leave event
                    this.OnLeave(e);
     
                    if (this.CausesValidation)
                    {
                        CancelEventArgs validationArgs = new CancelEventArgs();
                        this.OnValidating(validationArgs);
     
                        if(validationArgs.Cancel && this.ActiveControl != null)
                            this.ActiveControl.Focus();
                        else
                        {
                            //Raise Validated event
                            this.OnValidated(e);
                        }
                    }
     
                }
     
            #endregion
     
    #endif
     
            #endregion
     
            //Please enter any new code here, below the Interop code
            // Votre Code Padavan on l'attend ici ......Prop,Methodes et Evenements en C#.
        }
    }
    Enfin la cerise sur le gateau un "Modele Projet" de chez code project pour generer en complet l'equivalent du code UserControl en c# ci-dessus.
    Il suffit d'installer InteropToolkit 2.0 de chez microsoft et d'ajouter les 2 fichiers zip du lien code projet ci-dessous comme suit :
    -CSInteropUserControlItemTemplate.zip ->...\My Documents\Visual Studio 2005\Templates\ItemTemplates\Visual C#.

    -CSInteropUserControlProjectTemplate.zip => ...\My Documents\Visual Studio 2005\Templates\ProjectTemplates\Visual C#

    lien code projet:
    http://www.codeproject.com/KB/vb-int...pToolkit2.aspx

    Nota bene: il y a un "using Microsoft.VisualBasic;" necessaire dans le projet à la generation.
    P.J: Zip UserControl2 en c#+CSInteropUserControlItemTemplate.zip+ CSInteropUserControlProjectTemplate.zip

    bon code....

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    wah



    Bon, je regarde tout ça, j'essaie de comprendre ce que je peux, et puis je reviendrai te casser les pieds, pour sûr

    Sinon je n'ai jamais vraiment utilisé les outils de microsoft (MFC, ATL, activeX, ...). J'ai toujours suivi un peu de loin, mais toutes ces techno sont tout de même très très floues pour moi.

    Choukran
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

Discussions similaires

  1. [Joomla!] Tuto pour développer un composant pour Joomla 1.7
    Par poitierjohan dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 11/10/2011, 19h21
  2. Quel composant pour développer une application de planning ?
    Par Wilco dans le forum Composants VCL
    Réponses: 7
    Dernier message: 19/02/2006, 13h12
  3. Cherche Composant pour développer un jeu sous DELPHI 6 ?
    Par baltagi dans le forum Composants VCL
    Réponses: 1
    Dernier message: 26/11/2005, 12h25
  4. Composant pour créer du HTML
    Par Morvan Mikael dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/09/2002, 17h41
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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