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

 Delphi Discussion :

Renseignements sur SkinCrafter


Sujet :

Delphi

  1. #41
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    @cincap: J'ai essayé ta dernière solution et j'admets qu'elle fonctionne très bien
    Je suis tout de même content de constater que tu as abandonné les régions et que tu utilises 2 fiches: une en mode Layered et l'autre transparente par dessus

    J'ai bien aimé aussi le CopyRect lors de déplacements.

    Il y a quelques simplifications à faire et tu es prêt pour devenir rédacteur

    - La superposition de 2 images peut se faire avec un seul appel à AlphaBlend.
    - Quand tu travailles sur un bitmap 32 bits, déclare la variable en PRGBQuadArray plutôt que pByteArray, ça t'évitera ces indexation i *4 +1.
    - Ces passages par un bitmap intermédaire AlphaBitmap et ces conversions HSL sont inutiles. Tu peux directement copier l'information alpha du png au bitmap final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pd[i].rgbReserved := Png.AlphaScanline[j][i];
    - Et comme dit Oui^3, gérer la mise au premier plan de la fiche (voir entre autre les événements de TApplication)

    Attention par contre aux ressources. Bmp := nil ne libère pas la mémoire. Il faut remplacer tout ça par des Bmp.Free ou FreeAndNil(Bmp).

    Sinon... Bravo !

  2. #42
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ AndNotOr, merci pour ton appréciation, n'oublies que c'est grâce à vous tous experts, que l'on copie des extraits de code suivants vos solutions communiquées sur ce forum et que l'on garde sur un format *.txt pour reprendre quelques années plus tard lors d'une demande.

    L'unité Hslutils.pas qui n'est pas de moi, a été souvent remaniée depuis sa création, est bien une unité mise à disposition de tous libre de droits.

    Je tiens compte de tes remarques, pour le Bmp.free et suivant.

    Edit : ! que bmp.free détruit l'objet alors qu'il doit seulement être vide à certains endroits du code.

    En reprenant le png de 3xoui, on imagine des objets placés en dehors de l'image (Tbutton, Tlabel ect...) mais sur la forme et le résultat est surprenant on a l'impression que ces objets sont dans le vide.

    @+,

    Cincap

  3. #43
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Tous,

    Pour mettre en avant plan l'exemple, propriété de la forme = fsStayOnTop sinon pour forcer l'affichage :

    SetForeGroundWindow(form1.Handle) ;
    @+,

    Cincap

  4. #44
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Encore une variante !

    Cette fois, j'ai aussi utilisé des... régions
    Mais pas pour découper les bords de la fiche, mais l'intérieur pour que les contrôles de la fiche du dessous soient visibles.

    Le mouvement conjoint des 2 fiches se fait par l'interception de WM_WINDOWPOSCHANGED.

    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
    unit CustomLayeredForm;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, PNGImage;
     
    type
      PRGBQuadArray = ^TRGBQuadArray;
      TRGBQuadArray = array[0..0] of TRGBQuad;
     
      TBackgroundForm = class(TForm)
      private
        Image :TBitmap;
        Blend :TBlendFunction;
      protected
        procedure Refresh;
        procedure WMWindowPosChanged(var Message :TMessage); message WM_WINDOWPOSCHANGED;
        procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
      public
        procedure   SetImage(const aImage :TBitmap);
        constructor CreateNew(AOwner: TComponent; Dummy: Integer  = 0); override;
        destructor  Destroy; override;
      end;
     
      TLayeredForm = class(TForm)
      private
        BkForm  :TBackgroundForm;
      public
        procedure   LoadImageFromFile(aFileName :TFileName);
        constructor Create(aOwner :TComponent); override;
      end;
     
    implementation
     
    {$R *.dfm}
     
    function LoadPngToBmp(const aFileName :TFileName) :TBitmap;
    var
      Png  :TPngObject;
      RGBA :PRGBQuadArray;
      RGB  :pRGBLine;
      x    :integer;
      y    :integer;
    begin
      //Création de l'objet PNG
      Png := TPngObject.Create;
     
      try
        //Chargement du png
        Png.LoadFromFile(aFileName);
     
        //Création du bitmap résultant
        Result := TBitmap.Create;
        Result.PixelFormat := pf32bit;
        Result.Width       := Png.Width;
        Result.Height      := Png.Height;
     
        //Copie Png dans Bitmap
        for y := 0 to Result.Height -1 do
        begin
          RGBA := Result.Scanline[y];
          RGB  := Png.Scanline[y];
     
          for x := 0 to Result.Width -1 do
          begin
            RGBA[x].rgbRed      := RGB[x].rgbtRed;
            RGBA[x].rgbGreen    := RGB[x].rgbtGreen;
            RGBA[x].rgbBlue     := RGB[x].rgbtBlue;
            RGBA[x].rgbReserved := Png.AlphaScanline[y][x];
          end;
        end;
     
      finally
        Png.Free;
      end;
    end;
     
    { TLayeredForm }
     
    constructor TLayeredForm.Create(aOwner: TComponent);
    begin
      inherited;
      //Fiche transparente
      BorderStyle           := bsNone;
      TransparentColorValue := Color;
      TransparentColor      := TRUE;
     
      //Fond
      BkForm := TBackgroundForm.CreateNew(Self);
    end;
     
    procedure TLayeredForm.LoadImageFromFile(aFileName: TFileName);
    begin
      if not FileExists(aFileName) then
        Raise Exception.Create(aFileName +#13'File not found');
     
      BkForm.SetImage(LoadPngToBmp(aFileName));
      BoundsRect     := BkForm.BoundsRect;
      BkForm.Visible := TRUE;
    end;
     
    { TBackgroundForm }
     
    constructor TBackgroundForm.CreateNew(AOwner: TComponent; Dummy: Integer);
    begin
      inherited;
     
      Image := nil;
     
      SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
     
      with Blend do
      begin
        BlendOp             := AC_SRC_OVER;
        BlendFlags          := 0;
        SourceConstantAlpha := 255;
        AlphaFormat         := AC_SRC_ALPHA;
      end;
     
      Refresh;
    end;
     
    destructor TBackgroundForm.Destroy;
    begin
      Image.Free;
      inherited;
    end;
     
    procedure TBackgroundForm.WMWindowPosChanged(var Message: TMessage);
    begin
      inherited;
     
      if not (csDestroying in ComponentState) then
        TForm(Owner).BoundsRect := BoundsRect;
    end;
     
    procedure TBackgroundForm.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      inherited;
     
      ReleaseCapture;
      PostMessage(Handle, WM_SYSCOMMAND, SC_MOVE or HTCAPTION, 0);
    end;
     
    procedure TBackgroundForm.Refresh;
    var
      i  :integer;
      R1, R2 :hRgn;
    begin
      //Découpe les zones où doivent apparaître les Controls
      R1 := CreateRectRgn(0, 0, Width, Height);
     
      with TForm(Owner) do
        for i := 0 to ControlCount -1 do
          with Controls[i].BoundsRect do
        begin
          R2 := CreateRectRgn(Left, Top, Right, Bottom);
          CombineRgn(R1, R1, R2, RGN_XOR);
          DeleteObject(R2);
        end;
     
      SetWindowRgn(handle, R1, TRUE);
      DeleteObject(R1);
    end;
     
    procedure TBackgroundForm.SetImage(const aImage: TBitmap);
    const
      BmpTopLeft : TPoint = (x:0; y:0);
    var
      Size  :TPoint;
     
    begin
      FreeAndNil(Image);
     
      Image  := aImage;
      Width  := Image.Width;
      Height := Image.Height;
      Size.X := Height;
      Size.Y := Height;
     
      UpdateLayeredWindow(Handle, 0, nil, @Size, Image.Canvas.handle, @BmpTopLeft, 0, @Blend, ULW_ALPHA);
    end;
     
    initialization
    //  ReportMemoryLeaksOnShutDown := TRUE;
     
    end.
    Pour ceux qui voudraient tester, il suffit de créer une nouvelle fiche héritée de TLayerdForm et d'appeler LoadImageFromFile dans OnCreate.

    A noter que si on supprime Application.MainFormOnTaskbar := True dans la source du projet, on n'a plus de soucis avec la barre des tâches.

  5. #45
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ AndNotOr, je l'aurai parié, ta consciense professionnelle est au rendez-vous pour nous concocter une nouvelle approche.

    L'Expert a parlé.

    Au fait ,

    A noter que si on supprime Application.MainFormOnTaskbar := True dans la source du projet, on n'a plus de soucis avec la barre des tâches.
    Je l'avais dit dans mon post d'hier à 19H32, il s'agit d'un résidu d'un composant utilisé par 3xoui me semble t'il car dans le code proposé, je n'avais pas cette ligne.

    Il faut naturellement l'enlever dans l'unité du projet.

    @+,

    Cincap

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Bouquet final



    @ Andnotor :
    [...]Pour ceux qui voudraient tester, il suffit de créer une nouvelle fiche héritée de TLayerdForm et d'appeler LoadImageFromFile dans OnCreate.
    TLayerdForm ?? tu le pêches à quel endroit ?
    Edit : je viens de trouver = dans ton Sudoku, mais pas un moyen plus simple, sans réaliser cet héritage ?
    Bref un petit exemple tout prêt à se mettre sous la dent


    Car en attendant d'admirer sur pièce...

    .


    @ Cincap :
    Suite aux différentes idées d'améliorations de ton code par Andnotor ; alors elle arrive cette nouvelle mouture ?

    bon courage

  7. #47
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Oui. bien sûr. Il faut créer une nouvelle fiche une fois et copier ce code.
    (L'ajouter au référenciel si tu veux l'utiliser facilement dans plusieurs projets)

    Ensuite,
    Fichier/Nouveau/Autres... -> Elements héritables et sélectionner cette fiche.

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Merci de toutes ces précisions, mais je n'ai pas "Eléments héritables" sous mon D7 perso.

    A moins que ça se cache super bien.

  9. #49
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Droïde Système7, Bonjour, concernant les remarques judicieuses de AndNotOr, j'ai un plantage au niveau de :

    Ces passages par un bitmap intermédaire AlphaBitmap et ces conversions HSL sont inutiles. Tu peux directement copier l'information alpha du png au bitmap final:
    Pour le Bmp.free, c'est ok et tu peux déjà l'adapter.

    Le problème c'est que je manque de temps, car beaucoup d'examens médicaux depuis mes trois infarctus plus entretien d'une propriété de 60ares (6000m2).

    Donc tu vois mes journées défilent.

    @+,

    Cincap

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour à tous,

    Cincap, écoute surtout pense à toi, la santé d'abord, les choses autres sont sans importance à côté !

    Soigne-toi déjà

  11. #51
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    je n'arrive pas à faire fonctionner la version de Andnotor
    j'ai une violation d'accès sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            RGBA[x].rgbReserved := Png.AlphaScanline[y][x];
    j'ai fait plein de png, transparent ou non, canal alpha, etc ...
    et si je comment et charge un bmp direct avec 3 rectangle de couleur vive différente rien ne s'affiche.

    on ne pourrai pas avoir un projet test s'il vous plais oh grand Andnotor
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Sous quelle version de Delphi es-tu ouiouioui ?

  13. #53
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Voilà une démo.
    Il y a bien sûr encore des choses à améliorer
    Fichiers attachés Fichiers attachés

  14. #54
    Membre expérimenté
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 984
    Points : 1 418
    Points
    1 418
    Par défaut
    Merci, ligne 180 de CustomLayeredForm c'est pas plutôt sa :
    sinon sa fait 2h que j'essaye avec mon image en pièce jointe sans succès elle est découpé trop petit, j'ai essayé avec ton projet même résultat sur mon image, sa me rassure dans un sens
    Images attachées Images attachées  
    Il existe 3 sortes de gens: ceux qui savent compter et ceux qui ne savent pas.

  15. #55
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @3xoui, avec ma solution ton image est superbe sous Seven 64 bits.

    4 boutons différents pour Exit.

    @+,

    Cincap

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 14
    Dernier message: 10/11/2005, 11h14
  2. [WSAD]Renseignements sur WSAD svp :-)
    Par LESOLEIL dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 21/10/2005, 15h47
  3. renseignements sur SQL Server 2000
    Par nagty dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 03/06/2005, 20h59
  4. Renseignements sur TChart
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 29/06/2004, 12h48
  5. Renseignement sur TPU Motorola 68332
    Par N*E*R*D dans le forum Autres architectures
    Réponses: 7
    Dernier message: 06/04/2004, 09h57

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