Image de fond sur Form MDI

cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 18 mai 2006 à 10:10
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 23 mai 2006 à 09:56
bonjour!

j'ai un petit problème génant que je n'arrive pas a résoudre...

je voudrais afficher une image dans la form principal de mon application MDI. J'ai utiliser un TImage avec Align=alClient. ça marche bien.

Mais quand je redimensionne la fenêtre, l'image de fond n'arrête pas de scintiller.

Quelqu'un a une idée? Comment je pourrais éviter ça?

merci,

Loda

PS:
c'est un grand jpeg avec un fond uni et un logo au milieu.

j'ai essayer de mettre align=alNone et une grande taille. idem
j'ai essayer de mettre center=true et une image plus petit, idem.

8 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
18 mai 2006 à 11:08
salut,

dans formcreate met doublebuffered:=True cela devrait résoudre ton problème de scintillement


@+

jlen
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
18 mai 2006 à 11:37
ah, c'est qqch comme ça que je cherchais. :-)

mais, ça n'arrange pas mon problème. snif.

a+

Loda
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
18 mai 2006 à 12:40
Salut,

essaye peut être comme ceci :

  private
    { Déclarations privées }
    Procedure WMEraseBkgnd(VarMessage: TMessage); Message WM_ERASEBKGND;
  public
    { Déclarations publiques }
  end;


 



procedure TForm1.WMEraseBkgnd(varMessage: TMessage);
begin
  Message.Result := 1; // indique à Windows de ne pas effacer.
end;














@+
Cirec
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
18 mai 2006 à 15:40
aller petite solution avec une surprise, compilation conditionnelle sur le type de fond.





const
  GroundType = 2; {selection du type : 0=BMP, 1=JPEG, 2=PNG}

implementation


{$IF GroundType=0}


{$ELSEIF GroundType=1}



  uses JPEG;           {on utilise l'unité JPeg}
{$ELSEIF GroundType=2}
  uses PNGimage;       {on utilise l'unité PNGImage}
{$IFEND}

var
  GNDIMG :  {$IF GroundType=0}
            TBitmap;   
            {$ELSEIF GroundType=1}
            TJPegImage;
            {$ELSEIF GroundType=2}
            TPNGObject;
            {$IFEND}

procedure TForm1.FormCreate(Sender: TObject);
begin
  {$IF GroundType=0}
    GNDIMG := TBitmap.Create;

    GNDIMG.LoadFromFile('c:\logo.bmp');


  {$ELSEIF GroundType=1}
    GNDIMG := TJpegImage.Create;

    GNDIMG.LoadFromFile('c:\logo.jpg');


  {$ELSEIF GroundType=2}
    GNDIMG := TPNGObject.Create;

    GNDIMG.LoadFromFile('c:\logo.png');


  {$IFEND}

  Form1.DoubleBuffered := true;
end;

procedure TForm1.FormPaint(Sender: TObject);
var BMP : TBitmap;
begin
  { on utilise un buffer bitmap pour dessiner avant de transmettre
    le dessin sur le canvas de Form1 }
  BMP             := TBitmap.Create;
  BMP.Width       := ClientWidth; {dimension de la fenetre client}
  BMP.Height      := ClientHeight;
  BMP.PixelFormat := pf24bit;
  with BMP.Canvas do begin
       Brush.Color := clblack; {le fond correspond au fond du logo}
       FillRect(ClientRect);
       if Assigned(GNDIMG) then {si l'image de fond existe}
          Draw( (Width div 2) - (GNDIMG.Width div 2),   {on centre}
                (height div 2) - (GNDIMG.Height div 2), {idem}
                GNDIMG);
  end;
  Canvas.Draw(0,0,BMP); {on dessine sur la fiche}
  BMP.Free; {on libere le buffer}
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(GNDIMG) then GNDIMG.Free; {si GNDIMG est créé on le libere}
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  FormPaint(Sender); {quand on redimensionne on appel Paint}
end;


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
19 mai 2006 à 12:07
merci,

je vais tester tout ça lundi.

Mais je pense pas que je vais faire des alloc dans l'event paint. ;-)

A+

Loda
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
19 mai 2006 à 20:35
AH ? tu vas le faire dans quel evenement ??? OnPatator ? OnMagicEvent ? OnJenyferLopez ?
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
22 mai 2006 à 09:15
je pensais le faire dans OnCreate,

a priori, je ne vois pas l'interêt d'allouer/desallouer le buffer a chaque fois. (vu que le code ne devrait pas être concurent)
De plus, mon problème vient aussi de code executé lors du resize qui ralentise l'affichage. alors si je peux eviter des alloc...

a moins que je me plante bien sur ;-) je vous dirais quand j'aurais essayer.

A+

Loda

PS: OnMagicEvent, c'est celui qui se déclanche toujours juste quand on en a besoin, c'est ça ?
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
23 mai 2006 à 09:56
Bon, j’ai fait des essais ce matin et voilà ce que j’en tire :

Avec la proposition de Cirec je ne vois pas de différence notable (a part la couleur de ma tool bar qui a changé :-).

Avec celle de F0xi, similaire.

Bref.

Je pense que je vais laisser ça comme ça pour le moment.

Merci pour votre aide.

A+

Loda
0
Rejoignez-nous