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

Composants VCL Delphi Discussion :

Edit transparent impérativement compatible XPMan


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut Edit transparent impérativement compatible XPMan
    Bonjour

    Tout est dans le titre, ni plus, ni moins.

    Je pourrais écumer des tas de liens et surtout effectuer des tas d'install de compos divers ; j'évite d'installer des compos qui ensuite ne me servent pas.

    Voilà, je viens à vous pour savoir si ce compo existe, surtout si vous avez testé avec un XPMan posé sur la fiche.

    Si pas testé ou non déjà utilisé ; ben c'est hors sujet alors

    Merci de votre expérience.

    Dommage, car Gilbert avait remanié un de ces super compo, mais avec XPMan, il n'est pas du tout copain le compo, et neutralise la transparence.
    Ce qui ne minimise en rien son travail.

  2. #2
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut Youpii !
    Je donne le résultat des courses en pointant le thread gagnant :

    http://www.developpez.net/forums/d67...ge-fond-tedit/

    Je donne le résultat final fonctionnant même sous XPMan !!!

    Car des fois ce XPMan, il tape sur le système

    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
    unit uTransEditPict5;
     
    //******************************************************************************
    // Permet de créer un Composant descendant de TEdit et dont le fond est :
    // - soit Opaque et de couleur unie,
    // - soit formé par une Image de fond
    // - soit Transparent et dans ce cas c''est l''arrière-plan de l''Edit qui apparait,
    //
    // Code modifié à partir de celui du TZ9Edit disponible
    // ici : http://www.lummie.co.uk/painting-the-background-of-tedit/
    //******************************************************************************
     
    // Pour l'utilistion, poser un Composant TTranspaEditPict5 sur la fiche
    // l''image choisie via l''ellipse associée à la proprité propriété Picture
    // apparaît seulement lors du lancement de l''application
     
    interface
     
    uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
         StdCtrls, extctrls, extdlgs;
     
    type
      TTranspaEditPict5 = class(TEdit) // TZ9Edit Modifié voir les //<**
      private
        { Private declarations }
        FPictureFond   : TPicture;  //<**
        FPictureFondVisible : boolean;
        FAlignText      : TAlignment;
        FTransparent    : Boolean;
        FPainting       : Boolean;
        procedure SetPictureFond(Value: TPicture);  //<**
        procedure SetAlignText(Value: TAlignment);
        procedure SetTransparent(Value: Boolean);
     
      protected
        { Protected declarations }
        procedure RepaintWindow;
        procedure Change; override;
        procedure SetParent(AParent: TWinControl); override;
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
        procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
        procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
        procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
        procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
        procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
        procedure WMSize(var Message: TWMSize); message WM_SIZE;
        procedure WMMove(var Message: TWMMove); message WM_MOVE;
        procedure PaintParent(ACanvas: TCanvas);
      public
        { Public declarations }
        procedure   CreateParams(var Params: TCreateParams);override;
        constructor Create(AOwner: TComponent); override;
        procedure   SetPictureFondVisible(Value: boolean); //<**
        destructor  Destroy; override;
      published
        { Published declarations }
        property Align;
        property AlignText   : TAlignment read FAlignText   write SetAlignText   default taLeftJustify;
        property Transparent : Boolean    read FTransparent write SetTransparent default False;
        property Picture     : TPicture   read FPictureFond write SetPictureFond; //<**
        property PictureVisible: boolean  read FPictureFondVisible write SetPictureFondVisible default False; //<**
    end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin     RegisterComponents('Compos Transparents', [TTranspaEditPict5]);
    end;
     
    type      TParentControl = class(TWinControl);
     
    const     BorderRec: array[TBorderStyle] of Integer = (1, -1);
     
    constructor TTranspaEditPict5.Create(AOwner: TComponent);
    begin       inherited Create(AOwner);
                FPictureFond := TPicture.Create;
                FAlignText   := taLeftJustify;
                FTransparent := false;
                FPainting    := false;
                Invalidate;
    end;
     
    procedure  TTranspaEditPict5.SetParent(AParent: TWinControl);
    begin      inherited SetParent(AParent);
               Invalidate;
    end;
     
    procedure TTranspaEditPict5.SetPictureFond(Value : TPicture);
    begin     if FPictureFond <> Value then
              begin FPictureFond.Assign(Value);
                    FTransparent       :=True;
                    FPictureFondVisible:=True;
                    Invalidate;
              end;
    end;
     
    procedure TTranspaEditPict5.SetPictureFondVisible(Value: Boolean); //<**
    begin     if FPictureFondVisible <> Value then
              begin FPictureFondVisible := Value;
                    Invalidate;
              end;
    end;
     
    destructor TTranspaEditPict5.Destroy;
    begin      FPictureFond.Free; //<**
               inherited Destroy;
    end;
     
    procedure TTranspaEditPict5.SetAlignText(Value: TAlignment);
    begin     if FAlignText <> Value then
              begin FAlignText := Value;
                    RecreateWnd;
                    Invalidate;
              end;
    end;
     
    procedure TTranspaEditPict5.SetTransparent(Value: Boolean);
    begin     if FTransparent <> Value then
              begin FTransparent := Value;
                    Invalidate;
              end;
    end;
     
    procedure TTranspaEditPict5.WMEraseBkGnd(var Message: TWMEraseBkGnd);
    var       DC: hDC; canvas : TCanvas; oldBrush : TBrush;
    begin     if FTransparent and not(csDesigning in componentstate) then
              begin if Not FPictureFondVisible then
                    begin canvas := TCanvas.create;
                          try canvas.handle := message.dc;
                              PaintParent(Canvas);
                          finally
                              canvas.free;
                          end;
                    end else
                    if FPictureFondVisible Then
                    begin DC:=message.dc;
                          SetBkMode(DC, 1); //SetBkMode(DC, 1 = TRANSPARENT);
                          Canvas := TCanvas.Create;
                          try oldbrush := Canvas.Brush;
                              canvas.handle := dc;
                              Canvas.Font.Color  := Self.Font.Color;
                              Canvas.Brush.Style := bsClear ;
                              Canvas.draw(0,0,FPictureFond.Bitmap);
                              Canvas.Brush := oldbrush;
                          finally
                              Canvas.Free;
                          end;
                    end;
              end else
              begin canvas := TCanvas.create;
                    try canvas.handle := message.dc;
                        canvas.brush.color := Color;
                        canvas.brush.style := bsSolid;
                        canvas.fillrect(clientrect);
                    finally
                        canvas.free;
                    end;
              end;
    end;
     
     
    procedure TTranspaEditPict5.WMPaint(var Message: TWMPaint);
    begin
       inherited;
       if FTransparent then
       begin
        Brush.Bitmap:=FPictureFond.Bitmap;
        if not FPainting then RepaintWindow;
       end;
    end;
     
     
     
    procedure TTranspaEditPict5.WMNCPaint(var Message: TMessage);
    begin     inherited;
    end;
     
    procedure TTranspaEditPict5.CNCtlColorEdit(var Message: TWMCtlColorEdit);
    begin     inherited;
              if FTransparent then SetBkMode(Message.ChildDC, 1);
    end;
     
    procedure TTranspaEditPict5.CNCtlColorStatic(var Message: TWMCtlColorStatic);
    begin     inherited;
              if FTransparent then SetBkMode(Message.ChildDC, 1);
    end;
     
    procedure TTranspaEditPict5.CMParentColorChanged(var Message: TMessage);
    begin     inherited;
              if FTransparent then Invalidate;
    end;
     
    procedure TTranspaEditPict5.WMSize(var Message: TWMSize);
    var       r : TRect;
    begin     inherited;
              r := ClientRect;
              InvalidateRect(handle,@r,false);
    end;
     
    procedure TTranspaEditPict5.WMMove(var Message: TWMMove);
    var       r : TRect;
    begin     inherited;
              Invalidate;
              r := ClientRect;
              InvalidateRect(handle,@r,false);
    end;
     
    procedure TTranspaEditPict5.RepaintWindow;
    var       DC: hDC; TmpBitmap, Bitmap: hBitmap;
    begin     if FTransparent then
              begin FPainting := true;
                    HideCaret(Handle);
                    DC := CreateCompatibleDC(GetDC(Handle));
                    TmpBitmap := CreateCompatibleBitmap( GetDC(Handle), Succ(ClientWidth),
                                                         Succ(ClientHeight));
                    Bitmap := SelectObject(DC, TmpBitmap);
                    PaintTo(DC, 0, 0);
                    BitBlt( GetDC(Handle), BorderRec[BorderStyle] + BorderWidth,
                            BorderRec[BorderStyle] + BorderWidth, ClientWidth,
                            ClientHeight, DC, 1, 1, SRCCOPY);
                    SelectObject(DC, Bitmap);
                    DeleteDC(DC);
                    ReleaseDC(Handle, GetDC(Handle));
                    DeleteObject(TmpBitmap);
                    ShowCaret(Handle);
                    FPainting := false;
              end;
    end;
     
    procedure TTranspaEditPict5.CreateParams(var Params: TCreateParams);
    const     Alignments: array [TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
    begin     inherited CreateParams(Params);
              Params.Style := Params.Style or ES_MULTILINE or Alignments[FAlignText];
    end;
     
    procedure TTranspaEditPict5.Change;
    begin     RepaintWindow;
              inherited Change;
    end;
     
    procedure TTranspaEditPict5.PaintParent(ACanvas: TCanvas);
    var       I, Count, X, Y, SaveIndex: integer;
              DC: cardinal;
              R, SelfR, CtlR: TRect;
              Control : TControl;
    begin     Control := Self;
              if Control.Parent = nil then Exit;
              Count := Control.Parent.ControlCount;
              DC := ACanvas.Handle;
              SelfR := Bounds(Control.Left, Control.Top, Control.Width, Control.Height);
              X := -Control.Left; Y := -Control.Top;
              // Copy parent control image
              SaveIndex := SaveDC(DC);
              SetViewportOrgEx(DC, X, Y, nil);
              IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight);
              TParentControl(Control.Parent).Perform(WM_ERASEBKGND,DC,0);
              TParentControl(Control.Parent).PaintWindow(DC);
              RestoreDC(DC, SaveIndex);
              //Copy images of graphic controls
              for I := 0 to Count - 1 do
              begin if (Control.Parent.Controls[i] <> nil) then
                    begin if Control.Parent.Controls[i] = Control then break;
                          with Control.Parent.Controls[i] do
                          begin CtlR := Bounds(Left, Top, Width, Height);
                                if Bool(IntersectRect(R, SelfR, CtlR)) and Visible then
                                begin SaveIndex := SaveDC(DC);
                                      SetViewportOrgEx(DC, Left + X, Top + Y, nil);
                                      IntersectClipRect(DC, 0, 0, Width, Height);
                                      Perform(WM_ERASEBKGND,DC,0);
                                      Perform(WM_PAINT, integer(DC), 0);
                                      RestoreDC(DC, SaveIndex);
                                end;
                          end;
                    end;
              end;
    end;
     
    END.
    Je devrais même ajouter les auteurs, qui viennent d'améliorer et rendre compatible ce code sous XPMan.

    Source du projet : http://www.lummie.co.uk/painting-the...ound-of-tedit/
    dragonno auteur du thread en forum composants
    Gilbert Geyer pour ses améliorations
    anapurna pour son ajout de code et d'informations
    Montor pour sa contribution déterminante à la transparence sous XPMan !

    Encore merci et bravo à eux

    @+

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut Composants descendants de TEdit ET TMemo à fond transparent ou formé par une image
    Bonjour,

    Pour compléter, voici l'unit cEditMemoTranspaPict qui permet de créer les deux composants cités dans le titre. Comme le TMemo est de la même famille que le TEdit le code de TMemoTranspaPict est à quelques détails près identique à celui de TEditTranspaPict.

    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
    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
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    unit cEditMemoTranspaPict;
     
    //******************************************************************************
    // Permet de créer un Composant descendant du TEdit, et un autre descendant du TMemo,
    // et dont le fond est :
    // - soit Opaque et de couleur unie,
    // - soit formé par une Image de fond propre au TEdit
    // - soit Transparent et dans ce cas c''est l''arrière-plan de l''Edit qui apparait,
    //
    // Code modifié à partir de celui du TZ9Edit disponible
    // ici : http://www.lummie.co.uk/painting-the-background-of-tedit/
    //******************************************************************************
     
    interface
     
    uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
         StdCtrls, extctrls, extdlgs;
     
    type
      TEditTranspaPict = class(TEdit) // TZ9Edit Modifié voir les //<**
      private
        { Private declarations }
        FPictureFond   : TPicture;  //<**
        FPictureFondVisible : boolean;
        FAlignText      : TAlignment;
        FTransparent    : Boolean;
        FPainting       : Boolean;
        procedure SetPictureFond(Value: TPicture);  //<**
        procedure SetPictureFondVisible(Value: boolean); //<**
        procedure SetAlignText(Value: TAlignment);
        procedure SetTransparent(Value: Boolean);
     
      protected
        { Protected declarations }
        procedure RepaintWindow;
        procedure Change; override;
        procedure SetParent(AParent: TWinControl); override;
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
        procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
        procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
        procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
        procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
        procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
        procedure WMSize(var Message: TWMSize); message WM_SIZE;
        procedure WMMove(var Message: TWMMove); message WM_MOVE;
        procedure PaintParent(ACanvas: TCanvas);
      public
        { Public declarations }
        procedure   CreateParams(var Params: TCreateParams);override;
        constructor Create(AOwner: TComponent); override;
        destructor  Destroy; override;
      published
        { Published declarations }
        property Align;
        property AlignText   : TAlignment read FAlignText   write SetAlignText   default taLeftJustify;
        property Transparent : Boolean    read FTransparent write SetTransparent default False;
        property Picture     : TPicture   read FPictureFond write SetPictureFond; //<**
        property PictureVisible: boolean  read FPictureFondVisible write SetPictureFondVisible default False; //<**
    end;
     
    type
      TMemoTranspaPict = class(TMemo) // TZ9Edit Modifié voir les //<**
      private
        { Private declarations }
        FPictureFond   : TPicture;  //<**
        FPictureFondVisible : boolean;
        FAlignText      : TAlignment;
        FTransparent    : Boolean;
        FPainting       : Boolean;
        procedure SetPictureFond(Value: TPicture);  //<**
        procedure SetPictureFondVisible(Value: boolean); //<**
        procedure SetAlignText(Value: TAlignment);
        procedure SetTransparent(Value: Boolean);
     
      protected
        { Protected declarations }
        procedure RepaintWindow;
        procedure Change; override;
        procedure SetParent(AParent: TWinControl); override;
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
        procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
        procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
        procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT; //< sauf ici
     
        procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
        procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
        procedure WMSize(var Message: TWMSize); message WM_SIZE;
        procedure WMMove(var Message: TWMMove); message WM_MOVE;
        procedure PaintParent(ACanvas: TCanvas);
      public
        { Public declarations }
        procedure   CreateParams(var Params: TCreateParams);override;
        constructor Create(AOwner: TComponent); override;
        destructor  Destroy; override;
      published
        { Published declarations }
        property Align;
        property AlignText   : TAlignment read FAlignText   write SetAlignText   default taLeftJustify;
        property Transparent : Boolean    read FTransparent write SetTransparent default False;
        property Picture     : TPicture   read FPictureFond write SetPictureFond; //<**
        property PictureVisible: boolean  read FPictureFondVisible write SetPictureFondVisible default False; //<**
    end;
     
    procedure Register;
     
    implementation
     
    procedure Register;
    begin     RegisterComponents('Transpas', [TEditTranspaPict,TMemoTranspaPict]);
    end;
     
    type      TParentControl = class(TWinControl);  
     
    const     BorderRec: array[TBorderStyle] of Integer = (1, -1);
     
    // A ) TEditTranspaPict ========================================================
     
    constructor TEditTranspaPict.Create(AOwner: TComponent);
    begin       inherited Create(AOwner);
                FPictureFond := TPicture.Create;
                FAlignText   := taLeftJustify;
                FTransparent := false;
                FPainting    := false;
                Invalidate;
    end;
     
    procedure  TEditTranspaPict.SetParent(AParent: TWinControl);
    begin      inherited SetParent(AParent);
               Invalidate;
    end;
     
    procedure TEditTranspaPict.SetPictureFond(Value : TPicture);
    var       tmp : string;
    begin     if FPictureFond <> Value then
              begin FPictureFond.Assign(Value);
                    FTransparent       :=True;
                    FPictureFondVisible:=True;
                    tmp:=caption;
                    caption:='';
                    Invalidate;
                    caption:=tmp;
              end;
    end;
     
    procedure TEditTranspaPict.SetPictureFondVisible(Value: Boolean); //<**
    begin     if FPictureFondVisible <> Value then
              begin FPictureFondVisible := Value;
                    Invalidate;
              end;
    end;
     
    destructor TEditTranspaPict.Destroy;
    begin      FPictureFond.Free; //<**
               inherited Destroy;
    end;
     
    procedure TEditTranspaPict.SetAlignText(Value: TAlignment);
    begin     if FAlignText <> Value then
              begin FAlignText := Value;
                    RecreateWnd;
                    Invalidate;
              end;
    end;
     
    procedure TEditTranspaPict.SetTransparent(Value: Boolean);
    begin     if FTransparent <> Value then
              begin FTransparent := Value;
                    Invalidate;
              end;
    end;
     
    procedure TEditTranspaPict.WMEraseBkGnd(var Message: TWMEraseBkGnd);
    var       DC: hDC; canvas : TCanvas; oldBrush : TBrush;
    begin     if FTransparent then
              begin if Not FPictureFondVisible then
                    begin canvas := TCanvas.create;
                          try canvas.handle := message.dc;
                              PaintParent(Canvas);
                          finally
                              canvas.free;
                          end;
                    end else
                    if FPictureFondVisible Then
                    begin DC:=message.dc;
                          SetBkMode(DC, 1); // 1 = TRANSPARENT
                          Canvas := TCanvas.Create;
                          try oldbrush := Canvas.Brush;
                              canvas.handle := dc;
                              Canvas.Font.Color  := Self.Font.Color;
                              Canvas.Brush.Style := bsClear ;
                              Canvas.draw(0,0,FPictureFond.Bitmap);
                              Canvas.Brush := oldbrush;
                          finally
                              Canvas.Free;
                          end;
                    end;
              end else
              begin canvas := TCanvas.create;
                    try canvas.handle := message.dc;
                        canvas.brush.color := Color;
                        canvas.brush.style := bsSolid;
                        canvas.fillrect(clientrect);
                    finally
                        canvas.free;
                    end;
              end;
    end;
     
    procedure TEditTranspaPict.WMPaint(var Message: TWMPaint);  //<**
    begin     inherited;
              if FTransparent then
              begin
               Brush.Bitmap:=FPictureFond.Bitmap;
               if not FPainting then RepaintWindow;
              end;
    end;
     
    procedure TEditTranspaPict.WMNCPaint(var Message: TMessage);
    begin     inherited;
    end;
     
    procedure TEditTranspaPict.CNCtlColorEdit(var Message: TWMCtlColorEdit);
    begin     inherited;
              if FTransparent then SetBkMode(Message.ChildDC, 1);
    end;
     
    procedure TEditTranspaPict.CNCtlColorStatic(var Message: TWMCtlColorStatic);
    begin     inherited;
              if FTransparent then SetBkMode(Message.ChildDC, 1);
    end;
     
    procedure TEditTranspaPict.CMParentColorChanged(var Message: TMessage);
    begin     inherited;
              if FTransparent then Invalidate;
    end;
     
    procedure TEditTranspaPict.WMSize(var Message: TWMSize);
    var       r : TRect;
    begin     inherited;
              r := ClientRect;
              InvalidateRect(handle,@r,false);
    end;
     
    procedure TEditTranspaPict.WMMove(var Message: TWMMove);
    var       r : TRect;
    begin     inherited;
              Invalidate;
              r := ClientRect;
              InvalidateRect(handle,@r,false);
    end;
     
    procedure TEditTranspaPict.RepaintWindow;
    var       DC: hDC; TmpBitmap, Bitmap: hBitmap;
    begin     if FTransparent then
              begin FPainting := true;
                    HideCaret(Handle);
                    DC := CreateCompatibleDC(GetDC(Handle));
                    TmpBitmap := CreateCompatibleBitmap( GetDC(Handle), Succ(ClientWidth),
                                                         Succ(ClientHeight));
                    Bitmap := SelectObject(DC, TmpBitmap);
                    PaintTo(DC, 0, 0);
                    BitBlt( GetDC(Handle), BorderRec[BorderStyle] + BorderWidth,
                            BorderRec[BorderStyle] + BorderWidth, ClientWidth,
                            ClientHeight, DC, 1, 1, SRCCOPY);
                    SelectObject(DC, Bitmap);
                    DeleteDC(DC);
                    ReleaseDC(Handle, GetDC(Handle));
                    DeleteObject(TmpBitmap);
                    ShowCaret(Handle);
                    FPainting := false;
              end;
    end;
     
    procedure TEditTranspaPict.CreateParams(var Params: TCreateParams);
    const     Alignments: array [TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
    begin     inherited CreateParams(Params);
              Params.Style := Params.Style or ES_MULTILINE or Alignments[FAlignText];
    end;
     
    procedure TEditTranspaPict.Change;
    begin     RepaintWindow;
              inherited Change;
    end;
     
    procedure TEditTranspaPict.PaintParent(ACanvas: TCanvas);
    var       I, Count, X, Y, SaveIndex: integer;
              DC: cardinal;
              R, SelfR, CtlR: TRect;
              Control : TControl;
    begin     Control := Self;
              if Control.Parent = nil then Exit;
              Count := Control.Parent.ControlCount;
              DC := ACanvas.Handle;
              SelfR := Bounds(Control.Left, Control.Top, Control.Width, Control.Height);
              X := -Control.Left; Y := -Control.Top;
              // Copie de l'image du contrôle parent
              SaveIndex := SaveDC(DC);
              SetViewportOrgEx(DC, X, Y, nil);
              IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight);
              TParentControl(Control.Parent).Perform(WM_ERASEBKGND,DC,0);
              TParentControl(Control.Parent).PaintWindow(DC);
              RestoreDC(DC, SaveIndex);
              //Copie des images des contrôles graphiques
              for I := 0 to Count - 1 do
              begin if (Control.Parent.Controls[I] <> nil) then
                    begin if Control.Parent.Controls[I] = Control then break;
                          with Control.Parent.Controls[I] do
                          begin CtlR := Bounds(Left, Top, Width, Height);
                                if Bool(IntersectRect(R, SelfR, CtlR)) and Visible then
                                begin SaveIndex := SaveDC(DC);
                                      SetViewportOrgEx(DC, Left + X, Top + Y, nil);
                                      IntersectClipRect(DC, 0, 0, Width, Height);
                                      Perform(WM_ERASEBKGND,DC,0);
                                      Perform(WM_PAINT, integer(DC), 0);
                                      RestoreDC(DC, SaveIndex);
                                end;
                          end;
                    end;
              end;
    end;
     
    // B ) TMemoTranspaPict : ======================================================
    //     Remarque : Le code qui suit est en tous points identique à celui de TEditTranspaPict
    //     (copier-coller suivi du remplacement de la sous-chaîne 'Edit' par 'Memo')
    //     à l''exception des instructions repérées par la mention //< sauf ici
    //     et qui concernent essentiellement la procedure CNCtlColorEdit.
    //     Ceci a été possible du fait que le TEdit et le TMemo sont de la même famille.
     
    constructor TMemoTranspaPict.Create(AOwner: TComponent);
    begin       inherited Create(AOwner);
                FPictureFond := TPicture.Create;
                FAlignText   := taLeftJustify;
                FTransparent := false;
                FPainting    := false;
                ScrollBars   := ssVertical; //<**
                Invalidate;
    end;
     
    procedure  TMemoTranspaPict.SetParent(AParent: TWinControl);
    begin      inherited SetParent(AParent);
               Invalidate;
    end;
     
    procedure TMemoTranspaPict.SetPictureFond(Value : TPicture);
    begin     if FPictureFond <> Value then
              begin FPictureFond.Assign(Value);
                    FTransparent       :=True;
                    FPictureFondVisible:=True;
                    Invalidate;
              end;
    end;
     
    procedure TMemoTranspaPict.SetPictureFondVisible(Value: Boolean); //<**
    begin     if FPictureFondVisible <> Value then
              begin FPictureFondVisible := Value;
                    Invalidate;
              end;
    end;
     
    destructor TMemoTranspaPict.Destroy;
    begin      FPictureFond.Free; //<**
               inherited Destroy;
    end;
     
    procedure TMemoTranspaPict.SetAlignText(Value: TAlignment);
    begin     if FAlignText <> Value then
              begin FAlignText := Value;
                    RecreateWnd;
                    Invalidate;
              end;
    end;
     
    procedure TMemoTranspaPict.SetTransparent(Value: Boolean);
    begin     if FTransparent <> Value then
              begin FTransparent := Value;
                    Invalidate;
              end;
    end;
     
    procedure TMemoTranspaPict.WMEraseBkGnd(var Message: TWMEraseBkGnd);
    var       DC: hDC; canvas : TCanvas; oldBrush : TBrush;
    begin     if FTransparent then
              begin if Not FPictureFondVisible then
                    begin canvas := TCanvas.create;
                          try canvas.handle := message.dc;
                              PaintParent(Canvas);
                          finally
                              canvas.free;
                          end;
                    end else
                    if FPictureFondVisible Then
                    begin DC:=message.dc;
                          SetBkMode(DC, 1); //SetBkMode(DC, 1 = TRANSPARENT);
                          Canvas := TCanvas.Create;
                          try oldbrush := Canvas.Brush;
                              canvas.handle := dc;
                              Canvas.Font.Color  := Self.Font.Color;
                              Canvas.Brush.Style := bsClear ;
                              Canvas.draw(0,0,FPictureFond.Bitmap);
                              Canvas.Brush := oldbrush;
                          finally
                              Canvas.Free;
                          end;
                    end;
              end else
              begin canvas := TCanvas.create;
                    try canvas.handle := message.dc;
                        canvas.brush.color := Color;
                        canvas.brush.style := bsSolid;
                        canvas.fillrect(clientrect);
                    finally
                        canvas.free;
                    end;
              end;
    end;
     
    procedure TMemoTranspaPict.WMPaint(var Message: TWMPaint);
    begin     inherited;
              if FTransparent then
              begin
               Brush.Bitmap:=FPictureFond.Bitmap;
               if not FPainting then RepaintWindow;
              end;
    end;
     
    procedure TMemoTranspaPict.WMNCPaint(var Message: TMessage);
    begin     inherited;
    end;
     
    procedure TMemoTranspaPict.CNCtlColorEDIT(var Message: TWMCtlColorEdit); //<sauf ici
    begin     inherited;
              if FTransparent then SetBkMode(Message.ChildDC, 1);
    end;
     
    procedure TMemoTranspaPict.CNCtlColorStatic(var Message: TWMCtlColorStatic);
    begin     inherited;
              if FTransparent then SetBkMode(Message.ChildDC, 1);
    end;
     
    procedure TMemoTranspaPict.CMParentColorChanged(var Message: TMessage);
    begin     inherited;
              if FTransparent then Invalidate;
    end;
     
    procedure TMemoTranspaPict.WMSize(var Message: TWMSize);
    var       r : TRect;
    begin     inherited;
              r := ClientRect;
              InvalidateRect(handle,@r,false);
    end;
     
    procedure TMemoTranspaPict.WMMove(var Message: TWMMove);
    var       r : TRect;
    begin     inherited;
              Invalidate;
              r := ClientRect;
              InvalidateRect(handle,@r,false);
    end;
     
    procedure TMemoTranspaPict.RepaintWindow;
    var       DC: hDC; TmpBitmap, Bitmap: hBitmap;
    begin     if FTransparent then
              begin FPainting := true;
                    HideCaret(Handle);
                    DC := CreateCompatibleDC(GetDC(Handle));
                    TmpBitmap := CreateCompatibleBitmap( GetDC(Handle), Succ(ClientWidth),
                                                         Succ(ClientHeight));
                    Bitmap := SelectObject(DC, TmpBitmap);
                    PaintTo(DC, 0, 0);
                    BitBlt( GetDC(Handle), BorderRec[BorderStyle] + BorderWidth,
                            BorderRec[BorderStyle] + BorderWidth, ClientWidth,
                            ClientHeight, DC, 1, 1, SRCCOPY);
                    SelectObject(DC, Bitmap);
                    DeleteDC(DC);
                    ReleaseDC(Handle, GetDC(Handle));
                    DeleteObject(TmpBitmap);
                    ShowCaret(Handle);
                    FPainting := false;
              end;
    end;
     
    procedure TMemoTranspaPict.CreateParams(var Params: TCreateParams);
    const     Alignments: array [TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
    begin     inherited CreateParams(Params);
              Params.Style := Params.Style or ES_MULTILINE or Alignments[FAlignText];
    end;
     
    procedure TMemoTranspaPict.Change;
    begin     RepaintWindow;
              inherited Change;
    end;
     
    procedure TMemoTranspaPict.PaintParent(ACanvas: TCanvas);
    var       I, Count, X, Y, SaveIndex: integer;
              DC: cardinal;
              R, SelfR, CtlR: TRect;
              Control : TControl;
    begin     Control := Self;
              if Control.Parent = nil then Exit;
              Count := Control.Parent.ControlCount;
              DC := ACanvas.Handle;
              SelfR := Bounds(Control.Left, Control.Top, Control.Width, Control.Height);
              X := -Control.Left; Y := -Control.Top;
              // Copie de l'image du contrôle parent
              SaveIndex := SaveDC(DC);
              SetViewportOrgEx(DC, X, Y, nil);
              IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight);
              TParentControl(Control.Parent).Perform(WM_ERASEBKGND,DC,0);
              TParentControl(Control.Parent).PaintWindow(DC);
              RestoreDC(DC, SaveIndex);
              //Copie des images des contrôles graphiques
              for I := 0 to Count - 1 do
              begin if (Control.Parent.Controls[I] <> nil) then
                    begin if Control.Parent.Controls[I] = Control then break;
                          with Control.Parent.Controls[I] do
                          begin CtlR := Bounds(Left, Top, Width, Height);
                                if Bool(IntersectRect(R, SelfR, CtlR)) and Visible then
                                begin SaveIndex := SaveDC(DC);
                                      SetViewportOrgEx(DC, Left + X, Top + Y, nil);
                                      IntersectClipRect(DC, 0, 0, Width, Height);
                                      Perform(WM_ERASEBKGND,DC,0);
                                      Perform(WM_PAINT, integer(DC), 0);
                                      RestoreDC(DC, SaveIndex);
                                end;
                          end;
                    end;
              end;
    end;
     
    END. //=========================================================================
    Testé et marche sous D5 + WinXP.

    ... Par contre j'ai voulu créer TRichEditTranspaPict mais là je me suis cassé les dents sans succès. ... si quelqu'un a une idée je suis preneur...

    A +.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Bonjour

    Je viens d'installer le super compo Memo transparent, retouché par les soins de Gilbert.

    Merci pour ce beau travail, j'ajoute que ça fonctionne même avec un XPMan sur la fiche.

    Toutefois... une chose m'a intrigué : la ScrollBar d'affectée par défaut.

    Bon, pas de quoi fouetter une chatte me direz-vous.

    Mais en fouinant un peu plus avant, je m'aperçois qu'en mode EDI, le ssNone de la propriété ScrollBars s'affiche correctement.

    Par contre au lancement du projet, je vois toujours la ScrollBar.

    Mais le plus ennuyeux, je suis peut-être seul en ce cas, c'est qu'au "Tout fermer" de Delphi 7, j'ai eu droit à un beau message d'erreur : "Violation d'accès... vcldesigner70.bpl ..." enfin c'est un truc du genre boucle qui tourne à l'infinie. Alors faut tout de suite killer le processus, sinon le système se plante, faute de ressources.

    Pour donner une piste et des explications complémentaires voici :
    1. Ce plantage arrive avec ou sans XPMan sur fiche.
    2. Donc XPMan n'y est pour rien.
    3. Le fait de choisir "ssNone" du ScrollBar, après plantage et relancement de Delphi, la propriété "ssVertical" est affectée. Mais j'ai pourtant enregistré mon projet avec "ssNone".
    4. Si je lance avec "ssVertical" = idem ça plante au "Tout fermer".


    Après bien des essais, je peux reproduire à tous les coups ce plantage :
    1. Placer un TImage (avec une picture BMP) sous ce Memo
    2. Mettre "ssNone" à la ScrollBar
    3. Compiler et lancer le projet
    4. Ajouter du texte dans le mémo, de façon à rendre visible la ScollBar
      Bien qu'ayant affecté ssNome...)
    5. Quitter ce projet
    6. Dans Delphi "Tout fermer"
    7. Pas ce message d'erreur qui arrive ?
    8. Si je recommence, mais en retirant le TImage de dessous = RAS.


    N'empêche qu'il est canon ce compo

    Je suis sous Vista Premium Familial et D7.

    @+

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Salut Droïde,

    Pour ton problème de ScrollBars : suffit de supprimer la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    constructor TMemoTranspaPict.Create(AOwner: TComponent);
    begin       inherited Create(AOwner);
                FPictureFond := TPicture.Create;
                FAlignText   := taLeftJustify;
                FTransparent := false;
                FPainting    := false;
                //ScrollBars   := ssVertical; 
                Invalidate;
    end;
    Testé marche : plus de ScrollBar par défaut.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Salut Gilbert

    Merci, je viens de virer cette ligne et en effet, au lancement la ScrollBar n'est plus là.

    Ben voui mais par contre, la plantage est toujours là, snifff

    Sauf si je retire de dessous le TImage avec picture dedans.

    Personne d'autre pour confirmer ou infirmer cette observation ?

    @+

  7. #7
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    desolé je suis sous Xp si tu peux nous envoyer tes fichiers .pas .dfm pour tester
    En plus (ou moins), lorsque je place un BMP sous ce mémo, je n'ai plus de transparence.
    (Transparence OK en EDI mais pas après compil.)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      if (Control.Parent= nil)or(csDesigning in ComponentState)then Exit;    /////////////////////////////////////////////////////////
              Control := Self;
              if Control.Parent = nil then Exit;
    il y a une erreur ici ca doit etre ecrite comme suite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Control := Self;
    if (Control.Parent= nil)or(csDesigning in ComponentState)then Exit;    /////////////////////////////////////////////////////////
    // if Control.Parent = nil then Exit;


    Si tu veux un autre test annuler les modifs apportées a la fonction PaintParent
    Essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        procedure TMemoTranspaPict.WMPaint(var Message: TWMPaint);
    begin      
              inherited;
             if csDesigning in ComponentState then Exit;
              if FTransparent then
              begin
                Brush.Bitmap:=FPictureFond.Bitmap;
                if not FPainting then RepaintWindow;
              end;
    end;

  8. #8
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut


    Montor, écoute, tu es suffisamment sympa comme ça pour que j'arrête mes histoires.

    Le principal est que l'Edit soit transparent et fiable en fonctionnement, donc mission accomplie à 100%.

    Pour le Memo, pour moi c'est absolument secondaire. Surtout si tu n'es pas sous Vista pour observer et tester.

    J'ai échangé les derniers blocs de code que tu as gentiment modifié ; j'ai bien à nouveau, la transparence en Memo.

    En plus le plantage en question, a lieu exclusivement sous EDI au "Tout fermer", alors je n'ai pas à me plaindre

    Encore merci à vous deux

    Cette fois, je retague en Résolu, na !

  9. #9
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    tu peux utiliser le TransEdit comme un TransMemo pour le faire désactiver le property Autosize la seul inconvénient que tu n'aura pas des scrollbars avec ce pseudo-Tmemo
    Bonne aventure

  10. #10
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Citation Envoyé par Montor Voir le message
    tu peux utiliser le TransEdit comme un TransMemo pour le faire désactiver le property Autosize la seul inconvénient que tu n'aura pas des scrollbars avec ce pseudo-Tmemo
    Bonne aventure
    Bon à savoir

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/11/2012, 10h35
  2. [Win32] Transparence d'un Edit Control
    Par bigbang dans le forum MFC
    Réponses: 20
    Dernier message: 04/02/2005, 08h22
  3. Image et rich edit
    Par :GREG: dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/05/2002, 11h33
  4. A lire impérativement avant de poster un message
    Par ok.Idriss dans le forum Demandes
    Réponses: 0
    Dernier message: 01/05/2002, 18h57

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