Texturer une fenetre ou y placer une image ? [Résolu]

Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
- - Dernière réponse : Nicolas___
Messages postés
1039
Date d'inscription
jeudi 2 novembre 2000
Dernière intervention
24 avril 2013
- 17 déc. 2009 à 10:55
Bonjour,

Je souhaiterais savoir comment je peux changer la couleur de fond de ma form par une texture (ou un dégradé de couleur), voire si c'est possible une image de fond.

J'avez pensez à un composant TImage mais à la compilation les images qui sont placées dedans s'en trouvent altérés (perte de qualité), je pense que le composant gére un nombre limité de couleurs.

Merci de me donner votre avis.

Cordialement,
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
Salut,

pour placer une texture sur le fond d'une fiche ... rien de plus simple:

[hr][b]var

  /baBMP: TBitmap;
procedure TForm1.FormCreate(Sender: TObject);
[b]begin
  /baBMP := TBitmap.Create;
  aBMP.LoadFromFile('images\misc026.bmp');
  Canvas.Brush.Handle := CreatePatternBrush(aBMP.Handle);
end;

procedure TForm1.FormDestroy(Sender: TObject);
[b]begin
  /baBmp.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
[b]begin
  /bCanvas.FillRect(ClientRect);
end;
[hr]
et c'est tout

pour un dégradé voir cette source


[hr]@+Cirec
[hr]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
avec quelle version de Delphi tu compiles le code ?

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.FillRect(ClientRect);
end;

initialization

finalization
  if Assigned(aBmp) then
    aBmp.Free;
end.


pour le reste .. oui tout est possible mais la méthode présentée ici n'est pas adaptée à un stretch ... l'effet produit ici est équivalent à l'option "Mosaïque" du papier peint du bureau et elle s'adapte toute seule à la taille de la fenêtre ... il n'est pas utile de gérer un "Resize" ... c'est fait automatiquement.

C'est vraiment fait pour utiliser avec des textures.

Pour Stretcher (par ex.) il faut créer un Bitmap intermédiaire de la taille souhaité (taille de la fiche: "ClientRect") faire une copie avec StretchBlt (en HALFTONE) et dans le onPaint un BitBlt sur le canvas de la fiche ... le truc classique quoi

mais encore une fois ... pour texturer c'est le code que j'ai donné plus haut !!
Essayes le avec un bitmap de petite taille (genre 80 * 50) et si possible une texture, pour bien te rendre compte du résultat


[hr]@+Cirec
[hr]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Cirec
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
3
Merci
Met un "initialization" juste avant.

Cordialement, Bacterius !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Bacterius
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Dernière intervention
18 novembre 2010
0
Merci
As-tu cherché le mot "skin" sur delphifr ?
Commenter la réponse de JulioDelphi
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
0
Merci
Si t'as Vista ou seven (tourne beaucoup mieux sur seven il paraît) tu peux placer un bel effet de verre en fond de ton application. Si l'utilisateur ne choisit pas une couleur trop agressive (genre rouge intensité maximale) ça peut faire joli. Et avec l'unité de support que je prépare ça sera du gateau de poser des composants dessus

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
Bonjour et merci à tous.

Un remerciement tous particulier à Cirec pour son code, qui avec son code constitue pour moi une réponse simple et adapté.

J'ai par contre deux questions sur le code de Cirec :
- Quand je ferme mon appli en ayant mis son code ci-dessus, l'appli me renvoie une erreur : "débordement de pile" quelqu'un as-t'il une idée ?

- Peut-t'on améliorer ce code pour pouvoir avoir des options de streetching (étirer l'image selon la taille de la form) ?

Merci à tous en cas.
Commenter la réponse de vieuxpere
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
Pour le débordement de pile j'ai enlevé le "aBmp.Free" dans le ondestroy et ça ne le fait plus.
Commenter la réponse de vieuxpere
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
0
Merci
Il faut le mettre ! Sinon fuite de mémoire.
Mets-le plutôt dans un finalization à la fin de ton code :

finalization
aBmp.Free;

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
Merci bacterius mais à a fin de mon code c'est où "end." ??
Commenter la réponse de vieuxpere
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
0
Merci
Juste avant le "end." final.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
Merci quand je le met juste avant le end. il me marque [DCC Erreur] Unit1.pas(52): E2029 Déclaration attendu(e) mais 'FINALIZATION' trouvé(e).

Voici mon code complet :
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


var
aBMP: TBitmap;

procedure TForm1.FormCreate(Sender: TObject);

Var aBMP: TBitmap;
begin
aBMP := TBitmap.Create;
aBMP.LoadFromFile('1.bmp');
Canvas.Brush.Handle := CreatePatternBrush(aBMP.Handle);
end;

procedure TForm1.FormDestroy(Sender: TObject);
Var aBMP: TBitmap;
begin
//aBmp.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.FillRect(ClientRect);
end;

finalization
aBmp.Free;

end.
Commenter la réponse de vieuxpere
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
Merci Beaucoup Cirec et Bacteris,

Pour le pb de compilation en effet, il fallait mettre d'abord en effet initialization.

Pour la fonction mosaique, j'ai bien compris.

Merci encore.
Commenter la réponse de vieuxpere
Messages postés
1039
Date d'inscription
jeudi 2 novembre 2000
Dernière intervention
24 avril 2013
0
Merci
" Canvas.Brush.Handle := CreatePatternBrush(aBMP.Handle); "

Waw , c'est tout simplement génial ce code ... moi qui me faisais toujours chi** à le réaliser "manuellement"

Merci

Nico
Commenter la réponse de Nicolas___

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.