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
[TECHDAYS2012] OUI J'Y SERAI![TECHDAYS2012] OUI J'Y SERAI! par JeremyJeanson
Bonsoir, Certes, je l'annonce avec un peu de retard, mais je serai effectivement au Techdays demain. Comme l'an dernier, je participerai au programme ATE (Ask The Expert). Si vous avez des questions Workflow, WCF, AppFabric ou plus généralement .net, n'hé...
Cliquez pour lire la suite de l'article par JeremyJeanson TFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICESTFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICES par vfabing
Afin de s'assurer du bon fonctionnement des différentes synchronisations effectuées par les TFS Integration Tools, 2 rapports sont présents dès l'installation. Il suffit alors d'effectuer les manipulations suivantes pour pouvoir les visualiser : Loca...
Cliquez pour lire la suite de l'article par vfabing CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|