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
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.