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

Langage Delphi Discussion :

[D6] Comment modifier la forme rectangulaire par défaut d'un TImage ?


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut [D6] Comment modifier la forme rectangulaire par défaut d'un TImage ?
    Comment modifier la forme rectangulaire par défaut d'un TImage ?

    Par exemple, imaginons une bitmap d'un disque que je charge dans un TImage.
    Serait-il possible d'ajuster la forme du TImage à la forme du bitmap chargé dedans (donc circulaire) ?
    Le but est de pouvoir cliquer plus facilement sur ce qu'il y a derrière le TImage.

    J'ai pensé aux régions : ça fonctionne bien pour les TForm.
    J'avais trouvé un bout de code qui semblait faire ça (http://www.developpez.net/forums/d12...conque-bitmap/), mais je n'arrive plus à m'en servir :
    Si j'ai bien compris, il balaye l'image et semble remplir un PRgnData de tout les pixels considérés comme transparents.
    Et ensuite, un simple appel à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * nMaxRects), RgnData^);
    Mais, il semblerait que les régions soient dépréciées, et ne soient plus gérées à partir de Windows 7 (inclu).
    Y a t'il quelque chose qui permette de remplacer les régions ?

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut Dessin dans une forme non rectangulaire
    Tu peux surcharger la méthode onPaint d'un TShape.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Citation Envoyé par Lung Voir le message
    Mais, il semblerait que les régions soient dépréciées, et ne soient plus gérées à partir de Windows 7 (inclu).
    Non non, les régions fonctionnent toujours. Il faut par contre que l'élément ait un handle ce qui n'est pas le cas du TImage. Il faut le poser sur un panel et agir sur ce dernier par SetWindowRgn.

    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
    function CreateBitmapRgn(aBmp :TBitmap): hRGN;
    type
      PRGBTripleArray = ^TRGBTripleArray;
      TRGBTripleArray = array[0..0] of TRGBTriple;
     
    var
      x, y  :integer;
      RGB   :PRGBTripleArray; //Bitmap 24 bits
      Start :integer;
     
      //
      procedure AddRgn;
      var
        Rgn :hRGN;
      begin
        Rgn := CreateRectRgn(Start, y, x, y+1);
        CombineRgn(Result, Result, Rgn, RGN_OR);
        DeleteObject(Rgn);
        Start := -1;
      end;
      //
     
    begin
      Result := CreateRectRgn(0, 0, 0, 0);
      Start  := -1;
     
      for y := 0 to aBmp.Height -1 do
      begin
        RGB := aBmp.ScanLine[y];
     
        for x := 0 to aBmp.Width -1 do
          //Pour blanc = transparent
          if (RGB[x].rgbtBlue = $FF)  and
             (RGB[x].rgbtGreen = $FF) and
             (RGB[x].rgbtRed = $FF)   then
          begin
            if Start > -1 then AddRgn;
          end
          else if Start = -1 then Start := x;
     
        if Start > -1 then AddRgn;
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      //L'image est posée sur Panel1
      SetWindowRgn(Panel1.Handle, CreateBitmapRgn(Image1.Picture.Bitmap), TRUE);
    end;

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 967
    Points
    6 967
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Non non, les régions fonctionnent toujours. Il faut par contre que l'élément ait un handle ce qui n'est pas le cas du TImage. Il faut le poser sur un panel et agir sur ce dernier par SetWindowRgn
    Effectivement, avec un conteneur comme un TPanel, ça marche.
    J'ai fait un projet de test :
    Nom : # Région 1.jpg
Affichages : 167
Taille : 29,8 KoNom : # Région 2.jpg
Affichages : 168
Taille : 27,3 Ko

    Plus qu'à modifier tout mon projet pour remplacer TImage par TPanel ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/08/2012, 10h50
  2. Comment paramétrer une forme automatique par défaut?
    Par samantha2010 dans le forum C++
    Réponses: 1
    Dernier message: 26/04/2011, 10h32
  3. [C#] Comment implementer mon Navigateur perso par défaut ?
    Par ArHacKnIdE dans le forum Windows Forms
    Réponses: 8
    Dernier message: 12/02/2006, 18h53
  4. [VB.Net] Modifier le symbol monétaire par défaut ?
    Par cedric_g dans le forum VB.NET
    Réponses: 3
    Dernier message: 16/11/2005, 08h44
  5. Réponses: 4
    Dernier message: 04/10/2005, 00h07

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