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 :

Transparence d'un composant


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Par défaut Transparence d'un composant
    Bonjour.

    Dans le cadre du développement d'un moteur graphique, je suis amené à trouver une solution pour avoir un composant transparent recouvrant ma fenètre graphique. Ce composant me permettra de dessiner des curseurs spéciaux sans altérer le contenu de la fenètre openGL.

    Ainsi, je me suis intéressé à la propriété de transparence des TForm. Mais en procédant comme suit, la transparence ne semble pas fonctionner, pourquoi?

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
     
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        OverLayer : TForm;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      OverLayer := TForm.CreateNew(nil);
      OverLayer.Parent := Self;
      OverLayer.BorderStyle := bsNone;
      OverLayer.Color := clWhite;
      OverLayer.Show;
      OverLayer.TransparentColor := TRUE;
      OverLayer.TransparentColorValue := clWhite;
      OverLayer.AlphaBlend := TRUE;
      OverLayer.AlphaBlendValue := 0;
    end;
     
    end.
    Merci d'avance pour votre contribution.
    Cordialement,
    Benjamin

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    Citation Envoyé par Grosbenji
    Ainsi, je me suis intéressé à la propriété de transparence des TForm. Mais en procédant comme suit, la transparence ne semble pas fonctionner, pourquoi?
    Je ne pense pas que ce soit la bonne méthode
    En effet, ce serait beaucoup plus efficace si tu dessinais toi-même ce panel. Pour ma part, c'est ce que je fais en DirectX et cela marche très bien et permet de dessiner à peu près n'importe quoi
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Par défaut
    Re,
    Merci pour ta réponse!
    Je m'en doutai... Mais vu que la TForm possédait déjà une propriété de transparence, j'ai voulu tester l'affaire...
    Ce que tu me proposes c'est de construire un panel en passant dans les paramètres de construction WS_EX_TRANSPARENT, c'est bien ça?
    Cordialement,
    Benjamin

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par Grosbenji
    Ce que tu me proposes c'est de construire un panel en passant dans les paramètres de construction WS_EX_TRANSPARENT, c'est bien ça?
    Je ne sais pas, je ne connais pas les paramètres/fonction de OpenGL.
    Ce que je te propose c'est de dessiner un rectangle sur la surface directement avec les fonctions de OpenGL pour avoir une forme similaire à un panel. Il est parfaitement possible de refaire les contrôles de la VCL directement avec DirectX.
    Per exemple, voila ce que j'avais commencé pour un jeu en DirectX avec les composants Asphyre:
    http://orbedutemps.developpez.com/si...es/screenshots
    (la 3ème image)
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Par défaut
    Ok, merci, c'est sympa.

    Mais dans mon cas, je voulai pouvoir modifier le contenu du composant transparant sans avoir à redisser ma fenètre OpenGL (plusieurs millions de triangles à dessiner, donc temps du refresh trop long).

    Voici ce que j'ai fait:

    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
    unit SFK_OverLayer;
     
    interface
     
    uses ExtCtrls, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
         StdCtrls;
     
    type
      TSFKOverLayer = class(TPanel)
      private
      procedure   CreateParams(var Params: TCreateParams); override;
      procedure   WndProc( var Message: TMessage); override;
      constructor Create(AOwner: TComponent); override;
      public
      property  Canvas;
      end;
     
    implementation
     
    procedure TSFKOverLayer.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      Params.ExStyle := Params.ExStyle
                        or WS_EX_TRANSPARENT;
    end;
     
    constructor TSFKOverLayer.Create(AOwner: TComponent);
    begin
      inherited;
      canvas.Pen.color := clWhite;
    end;
     
    procedure TSFKOverLayer.WndProc( var Message: TMessage);
    begin
      if (Message.Msg = WM_MOUSEMOVE) and Assigned(Parent) then
        PostMessage(Parent.Handle,Message.Msg,Message.WParam,Message.LParam);
      inherited;
    end;
     
    end.
    Je peux donc modifier comme je veux le canvas de mon composant sans avoir besoin de faire un refresh pour ma fenètre graphique.

    Cordialement,
    Benjamin

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

Discussions similaires

  1. [SP-2007] Afficher des images avec un fond transparent avec le composant "Summary link webpart"
    Par cloeclodesonoeuf dans le forum SharePoint
    Réponses: 1
    Dernier message: 20/09/2012, 10h35
  2. Réponses: 3
    Dernier message: 27/05/2010, 16h39
  3. Composant dessiner arrière-plan transparent
    Par blinkseb dans le forum Composants VCL
    Réponses: 9
    Dernier message: 18/09/2009, 09h47
  4. Fond transparent pour un composant List ?
    Par Judeux dans le forum Flash
    Réponses: 2
    Dernier message: 18/01/2007, 09h31
  5. [Composant] La transparence
    Par Nuts07 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/05/2003, 14h51

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