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 :

ajuster la taille de l'image avec de la form


Sujet :

Delphi

  1. #1
    Débutant  
    Inscrit en
    Mars 2008
    Messages
    1 123
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 1 123
    Points : 170
    Points
    170
    Par défaut ajuster la taille de l'image avec de la form
    j'ai fait une image comme arriere plan dans une form mais je veux que même l'utilisateur agrandit la taille de la form la taille de l'image aura la même taille de la fenêtre c'est à dire comment ajuster la taille de l'image avec celle de la form
    merci

  2. #2
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    J'imagine que tu utilises le composant TImage pour placer ton image dans la form ?

    Dans ce cas, mets la propriété "Align" à ... euhh je sais plus, enfin joue avec cette propriété.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 446
    Points : 1 333
    Points
    1 333
    Par défaut Eh oui !
    @ Sky88, comme on te l'as dit, dans les propriétés de image1.align := AlClient et peut être image1.stretch := true

    @+,

    Cincap

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 370
    Points : 3 144
    Points
    3 144
    Par défaut
    Bonjour,

    c'est Align = AlClient

    mais il faut aussi que tu mettes Stretch = True

    Attention : l'image sera déformée si la fenêtre n'a pas les mêmes proportions que l'image

    A+

    Charly

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 560
    Points : 25 156
    Points
    25 156
    Par défaut
    Image en TImage, donc Align en alClient
    Image via Paint, à toi de faire le StrechDraw
    Image via WindowProc, le plus performant, idem, il faut faire son met le StretchDraw ou passer par une Mosaîque ...

    Je te propose ce code :
    Bon, le TImage est inutile, c'est juste la fleme de faire un TBitMap à la main

    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
    unit Frm_BackGround;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;
     
    type
      TFrmBackGround = class(TForm)
        Background: TImage;
        CkbBackGroundStretch: TCheckBox;
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        FNewClientWP : TFarProc; // Pointer ça serait pareil, c'est juste plus lisible
        FOldClientWP : TFarProc;
     
        procedure FormWndProc(var Message: TMessage);
     
      public
        { Déclarations publiques }
      end;
     
    var
      FrmBackGround: TFrmBackGround;
     
    implementation
     
    {$R *.dfm}
     
    procedure TFrmBackGround.FormCreate(Sender: TObject);
    begin
      if FileExists('.\Background.bmp') then
        Background.Picture.Bitmap.LoadFromFile('.\Background.bmp');
     
      // D'abord pour la nouvelle procédure de fenêre on crée une instance :
      FNewClientWP := Classes.MakeObjectInstance(FormWndProc);
      // la méthode MDIClientWndProc sera implémentée par la suite..
     
      (*
      On fait pointer le deuxième pointeur sur l'ancienne WindowProc
      On établit la permutation des WindowProc avec la fonction API SetWindowLong
      On remarque que l'on passe en argument le Handle de la fenêtre au complet
      Pour une feneêtre MDI Main, cela serait le Handle de la zone Client et pas celui de la fenêtre au complet
      *)
     
      FOldClientWP := TFarProc(SetWindowLong(Handle, GWL_WNDPROC, Integer(FNewClientWP)));
    end;
     
    // Le but du jeu est d'intercepter les messages qui nous intéressent et de
    // rediriger les autres vers l'ancienne WindowProc (par l'intermédiaire du
    // pointeur OldWP)
    procedure TFrmBackGround.FormWndProc(var Message: TMessage);
     
      procedure BackGroungBlt(HDestDC: HDC; DestWidth, DestHeight: Integer; HSourceDC: HDC; SourceWidth, SourceHeight: Integer);
      var
         iH, iV: Integer;
         DestHCount, DestVCount: Integer;
         ClientRect: TRect;
      begin
        if CkbBackGroundStretch.Checked then
        begin
           StretchBlt(HDestDC, 0, 0, ClientWidth, ClientHeight, HSourceDC, 0, 0, SourceWidth, SourceHeight, SRCCOPY);
           // appelle la fonction "copie en étirant une image"
        end else
        begin
           DestHCount := DestWidth div SourceWidth;
           DestVCount := DestHeight div SourceHeight;
     
           // y = y + SourceHeight)
           for iV := 0 to DestVCount do
           begin
              //x = x + SourceWidth)
              for iH := 0 to DestHCount do
              begin
                 BitBlt(HDestDC, iH*SourceWidth, iV*SourceHeight, SourceWidth, SourceHeight, HSourceDC, 0, 0, SRCCOPY);
                 // Copie l'image sur le "fond" de la zone client
              end;
           end;
        end;
      end;
     
      procedure EraseBackGround(hWnd: HWND);
       var
         LocalHDC: HDC;
       begin
          LocalHDC := HDC(Message.WParam); // récupère le HDC du message
          SelectPalette(LocalHDC, Background.Picture.Bitmap.Palette, True);
          // récupère la palette de l'image que l'on a choisi pour fond
          RealizePalette(LocalHDC); // applique la palette
          // appelle la fonction "Affichage de l'image"
          BackGroungBlt(LocalHDC, Width, Height, Background.Canvas.Handle,
                  Background.Picture.Bitmap.Width, Background.Picture.Bitmap.Height);
     
          Message.Result := 0;// renvoie un message nul pour pas que l'ancienne WindowProc "intervienne"
       end;
     
       procedure QueryNewPalette(hWnd: HWND);
       var
         LocalHDC: HDC;
       begin
          LocalHDC := GetDC(hWnd); // récupère le Handle de la zone client
     
          SelectPalette(LocalHDC, Background.Picture.Bitmap.Palette, True);
          // récupère la palette de l'image que l'on a choisi pour fond
          RealizePalette(LocalHDC);// applique la palette
          InvalidateRect(hWnd, nil, true); // provoque le raffraichissement de la zone client
     
          ReleaseDC(hWnd, LocalHDC); // relache le Handle
     
          Message.Result := 0;// renvoie un message nul pour pas que l'ancienne WindowProc "intervienne"
       end;
     
       procedure PaletteChanged(hWnd: HWND);
       var
         LocalHDC: HDC;
       begin
          // si le Handle transmis par le message est différent du Handle de la zone client
          if (Message.WParam <> hWnd) then
          begin
             LocalHDC := GetDC(hWnd); // récupère le Handle de la zone client
     
             SelectPalette(LocalHDC, Background.Picture.Bitmap.Palette, True);
             // récupère la palette de l'image que l'on a choisi pour fond
             RealizePalette(LocalHDC); // applique la palette
             UpdateColors(LocalHDC); // raffraichit les couleurs
     
             ReleaseDC(hWnd, LocalHDC); // relache le Handle de la zone client
          end;
     
          Message.Result := 0; // renvoie un message nul pour pas que l'ancienne WindowProc "intervienne"
       end;
     
    begin
      case Message.Msg of
         WM_ERASEBKGND: EraseBackGround(Handle);
         WM_QUERYNEWPALETTE: QueryNewPalette(Handle);
         WM_PALETTECHANGED: PaletteChanged(Handle);
         WM_HSCROLL, WM_VSCROLL, WM_SIZE : InvalidateRect(Handle, nil, True);
         else
            Message.Result := CallWindowProc(FOldClientWP, Handle, Message.Msg, Message.WParam, Message.LParam);
      end;
    end;
     
     
    end.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 446
    Points : 1 333
    Points
    1 333
    Par défaut Bug D6 !
    @ ShaiLeTroll, sérieux bug avec D6 et ta proposition.

    Difficile de reprendre la main en mode compilation et après.

    @+,

    Cincap

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 446
    Points : 1 333
    Points
    1 333
    Par défaut Utiliser une ressource !
    Bonjour à toutes et à tous,

    @ Sky88, tu pourrais aussi utiliser une texture en bmp et la placer dans un fichier *.res qui sera prise en compte dans ta version compilée.

    A la création de ta fiche, cette ressource serait chargée et le tour est joué.

    N. B. qu'une petite image de texture comme background est conseillée plutôt qu'une photo d'une voiture à cause du paramètre des dimensions H X L de ta fiche principale.

    Plus de problème si ta fiche apparaît normalement ou agrandie.

    @+,

    Cincap

  8. #8
    Débutant  
    Inscrit en
    Mars 2008
    Messages
    1 123
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 1 123
    Points : 170
    Points
    170
    Par défaut
    @ Charly910
    merci ça marche trés bien mais comme résultat j'ai eu 2 barres de titre

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 446
    Points : 1 333
    Points
    1 333
    Par défaut Rien à voir avec ton topic !
    @ Sky88, ce lien n'a rien à voir avec ta question d'aide.

    Soit plus méthodique !

    N'oublies pas puisque Charly910 t'a aidé hier à 15H08 de marquer "Résolu"

    @+,

    Cincap

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 560
    Points : 25 156
    Points
    25 156
    Par défaut
    Citation Envoyé par cincap Voir le message
    @ ShaiLeTroll, sérieux bug avec D6 et ta proposition.
    Difficile de reprendre la main en mode compilation et après.
    Je suis en D6 aussi, cela fonctionn très bien, attention, ce n'est pas la MainForm mais une form secondaire en Show ...

    Tes difficultés m'interessent, as-tu pris le dernier code ? j'avais effectivement une erreur sur le handle utilisé ...

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 446
    Points : 1 333
    Points
    1 333
    Par défaut J'avais bien compris !
    @ ShaiLeTroll, oui j'appelle ta fiche dans le onclick de mon Tbutton qui est sur ma 1ere fiche.

    L'écran tremble et difficile de prendre la main pour stopper le programme en mode compilation.

    J'utilise le code de ton topic.

    @+,

    Cincap

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 446
    Points : 1 333
    Points
    1 333
    Par défaut Désolé !
    @ ShaiLeTroll, désolé je n'avais pas vu la modif depuis mon intervention.

    Cela fonctionne donc, rien à redire !

    Sinon la texture en ressource est aussi une idée.

    @+,

    Cincap

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 446
    Points : 1 333
    Points
    1 333
    Par défaut Bon voila !
    Bon pour celui qui voudrait utiliser l'excellente astuce de ShaiLeTroll,voici le chargement depuis une ressource contenant un Bitmap :

    Ma ressource = Fond.rc = FOND BITMAP "AudiR8_1.bmp"

    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
     
    implementation
     
    {$R *.dfm}
    {$r Fond.res}
     
    procedure TFormtest.FormCreate(Sender: TObject);
    Var
    Fond : TBitmap;
    begin
     //if FileExists('AudiR8_1.bmp') then Background.Picture.Bitmap.LoadFromFile('AudiR8_1.bmp');
      Fond := tbitmap.Create; { on crée un bitmap }
     
      Fond.LoadFromResourceName(hinstance,'FOND');  { On charge le Bitmap de la ressource }
      Background.Picture.Bitmap := Fond; { on paint le form }
     
     // D'abord pour la nouvelle procédure de fenêre on crée une instance :
      FNewClientWP := Classes.MakeObjectInstance(FormWndProc);
      // la méthode MDIClientWndProc sera implémentée par la suite..
     
      (*
      On fait pointer le deuxième pointeur sur l'ancienne WindowProc
      On établit la permutation des WindowProc avec la fonction API SetWindowLong
      On remarque que l'on passe en argument le Handle de la fenêtre au complet
      Pour une feneêtre MDI Main, cela serait le Handle de la zone Client et pas celui de la fenêtre au complet
      *)
     
      FOldClientWP := TFarProc(SetWindowLong(Handle, GWL_WNDPROC, Integer(FNewClientWP)));
    end;
    @+,

    Cincap

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

Discussions similaires

  1. Récupérer taille d'une image avec IE
    Par olbouss dans le forum jQuery
    Réponses: 5
    Dernier message: 03/11/2009, 09h20
  2. Réponses: 7
    Dernier message: 21/03/2009, 13h29
  3. Comment ajuster la taille d'une image en background ?
    Par ach152 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 30/10/2008, 00h34
  4. Ajuster la taille d'une image à la zone image
    Par ecarbill dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 30/08/2006, 19h41
  5. Recuperation de la taille d'une image avec la propriété SRC
    Par CDRIK dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/10/2004, 03h05

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