Form aux bords irreguliers en fonction d'une image,(decoupage, transparence, regions)

Soyez le premier à donner votre avis sur cette source.

Vue 11 813 fois - Téléchargée 1 485 fois

Description

Cette procedure vous permettera de 'découper' une form en fonction d'une bitmap

Paramètres :
- obj : la form sur laquelle appliquer le découpage
- img : image de fond , ki sert pour le découpage
- couleur : couleur de la transparence(tous les pixels de cette couleur seront transparents)

Pour une utilisation simple :
Placer un TImage sur votre form
Ouvrez l'image ke vous voulez dans le TImage
Mettez la propriété AutoSize de la form et du Timage a true
Dans FormCreate : appeller la fonction : Former(Form1,Image1.Picture.Bitmap,clfuchsia); par exemple
voila, votre form est découer en fonction de l'image du TImage :)

Attention : Votre image devra comporter un pixel de plus de chaque coté !!! ;)

Source / Exemple :


procedure former(Obj:tform;img:tbitmap;couleur:tcolor);
var
x, y, reg, regtemp, debut, fin:integer;
EtaitTrans, first:boolean;
begin
obj.height:=img.height;                         //on adapte les
obj.width:=img.width;                           //dimensions de la fiche
first:=true;                                    //c'est pour savoir si on a deja créé une région : voir CombineRgn (nécessite une region non vide)
for y:=1 to img.height do begin
  debut:=1;                                     //debut=debut de la zone non- transparente
  fin:=1;                                       //fin =fin  de la zone non- transparente
  EtaitTrans:=true;                             //EtaitTrans, c'est pour savoir si le pixel examiné précédemment était transparent ou pas
  for x:=1 to img.width do begin
    if img.Canvas.Pixels[x,y]=couleur then begin//si le pixel est transparent
      if EtaitTrans=false then begin            //et que le précédent ne l'etait pas
        fin:=x-1;                               //le dernier pixel non transparent etait le precedent
        if first=true then begin                //si c'est la 1°region qu'on crée:
          reg:=CreateRectRgn(debut,y,fin+1,y+1);//on la crée
          first:=false;                         //la prochaine ne sera plus la premiere
        end else begin                          //si c'est pas la premiere region
          regtemp:=createrectrgn(debut,y,fin+1,y+1);//on en crée une temporaire
          CombineRgn(reg, reg, regtemp, rgn_or);//on l'ajoute à reg qui sera la region finale avec rgn_or (voir autres possibilités dans l'aide)
          deleteobject(regtemp);                //on supprime la region temporaire
        end;
      end;
      EtaitTrans:=true;
    end else begin                              //le pixel n'est pas transparent
      if EtaitTrans=true then debut:=x;         //ben oui rien que ca
      EtaitTrans:=false;
      if x=img.width-1 then                     //on arrive au dernier point de la ligne
      if first=true then begin                  //si c'est la 1°region qu'on crée:
        reg:=CreateRectRgn(debut,y,x,y+1);      //on la crée
        first:=false;                           //la prochaine ne sera plus la premiere
      end else begin                            //si c'est pas la premiere region
        regtemp:=createrectrgn(debut,y,x,y+1);  //on en crée une temporaire
        CombineRgn(reg, reg, regtemp, rgn_or);  //on l'ajoute à reg qui sera la region finale avec rgn_or (voir autres possibilités dans l'aide)
        deleteobject(regtemp);                  //on supprime la region temporaire pour rester propres (si on ne le fait pas, ca se fait autom. qd on ferme l'application)
      end;
    end;
  end;
end;

SetWindowRgn(Obj.handle, reg,true);             //on applique la region finale !
end;

Conclusion :


Voir le zip pour un exemple simple et concret :)

ce code n'est pas de moi

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Youyou0214
Messages postés
89
Date d'inscription
jeudi 11 avril 2002
Statut
Membre
Dernière intervention
3 juillet 2003
-
Il est génial ce truc! c'est exactement se que je cherchais!
cs_Incanus
Messages postés
11
Date d'inscription
mardi 16 juillet 2002
Statut
Membre
Dernière intervention
29 juin 2003
-
Je ne comprend pas pourqoi tu utilise un code si long alors que delphi le fait automatiquement.
En effet, l'une des caractéristique d'un FORM permet de rendre une couleur transparente. Par exemple prenons le rouge. Tu met en la caractérisique COLOR de la forme en rouge et tu met la form sans bord. Place maintenant ton image et met la caractéristique de l'image TRANSPARENCE rt la tu obtient la même chose sans ligne de code.
J'espére que j'ai été clair.
fabiin
Messages postés
338
Date d'inscription
mercredi 4 avril 2001
Statut
Membre
Dernière intervention
8 décembre 2009
6 -
C'est exacte, je ne savais pas !
Merci
Thunder_nico
Messages postés
2
Date d'inscription
mercredi 24 mars 2004
Statut
Membre
Dernière intervention
19 juillet 2004
-
sous 98 delphi ne gere pas la transparence en plus en modifiant un peu cette source on peut facilment réalisé une interface skinnable avec plein d'image , seul ptit truc il faut modifier les point de depart et d'arrivé d'une image car g jamais vu une image commencer a 1 personnellement ;)! en prog ca commence toujours a 0
Snesman
Messages postés
1
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
17 janvier 2005
-
Sous Xp, ça compile que dalle de ce qui est dans le zip. Sinon je cherchais à faire depuis longtemps, merci.

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.