Accueil > > > POLICE BITMAP
POLICE BITMAP
Information sur la source
Description
Ce petit programme montre comment créer des polices a partir d'une bitmap.
il y a deux polices de fournies avec le code :
POLICE.BMP et POLICE-INT.BMP
Source
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls,jpeg, ExtCtrls;
-
- type
- TForm1 = class(TForm)
- Button1: TButton;
- OpenDialog1: TOpenDialog;
- Edit1: TEdit;
- Image1: TImage;
- procedure FormCreate(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- procedure Edit1KeyPress(Sender: TObject; var Key: Char);
- procedure FormPaint(Sender: TObject);
- private
- { Déclarations privées }
- public
- { Déclarations publiques }
- end;
-
- var
- Form1: TForm1;
- base:Tbitmap;
- Police:Array[32..92]of Tbitmap;
- T: TPicture;
- Xpos,ypos:integer;
- ind:integer;
- IMG:Array[0..100]of Timage;
-
- Procedure Charger_Police(F : String);
- implementation
-
- {$R *.DFM}
-
- {*** Bon, je vais faire un effort sur les commentaires cette fois ! ***}
-
- {*** Cette procédure remplit (d'où son nom) la fenêtre avec
- l'image chargée dans "T" (TPicture) et boucle sur les bords autant
- de fois que nécessaire (étirez la feuille, vous verrez qu'elle est texturée
- partout quelque soit sa taille) ***}
-
- procedure remplir;
- var
- xp,
- yp : integer;
- begin
- xp := 0;
- yp := 0;
- repeat
- repeat
- Form1.Canvas.draw( xp, yp, T.Graphic );
- xp := xp + t.Width;
- until xp > Form1.Width;
- xp :=0 ;
- yp := yp + t.Height;
- until yp > Form1.height;
- end;
-
-
- {*** Dans le FormCreate :
- On charge la texture de fond
- On initialise le tableau qui contiendra la police
- On charge la police par défaut si elle existe ***}
-
-
- procedure TForm1.FormCreate(Sender: TObject);
- var
- n:byte;
- begin
- T := TPicture.Create;
- If FileExists('FOND.BMP')
- Then T.LoadFromFile('FOND.BMP')
- Else Begin
- ShowMessage('Impossible d''ouvrir le fichier FOND.BMP');
- Application.Terminate;
- End;;
-
-
- Base:=Tbitmap.Create;
- Base.height:=16;
- Base.Width:=976; {*** 976 = 16 * 61 caractères ***}
- For n:=32 to 92 do begin
- Police[n]:=Tbitmap.Create;
- Police[n].Height:=16;
- Police[n].Width:=16;
- end;
- xpos:=0;
- ypos:=0;
- ind:=0;
-
- {*** S'il le fichier POLICE.BMP n'existe pas il faudra le chercher à la main ***}
-
- If FileExists('POLICE.BMP') Then Charger_Police('POLICE.BMP');
- end;
-
-
- {*** Chargement de la police, bien entendu le seul paramètre c'est le nom du
- fichier.
- Cette procédure "saucissone" l'image BASE en morceaux de 16*16 et les range
- dans le tableau POLICE initialisé dans le FormCreate.
- Si vous créez une police, faites gaffe que les caractères ne dépassent pas
- 16*16 ***}
-
- Procedure Charger_Police(F : String);
- var
- n,v:byte;
- t:string;
- Begin
- Base.LoadFromFile(F);
- For v:=32 to 92 do
- begin
- n:=v-32;
- Police[v].Canvas.copyrect(rect(0,0,16,16),base.Canvas,rect(n*16,0,(n+1)*16,16))
- End;
-
- n:=Length(F);
-
- Repeat
- v:=n;
- dec(n);
- until F[n]=#92;
-
- t:=copy(F,v,(length(F)-3)-v);
- Form1.caption:=T;
- Form1.EDIT1.Enabled := True;
- End;
-
- {*** Charger une police grâce a un controle OpenDialog ***}
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- if Form1.OpenDialog1.execute then
- If FileExists(OpenDialog1.Filename) Then Charger_Police(OpenDialog1.FileName);
- If Edit1.Enabled Then Edit1.SetFocus;
- end;
-
- {*** Traiter les entrées de EDIT1
- Le programme traite le caractère ascii et le transforme en index du tableau
- POLICE (facile, si on crée la police dans l'ordre des codes ascii !!!
- Pour eviter de s'ennuyer avec des minuscules, tout est passé en majuscule (UpCase)
- Le programme crée donc une image IMGS a partir de POLICE et la place au bon endroit.
- Si l'utilisateur fait delete, la dernière image créée et detruite (sauf si
- on est sur une nouvelle ligne)
- Si l'utilisateur fait entrée, Le programme met la coordonnée horizontale à 0
- et ajoute 16 à la coordonnée verticale
- C pas sorcier non ?
-
- Petite remarque : si vous comptez Afficher plus de 100 caractères agrandissez
- la taille du tableau IMGS
-
- ***}
-
-
- procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
- begin
-
- Key:=Upcase(key);
- if key=#8 then begin
- if xpos>=16 then begin
- xpos:=xpos-16;
- dec(ind);
- img[ind].destroy;
- end;
- end
- else if key=#13 then begin
- xpos:=0;
- ypos:=ypos+16;
- Form1.Edit1.text:='';
- Key:=#0;
- end
- else if (ord(key)>92) or (ord(key)<32) then key:=#0
- else begin
- {*** POUR EVITER UN DEBORDEMENT DU TABLEAU "IMGS" IL FAUT
- PLACER ICI UNE LIGNE DU STYLE
- If Ind => TAILLE_TABLEAU THEN EXIT;
- OU TAILLE_TABLEAU est la taille maximale du tableau IMGS ***}
-
- IMg[ind]:=Timage.create(form1);
- Img[ind].Parent:=Form1;
- Img[ind].Width:=16;
- Img[ind].Height:=16;
- Img[ind].left:=xpos;
- Img[ind].top:=ypos;
- Img[ind].canvas.copyrect(rect(0,0,16,16),Police[ord(key)].canvas,rect(0,0,16,16));
- xpos:=xpos+16;
- Img[ind].Visible:=True;
- inc(Ind);
- end;
-
- end;
-
- {*** C'est ici qu'on execute le remplissage de la feuille par la texture "T" ***}
- procedure TForm1.FormPaint(Sender: TObject);
- begin
- Remplir;
- end;
-
- {***
- J'ai aussi une procédure pour creer un mot sans forcément créer une image par lettre
-
- Variables :
- S est la chaine de caractères
- MON_IMAGE est le TPIcture réceptacle pour mon mot ou ma phrase
- MA_POLICE est mon TBitmap de caractères
- HAUTEUR_POLICE est la taille de mes caractères (donc MA_POLICE.Height = HAUTEUR_POLICE et MA_POLICE.Width = HAUTEUR_POLICE * 61)
- CANVAS_VIDE est un TBitmap de HAUTEUR_POLICE * HAUTEUR_POLICE contenant la couleur du fond (une sorte d'espace quoi) pour
- eviter d'afficher un carré noir
-
- Sans_Accent est une procédure qui me vire les accents d'une phrase
- é = e
- è = e
- ê = e
- ù = u
- ...
- et je met bien entendu ma chaine en majuscule
-
- Procedure Creer_Canvas(S : String);
- Var
- N,
- I : Integer;
- T : String;
- Begin
- With MON_IMAGE Do
- Begin
- Height := HAUTEUR_POLICE;
- For N := 0 To Width Do
- If (N mod HAUTEUR_POLICE) = 0
- Then Canvas.CopyRect(Rect(N-HAUTEUR_POLICE,HAUTEUR_POLICE+1,N,-1),
- CANVAS_VIDE.Bitmap.Canvas,
- Rect(1,HAUTEUR_POLICE+1,HAUTEUR_POLICE,0));
- S := UpperCase(Sans_Accent(S));
- For N := 1 To Length(S) Do Begin
- I := Ord(UpCase(S[N]))-32;
- If (I <= 61)
- Then Begin
- Canvas.CopyRect(rect(HAUTEUR_POLICE*(N-1),HAUTEUR_POLICE,HAUTEUR_POLICE*N,0),
- MA_POLICE.Canvas,
- Rect(I*HAUTEUR_POLICE,HAUTEUR_POLICE,(I+1)*HAUTEUR_POLICE,0));
- T := T + S[N];
- End
- Else Begin
- Canvas.CopyRect(rect(HAUTEUR_POLICE*(N-1),HAUTEUR_POLICE,HAUTEUR_POLICE*N,0),
- CANVAS_VIDE.Bitmap.Canvas,
- Rect(1,HAUTEUR_POLICE+1,HAUTEUR_POLICE,0));
- T := T + #32;
- End
- End;
- End;
- End;
-
-
- ***}
-
- End.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,jpeg, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Edit1: TEdit;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure FormPaint(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
base:Tbitmap;
Police:Array[32..92]of Tbitmap;
T: TPicture;
Xpos,ypos:integer;
ind:integer;
IMG:Array[0..100]of Timage;
Procedure Charger_Police(F : String);
implementation
{$R *.DFM}
{*** Bon, je vais faire un effort sur les commentaires cette fois ! ***}
{*** Cette procédure remplit (d'où son nom) la fenêtre avec
l'image chargée dans "T" (TPicture) et boucle sur les bords autant
de fois que nécessaire (étirez la feuille, vous verrez qu'elle est texturée
partout quelque soit sa taille) ***}
procedure remplir;
var
xp,
yp : integer;
begin
xp := 0;
yp := 0;
repeat
repeat
Form1.Canvas.draw( xp, yp, T.Graphic );
xp := xp + t.Width;
until xp > Form1.Width;
xp :=0 ;
yp := yp + t.Height;
until yp > Form1.height;
end;
{*** Dans le FormCreate :
On charge la texture de fond
On initialise le tableau qui contiendra la police
On charge la police par défaut si elle existe ***}
procedure TForm1.FormCreate(Sender: TObject);
var
n:byte;
begin
T := TPicture.Create;
If FileExists('FOND.BMP')
Then T.LoadFromFile('FOND.BMP')
Else Begin
ShowMessage('Impossible d''ouvrir le fichier FOND.BMP');
Application.Terminate;
End;;
Base:=Tbitmap.Create;
Base.height:=16;
Base.Width:=976; {*** 976 = 16 * 61 caractères ***}
For n:=32 to 92 do begin
Police[n]:=Tbitmap.Create;
Police[n].Height:=16;
Police[n].Width:=16;
end;
xpos:=0;
ypos:=0;
ind:=0;
{*** S'il le fichier POLICE.BMP n'existe pas il faudra le chercher à la main ***}
If FileExists('POLICE.BMP') Then Charger_Police('POLICE.BMP');
end;
{*** Chargement de la police, bien entendu le seul paramètre c'est le nom du
fichier.
Cette procédure "saucissone" l'image BASE en morceaux de 16*16 et les range
dans le tableau POLICE initialisé dans le FormCreate.
Si vous créez une police, faites gaffe que les caractères ne dépassent pas
16*16 ***}
Procedure Charger_Police(F : String);
var
n,v:byte;
t:string;
Begin
Base.LoadFromFile(F);
For v:=32 to 92 do
begin
n:=v-32;
Police[v].Canvas.copyrect(rect(0,0,16,16),base.Canvas,rect(n*16,0,(n+1)*16,16))
End;
n:=Length(F);
Repeat
v:=n;
dec(n);
until F[n]=#92;
t:=copy(F,v,(length(F)-3)-v);
Form1.caption:=T;
Form1.EDIT1.Enabled := True;
End;
{*** Charger une police grâce a un controle OpenDialog ***}
procedure TForm1.Button1Click(Sender: TObject);
begin
if Form1.OpenDialog1.execute then
If FileExists(OpenDialog1.Filename) Then Charger_Police(OpenDialog1.FileName);
If Edit1.Enabled Then Edit1.SetFocus;
end;
{*** Traiter les entrées de EDIT1
Le programme traite le caractère ascii et le transforme en index du tableau
POLICE (facile, si on crée la police dans l'ordre des codes ascii !!!
Pour eviter de s'ennuyer avec des minuscules, tout est passé en majuscule (UpCase)
Le programme crée donc une image IMGS a partir de POLICE et la place au bon endroit.
Si l'utilisateur fait delete, la dernière image créée et detruite (sauf si
on est sur une nouvelle ligne)
Si l'utilisateur fait entrée, Le programme met la coordonnée horizontale à 0
et ajoute 16 à la coordonnée verticale
C pas sorcier non ?
Petite remarque : si vous comptez Afficher plus de 100 caractères agrandissez
la taille du tableau IMGS
***}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
Key:=Upcase(key);
if key=#8 then begin
if xpos>=16 then begin
xpos:=xpos-16;
dec(ind);
img[ind].destroy;
end;
end
else if key=#13 then begin
xpos:=0;
ypos:=ypos+16;
Form1.Edit1.text:='';
Key:=#0;
end
else if (ord(key)>92) or (ord(key)<32) then key:=#0
else begin
{*** POUR EVITER UN DEBORDEMENT DU TABLEAU "IMGS" IL FAUT
PLACER ICI UNE LIGNE DU STYLE
If Ind => TAILLE_TABLEAU THEN EXIT;
OU TAILLE_TABLEAU est la taille maximale du tableau IMGS ***}
IMg[ind]:=Timage.create(form1);
Img[ind].Parent:=Form1;
Img[ind].Width:=16;
Img[ind].Height:=16;
Img[ind].left:=xpos;
Img[ind].top:=ypos;
Img[ind].canvas.copyrect(rect(0,0,16,16),Police[ord(key)].canvas,rect(0,0,16,16));
xpos:=xpos+16;
Img[ind].Visible:=True;
inc(Ind);
end;
end;
{*** C'est ici qu'on execute le remplissage de la feuille par la texture "T" ***}
procedure TForm1.FormPaint(Sender: TObject);
begin
Remplir;
end;
{***
J'ai aussi une procédure pour creer un mot sans forcément créer une image par lettre
Variables :
S est la chaine de caractères
MON_IMAGE est le TPIcture réceptacle pour mon mot ou ma phrase
MA_POLICE est mon TBitmap de caractères
HAUTEUR_POLICE est la taille de mes caractères (donc MA_POLICE.Height = HAUTEUR_POLICE et MA_POLICE.Width = HAUTEUR_POLICE * 61)
CANVAS_VIDE est un TBitmap de HAUTEUR_POLICE * HAUTEUR_POLICE contenant la couleur du fond (une sorte d'espace quoi) pour
eviter d'afficher un carré noir
Sans_Accent est une procédure qui me vire les accents d'une phrase
é = e
è = e
ê = e
ù = u
...
et je met bien entendu ma chaine en majuscule
Procedure Creer_Canvas(S : String);
Var
N,
I : Integer;
T : String;
Begin
With MON_IMAGE Do
Begin
Height := HAUTEUR_POLICE;
For N := 0 To Width Do
If (N mod HAUTEUR_POLICE) = 0
Then Canvas.CopyRect(Rect(N-HAUTEUR_POLICE,HAUTEUR_POLICE+1,N,-1),
CANVAS_VIDE.Bitmap.Canvas,
Rect(1,HAUTEUR_POLICE+1,HAUTEUR_POLICE,0));
S := UpperCase(Sans_Accent(S));
For N := 1 To Length(S) Do Begin
I := Ord(UpCase(S[N]))-32;
If (I <= 61)
Then Begin
Canvas.CopyRect(rect(HAUTEUR_POLICE*(N-1),HAUTEUR_POLICE,HAUTEUR_POLICE*N,0),
MA_POLICE.Canvas,
Rect(I*HAUTEUR_POLICE,HAUTEUR_POLICE,(I+1)*HAUTEUR_POLICE,0));
T := T + S[N];
End
Else Begin
Canvas.CopyRect(rect(HAUTEUR_POLICE*(N-1),HAUTEUR_POLICE,HAUTEUR_POLICE*N,0),
CANVAS_VIDE.Bitmap.Canvas,
Rect(1,HAUTEUR_POLICE+1,HAUTEUR_POLICE,0));
T := T + #32;
End
End;
End;
End;
***}
End.
Conclusion
Cette routine n'a pas d'autres prétentions que de servir d'exemple.
Si quelqu'un la trouve utile, tant mieux !!
Libre à vous de modifier, triturer, malmener le code.
Envoyez moi juste une petite bafouille que je sache où peut bien finir mon code.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
Comparez les prix

HTC Hero
Entre 550€ et 550€
|