1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut Utilisation du DragMoveProvider

    Bonjour,

    Une petite question à propos de l'utilisation de cet outil car je suis sûrement passé à côté d'un truc.

    Lorsque je l'utilise pour autoriser le déplacement d'un bouton par exemple, une fois le déplacement terminé, l'évènement click se déclenche.

    Je trifouillé un peu la doc mais n'ai pas trouvé d'info relevantes sur ce sujet.
    J'ai réussi à bidouiller un truc avec un booléen qui me sert à savoir si le contrôle a été déplacé ou non pour savoir si l'évènement doit s'exécuter mais je me dis qu'un truc plus simple a sûrement été pensé à ce sujet.

    Est-ce normal où y a-t-il une "astuce" ?

    Merci d'avance.
    Kropernic

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 827
    Points : 40 593
    Points
    40 593

    Par défaut

    Salut,

    Non, il n'y a rien de prévu pour ça. A vrai dire je ne vous pas vraiment de solution magique pour inhiber l'évènement Click normal du contrôle...

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    Ok donc y a pas truc prévu. C'est noté

    C'est un choix qui a été fait, un oubli ou bien ce n'est techniquement pas possible(ça m'étonnerait) d'empêcher le click si le contrôle a bougé ?
    Kropernic

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 827
    Points : 40 593
    Points
    40 593

    Par défaut

    A la base c'est un oubli, mais de toutes façons je ne vois pas comment faire techniquement... si tu as une bonne solution, je serai ravi de modifier la lib pour l'intégrer

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    Bah je joue avec un booléen.

    Dans l'event Move, je le set sur True --> bl_moved = True.

    Dans l'event MouseUp, je le set sur False --> bl_move = False.

    Dans l'event click, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF not monBoolen Then
    'code de l'event
    End If
    Après, je ne sais pas s'il est possible d'intégrer ce genre de manip dans ce genre de contrôle d'extension. J'ignore totalement la manière dont on développe ces machins-là (j'suis un noob moi !).

    P.S. : C'est normal que la balise CODEINLINE supprime un saut de ligne qui se trouve juste derrière ? J'veux bien que c'est inline mais j'aimerais pouvoir formater mon texte comme j'ai envie ^^
    Kropernic

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 827
    Points : 40 593
    Points
    40 593

    Par défaut

    Bah le problème c'est que la classe DragMoveProvider ne peut pas intervenir sur le code de ton handler d'évènement... Il faudrait pouvoir empêcher le déclenchement de l'évènement, et à ma connaissance ce n'est pas possible.

    Citation Envoyé par Kropernic Voir le message
    P.S. : C'est normal que la balise CODEINLINE supprime un saut de ligne qui se trouve juste derrière ? J'veux bien que c'est inline mais j'aimerais pouvoir formater mon texte comme j'ai envie ^^
    Non, c'est un bug... Si tu mets un caractère après la fermeture de la balise ça marche normalement (j'ai corrigé ton post)

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    Bah le problème c'est que la classe DragMoveProvider ne peut pas intervenir sur le code de ton handler d'évènement... Il faudrait pouvoir empêcher le déclenchement de l'évènement, et à ma connaissance ce n'est pas possible.
    Si tu le dis ^^. Je ne comprends déjà pas comment un contrôle fait pour aller ajouter une propriété/méthode dans un autre contrôle alors c'est pas moi qui vais te dire si c'est possible ou non .

    Non, c'est un bug... Si tu mets un caractère après la fermeture de la balise ça marche normalement (j'ai corrigé ton post)
    Merci pour l'info et merci pour la correction.
    Kropernic

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    Encore moi...

    Je voulais aller voir les sources par curiosité mais le lien semble mort...
    Kropernic

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 827
    Points : 40 593
    Points
    40 593

    Par défaut

    Citation Envoyé par Kropernic Voir le message
    Je ne comprends déjà pas comment un contrôle fait pour aller ajouter une propriété/méthode dans un autre contrôle
    Comme ça

    Citation Envoyé par Kropernic Voir le message
    Je voulais aller voir les sources par curiosité mais le lien semble mort...
    Apparemment le serveur Redmine est down... je vais le signaler, ça devrait être corrigé bientôt

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    Bonjour,

    Je me permet de remonter ce sujet car j'ai une nouvelle question relative à l'utilisation du DragMoveProvider. S'il est préférable que je crée une nouvelle discussion, n'hésitez pas à me le signaler.

    Voici ma question :

    Comment paramétrer cette propriété pour un contrôle créer dynamiquement pendant l'exécution ? Est-ce que le fait que ce contrôle soit un usercontrol y change quelque chose (à priori je dirais que non mais on ne sait jamais) ?

    EDIT : Je viens de tester en ajoutant mon usercontrole en mode design. J'ai bien la propriété d'extension qui s'affiche dans les propriétés et je peux la mettre à True. Mais à l'exécution, je ne peux pas le déplacer...
    Kropernic

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 827
    Points : 40 593
    Points
    40 593

    Par défaut

    Citation Envoyé par Kropernic Voir le message
    Comment paramétrer cette propriété pour un contrôle créer dynamiquement pendant l'exécution ? Est-ce que le fait que ce contrôle soit un usercontrol y change quelque chose (à priori je dirais que non mais on ne sait jamais) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    userControl1.EnableDragMove(true);
    (il faut avoir importé le namespace de DragMoveProvider pour que la méthode d'extension soit accessible)

    Citation Envoyé par Kropernic Voir le message
    EDIT : Je viens de tester en ajoutant mon usercontrole en mode design. J'ai bien la propriété d'extension qui s'affiche dans les propriétés et je peux la mettre à True. Mais à l'exécution, je ne peux pas le déplacer...
    Bizarre... est-ce que ton UserControl gère les évènements MouseDown/MouseUp ?

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    Citation Envoyé par tomlev Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    userControl1.EnableDragMove(true);
    (il faut avoir importé le namespace de DragMoveProvider pour que la méthode d'extension soit accessible)


    Bizarre... est-ce que ton UserControl gère les évènements MouseDown/MouseUp ?
    1 : Je n'avais pas importer. Ce doit donc être la cause.
    2 : Nope, il ne gère rien de tout ça.

    Finalement, j'ai foutu mon contrôle dans une form créée à la volée aussi... Comme ça j'peux le bouger aussi facilement (et même l'agrandir ).

    Bref, on verra si ça plait à l'utilisateur.

    De toute façon, tant que je n'aurai pas de solution à un autre problème (posté sur forum vb.net), je suis obligé de laisser dans une form...

    Quoi qu'il en soit, merci pour tes réponses. Je testerai donc en important le namespace histoire de te donner une suite
    Kropernic

  13. #13
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    Sorry pour le double post...

    Je viens de tester et même en important le namespace, ça ne passe pas...

    Maintenant, il n'est pas impossible que je fasse quelque chose de travers (ou que je n'aie pas la dernière version du contrôle ?? où le vérifier?).
    Kropernic

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 827
    Points : 40 593
    Points
    40 593

    Par défaut

    Citation Envoyé par Kropernic Voir le message
    Je viens de tester et même en important le namespace, ça ne passe pas...
    C'est-à-dire ? Erreur de compilation ? Exception à l'exécution ? Pas de résultat ?

    En tous cas je viens de tester et pour moi ça fonctionne bien... Voilà ce que j'ai fait :
    - créer un nouveau projet Windows Forms
    - créer un UserControl (avec une BackColor différente de la Form pour qu'on le voie)
    - poser le UserControl sur la Form1
    - ajouter une référence à Dvp.NET WinForms (via Nuget)
    - ajouter using Developpez.Dotnet.Windows.Forms; dans Form1.cs
    - ajouter userControl11.EnableDragMove(true); dans le constructeur de Form1, après le InitializeComponent

    Et c'est tout...

  15. #15
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    Là j'vais quitter le bureau mais j'éditerai mon message demain après avoir retester en suivant ton exemple.

    J'imagine que le using, c'est le imports de vb en c#.

    Par contré déjà, j'avais fait un imports de Developpez.Dotnet.Windows.Forms.DragMoveProvider. Je vois que tu t'arrêtes à forms. C'est p-e le problème que j'avais. Bref, on verra demain, faut que j'attrape mon train !
    Kropernic

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 827
    Points : 40 593
    Points
    40 593

    Par défaut

    Citation Envoyé par Kropernic Voir le message
    Là j'vais quitter le bureau mais j'éditerai mon message demain après avoir retester en suivant ton exemple.
    N'édite pas le message, postes-en un nouveau. Sinon il n'y a pas de notification dans le tableau de bord, et en plus ça fausse la discussion parce que les réponses suivantes n'ont plus forcément de sens...

    Citation Envoyé par Kropernic Voir le message
    J'imagine que le using, c'est le imports de vb en c#.
    Oui

  17. #17
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    Citation Envoyé par tomlev Voir le message
    C'est-à-dire ? Erreur de compilation ? Exception à l'exécution ? Pas de résultat ?

    En tous cas je viens de tester et pour moi ça fonctionne bien... Voilà ce que j'ai fait :
    - créer un nouveau projet Windows Forms
    - créer un UserControl (avec une BackColor différente de la Form pour qu'on le voie)
    - poser le UserControl sur la Form1
    - ajouter une référence à Dvp.NET WinForms (via Nuget)
    - ajouter using Developpez.Dotnet.Windows.Forms; dans Form1.cs
    - ajouter userControl11.EnableDragMove(true); dans le constructeur de Form1, après le InitializeComponent

    Et c'est tout...
    Bon en fait ça marche. Mais c'est surnois ! L'intellisense ne propose la propriété EnableDragMove que lorsqu'on l'a presque écrite totalement. Sans quoi, c'est comme si elle n'existait pas...

    Sorry du dérangement
    Kropernic

  18. #18
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 827
    Points : 40 593
    Points
    40 593

    Par défaut

    Citation Envoyé par Kropernic Voir le message
    L'intellisense ne propose la propriété EnableDragMove que lorsqu'on l'a presque écrite totalement. Sans quoi, c'est comme si elle n'existait pas...
    Petite correction : l'intellisense de VB.NET je propose pas EnableDragMove... en C# c'est bien proposé. Par défaut l'intellisense de VB ne propose pas tous les membres (mais tu peux changer ça en sélectionnant l'autre onglet du menu intellisense)

  19. #19
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    juillet 2006
    Messages
    3 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 831
    Points : 4 057
    Points
    4 057

    Par défaut

    C'est de nouveau moi.

    J'ai récupéré un contrôle sur le net qui sert à faire des boutons elliptiques.

    Le souci, c'est que quelque chose dans le code de ce contrôle (dont j'ai les sources), empêche l'utilisation du DragMoveProvider.

    J'ai mis le contrôle en pièce jointe pour ceux que ça intéresse.

    Ma question est donc : Qu'est-ce qui pourrait "empêcher" le DragMoveProvider de faire son office ?

    Je me doute bien qu'il doit y avoir quelque chose dans l'event MouseDown du contrôle mais cela dépasse mes compétences :-/ .

    Je pourrais tester par tâtonnement en désactivant des lignes de code du controle mais je ne suis pas conscient des conséquences que cela aurait :-/
    Fichiers attachés Fichiers attachés
    Kropernic

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 827
    Points : 40 593
    Points
    40 593

    Par défaut

    C'est parce que le contrôle n'appelle pas l'implémentation de la classe de base dans OnMouseDown, OnMouseUp, etc, donc les évènements ne sont pas déclenchés...

    Il faut rajouter MyBase.OnMouseDown(e) au début de la méthode OnMouseDown (idem pour OnMouseUp, OnKeyDown, OnGotFocus, etc)

    De plus ce contrôle fait un truc dégueulasse, qui n'est même pas nécessaire : il définit un nouvel évènement Click qui masque celui de la classe de base. Tu peux le supprimer et remplacer RaiseEvent click(Me, e) par MyBase.OnClick(e).

    Voilà le code modifié :

    Code VB.NET : 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
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
     
    Imports System.Windows.Forms
    Imports System.Windows
    Imports System.Drawing
    Imports System
    Imports System.ComponentModel
     
    ''' -----------------------------------------------------------------------------
    ''' Project	 : EllipticalButton
    ''' Class	 : EllipticalButton
    ''' 
    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' This Control is a button that takes an elliptical shap
    ''' </summary>
    ''' <remarks>
    ''' The EllipticalButton Control is a sub class of Control
    ''' </remarks>
    ''' <history>
    ''' 	[Ahmed Al-Asaad]	3/27/2005	Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    <ToolboxBitmap(GetType(Button))> _
        Public Class EllipticalButton
        Inherits Control
     
     
    #Region " Component Designer generated code "
     
     
     
        Public Sub New()
            MyBase.New()
     
            'This call is required by the Component Designer.
            InitializeComponent()
            Me.SetStyle(ControlStyles.ResizeRedraw, True)
            Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or _
                ControlStyles.UserPaint Or ControlStyles.DoubleBuffer, True)
     
            'Add any initialization after the InitializeComponent() call
     
        End Sub
     
        'Component overrides dispose to clean up the component list.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
     
        'Required by the Component 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.Name = "Elliptical Button"
            Me.Size = New System.Drawing.Size(50, 50)
     
        End Sub
     
    #End Region
    #Region "Private Veriables"
     
        Private mousePressed As Boolean = False
        Private MeGotFocus As Boolean = False
        Private MouseOver As Boolean = False
        Private ButtonStyle As Style = Style.Standard
        Private ButtonImage As Image = Nothing
    #End Region
     
    #Region "Control Properties"
     
        <System.ComponentModel.Category("Appearance"), System.ComponentModel.Browsable(True), _
         DefaultValue(GetType(Image), Nothing)> _
           Public Property Image() As System.Drawing.Image
            Get
                Return Me.ButtonImage
            End Get
            Set(ByVal Value As System.Drawing.Image)
                ButtonImage = Value
                Me.Invalidate()
            End Set
        End Property
     
        <System.ComponentModel.Browsable(False)> _
           Public Shadows ReadOnly Property BackgroundImage() As System.Drawing.Image
            Get
                Return MyBase.BackgroundImage()
            End Get
     
        End Property
     
        ''' -----------------------------------------------------------------------------
        ''' <summary>
        ''' Gets or sets the text associated with this control.  
        ''' </summary>
        ''' <value>
        ''' String
        ''' </value>
        ''' -----------------------------------------------------------------------------
        <System.ComponentModel.Description("Gets or sets the text associated with this control.")> _
        Public Overrides Property Text() As String
            Get
                Return MyBase.Text
            End Get
            Set(ByVal Value As String)
                MyBase.Text = Value
                Me.Invalidate()
            End Set
        End Property
     
        ''' -----------------------------------------------------------------------------
        ''' <summary>
        '''     Gets or sets the flat style appearance of the button control.  
        ''' </summary>
        ''' <value>enum Style</value>
        ''' -----------------------------------------------------------------------------
        <System.ComponentModel.Category("Appearance"), System.ComponentModel.Browsable(True), _
        System.ComponentModel.Description("Gets or sets the flat style appearance of the button control.")> _
        Public Overridable Property FlatStyle() As Style
            Get
                Return ButtonStyle
            End Get
            Set(ByVal Value As Style)
                ButtonStyle = Value
                Me.Invalidate()
            End Set
        End Property
    #End Region
     
    #Region "Painting Methods"
     
     
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            Try
                Dim g As Graphics = e.Graphics
                Dim a As New System.Drawing.Drawing2D.GraphicsPath
                Dim b As New SolidBrush(Color.Transparent)
                Dim p1 As Pen
                Dim p2 As Pen
                Dim stringBrush As New SolidBrush(Me.ForeColor)
                Dim recRegion As New RectangleF
                Dim recBorder As New RectangleF
     
                'Check if the button style is standard or popup
                If Me.ButtonStyle = Style.Standard Then
     
                    'Choose the pen colors to simulate the 3D effect
                    If Me.mousePressed Then
                        'if mouse is pressed dark colour at the top of the button and light at the buttom
                        p1 = New Pen(SystemColors.ControlLightLight, 1)
                        p2 = New Pen(SystemColors.ControlDarkDark, 1)
     
                    Else
                        'if mouse is NOT pressed light colour at the top of the button and dark at the buttom
                        p1 = New Pen(SystemColors.ControlDarkDark, 1)
                        p2 = New Pen(SystemColors.ControlLightLight, 1)
     
                    End If
     
     
                    recRegion = New RectangleF(0, 0, Me.Width, Me.Height)
                    recBorder = New RectangleF(1, 1, Me.Width - 2, Me.Height - 2)
     
                    'This line is very important to have smooth cruves. Otherwise,
                    'the button will look so ugly.
                    g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
     
     
                    ' I was using the g.FillEllipse(b, rec) method before. Using that
                    ' method however makes the button respond to clicking within the
                    ' rectangle and outsize of the ellipse.
     
                    ' Using the GraphicPath object and Add ellipse did the job. It sets the shape
                    ' shape/region of the button to be an ellipse. It sure did the trick :)
                    a.AddEllipse(recRegion)
     
                    Me.Region = New Region(a)
     
                    ' Now we need to draw the 3D effect. Remember we can only draw on
                    ' the ellipse now.
                    g.DrawArc(p1, recBorder, 180, -180)
                    g.DrawArc(p2, recBorder, 180, 180)
     
                    ' Measure the size of the String to centralize it.
                    ' If an image is present, the text is drawn next to the icon.
                    Dim textSize As SizeF = g.MeasureString(Me.Text, Me.Font)
     
                    'If the Mouse is pressed draw the text and the image, if available,
                    ' shifted 2 pixels to the right to simulate the 3D effect
                    If Me.mousePressed Then
                        If Me.ButtonImage Is Nothing Then
     
                            g.DrawString(Me.Text, Me.Font, stringBrush, (((Me.Width + 3) - textSize.Width) / 2) + 2, (((Me.Height + 2) - textSize.Height) / 2) + 2)
                        Else
                            Dim pt As New Point(((Me.Width + 3) / 12) + 1, ((Me.Height + 2 - 16) / 2) + 1)
                            Dim recString As New Rectangle(pt, New Size(16, 16))
                            g.DrawImage(ButtonImage, recString)
                            g.DrawString(Me.Text, Me.Font, stringBrush, recString.X + recString.Width + 3, (((Me.Height + 2) - textSize.Height) / 2) + 2)
     
                        End If
                    Else
                        If Me.ButtonImage Is Nothing Then
     
                            g.DrawString(Me.Text, Me.Font, stringBrush, (((Me.Width + 3) - textSize.Width) / 2), (((Me.Height + 2) - textSize.Height) / 2))
                        Else
                            Dim pt As New Point((Me.Width + 3) / 12, (Me.Height + 2 - 16) / 2)
                            Dim recString As New Rectangle(pt, New Size(16, 16))
                            g.DrawImage(ButtonImage, recString)
                            g.DrawString(Me.Text, Me.Font, stringBrush, recString.X + recString.Width + 3, (((Me.Height + 2) - textSize.Height) / 2))
     
                        End If
                    End If
     
                Else ' if the buttonStyle is Popup
     
                    ' if the mouse is over the button, button should look like the standard one.
                    If Me.MouseOver = True Then
                        If Me.mousePressed Then
     
                            p1 = New Pen(SystemColors.ControlDarkDark, 1)
                            p2 = New Pen(SystemColors.ControlDarkDark, 1)
     
                        Else
                            p1 = New Pen(SystemColors.ControlDarkDark, 1)
                            p2 = New Pen(SystemColors.ControlLightLight, 1)
     
                        End If
                    Else ' if mouse is not over the button, the button looks flat
                        p1 = New Pen(SystemColors.ControlDark, 1.5)
                        p2 = New Pen(SystemColors.ControlDark, 1.5)
                    End If
                    recRegion = New RectangleF(0, 0, Me.Width, Me.Height)
                    recBorder = New RectangleF(1, 1, Me.Width - 2, Me.Height - 2)
                    g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
     
                    a.AddEllipse(recRegion)
     
                    Me.Region = New Region(a)
                    g.DrawArc(p1, recBorder, 180, -180)
                    g.DrawArc(p2, recBorder, 180, 180)
                    Dim textSize As SizeF = g.MeasureString(Me.Text, Me.Font)
     
                    If Me.mousePressed Then
                        If Me.ButtonImage Is Nothing Then
     
                            g.DrawString(Me.Text, Me.Font, stringBrush, (((Me.Width + 3) - textSize.Width) / 2) + 1, (((Me.Height + 2) - textSize.Height) / 2) + 1)
                        Else
                            Dim pt As New Point(((Me.Width + 3) / 12) + 2, ((Me.Height + 2 - 16) / 2) + 2)
                            Dim rect As New Rectangle(pt, New Size(16, 16))
                            g.DrawImage(ButtonImage, rect)
                            g.DrawString(Me.Text, Me.Font, stringBrush, rect.X + rect.Width + 3, (((Me.Height + 2) - textSize.Height) / 2) + 2)
     
                        End If
                    Else
                        If Me.ButtonImage Is Nothing Then
     
                            g.DrawString(Me.Text, Me.Font, stringBrush, (((Me.Width + 3) - textSize.Width) / 2), (((Me.Height + 2) - (textSize.Height)) / 2))
                        Else
                            Dim pt As New Point((Me.Width + 3) / 12, (Me.Height + 2 - 16) / 2)
                            Dim rect As New Rectangle(pt, New Size(16, 16))
                            g.DrawImage(ButtonImage, rect)
                            g.DrawString(Me.Text, Me.Font, stringBrush, rect.X + rect.Width + 3, (((Me.Height + 2) - textSize.Height) / 2))
     
                        End If
                    End If
     
                End If
     
                'If the control has focus, an elliptical dotted line is drawn to 
                'show that the button has focus
                If Me.MeGotFocus Then
                    Dim gotFocusPen As New Pen(Color.Black, 1.3)
                    Dim recFocus As Rectangle
     
                    gotfocuspen.DashStyle = Drawing2D.DashStyle.Dot
                    gotfocuspen.DashCap = Drawing2D.DashCap.Round
                    recFocus = New Rectangle(4, 4, Me.Width - 8, Me.Height - 8)
                    g.DrawEllipse(gotFocusPen, recFocus)
                End If
                'Dispose pens, brushes and the graphicpath object.
                b.Dispose()
                p1.Dispose()
                p2.Dispose()
                stringBrush.Dispose()
                a.Dispose()
     
     
            Catch ex As Exception
                MessageBox.Show(ex.ToString)
            End Try
        End Sub
    #End Region
     
    #Region "Events"
     
     
        'Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
        '    'Redraw the control if it gets resized (in design time)
        '    Me.Invalidate()
        'End Sub
     
        Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
            MyBase.OnMouseDown(e)
            'if left click, setfocus and draw a pressed button.
            If e.Button = MouseButtons.Left Then
                mousePressed = True
                Me.Focus()
                Me.Invalidate()
            End If
        End Sub
     
        Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
            MyBase.OnMouseUp(e)
            'if left button is up, draw an unpressed button. Don't lose focus yet.
            If e.Button = MouseButtons.Left Then
                mousePressed = False
                Me.Invalidate()
            End If
        End Sub
     
     
     
        Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
            MyBase.OnGotFocus(e)
            ' if the button gets focus, draw a button with dotted ellipse
            Me.MeGotFocus = True
            Me.Invalidate()
        End Sub
     
        Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
            MyBase.OnLostFocus(e)
            Me.MeGotFocus = False
            Me.Invalidate()
        End Sub
     
        Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
            MyBase.OnKeyDown(e)
            ' if the button has focus and the spacebar is pushed, draw a pressed button.
            If e.KeyCode = Keys.Space Then
                Me.mousePressed = True
                Me.Invalidate()
            End If
        End Sub
     
        Protected Overrides Sub OnKeyUp(ByVal e As System.Windows.Forms.KeyEventArgs)
            MyBase.OnKeyUp(e)
     
            ' if the button has focus and the spacebar is released, draw an unpressed button.
     
            If e.KeyCode = Keys.Space Then
                Me.mousePressed = False
                Me.Invalidate()
                MyBase.OnClick(e)
            End If
        End Sub
     
     
     
        Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
            MyBase.OnMouseEnter(e)
            ' Overridding this method is important in case buttonstyle is set to popup
            Me.MouseOver = True
            Me.Invalidate()
        End Sub
     
        Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
            MyBase.OnMouseLeave(e)
            'Overridding this method is important in case buttonstyle is set to popup
            Me.MouseOver = False
            Me.Invalidate()
        End Sub
     
        'Public Shadows Event click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
            MyBase.OnClick(e)
            mousePressed = False
            Me.Invalidate()
        End Sub
    #End Region
     
     
    End Class
    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' Specify the Flat Style for the EllipticalButton Control
    ''' </summary>
    ''' <history>
    ''' 	[Ahmed Al-Asaad]	3/27/2005	Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    Public Enum Style
        ''' -----------------------------------------------------------------------------
        ''' <summary>
        ''' Specifies the style as standard button
        ''' </summary>
        ''' -----------------------------------------------------------------------------
        Standard
     
        ''' -----------------------------------------------------------------------------
        ''' <summary>
        ''' Specifies the style as Popup Button
        ''' </summary>
        ''' -----------------------------------------------------------------------------
        Popup
    End Enum

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  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