|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : Changer la forme de l'animation matrix [ Archives / J'AI BESOIN D'AIDE !!!! :O ] (Also know as)
Informations & options pour cette discussion
|
dimanche 15 février 2004 à 14:41:51 |
Changer la forme de l'animation matrix

Also know as
|
Bonjour, Voici une méthode permettant de créer une animation à la matrix sans sa police. Il suffit juste d'appeler sa Form MainForm, mettre un memo et c'est tout. Le memo doit avoir ces propriétés : object Memo1: TMemo Left = 179 Top = 95 Width = 329 Height = 235 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'MS Sans Serif' Font.Style = [] ParentFont = False ReadOnly = True TabOrder = 0 end
|
En lancant l'application, vous verrez une animation matrix qui prend toute la fenêtre avec un memo elliptique à un endroit bien précis. Le memo est là pour vous donner un gout de ce que je souhaiterais. Je voudrais tout simplement que l'animation matrix est les mêmes propriétés que le mémo (taille, ellipticité.), pas qu'elle prenne toute la fenêtre. Est-ce que quelqu'un pourrait m'aider sur ce sujet là ? Voici le code source en entier : unit MainFrm;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type { Ce record va nous permettre de stocker un caractère à l'écran ainsi que sa couleur à un instant donné. Il aurait été possible de ne pas stocker la couleur, mais c'est plus simple ainsi. } TCharInfo = record Character: AnsiChar; Color: TColor; end;
{ Une colonne est représentée par un tableau de n caractères } TColumn = array of TCharInfo; { Une ligne est un tableau de colonnes } TRows = array of TColumn; { La position du caractère blanc de chaque colonne à un instant donné } TBrightChars = array of Integer;
TMainForm = class(TForm) Memo1: TMemo; procedure FormResize(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Déclarations privées } FChars: TRows; // La matrice! FBrightChars: TBrightChars; // Les caractères blancs FCharWidth: Integer; // La largeur approximative d'un caractère FCharHeight: Integer; // La hauteur approximative d'un caractère FCharsPerColumn: Integer; // Le nombre de caractères par colonne (hauteur) FCharsPerRow: Integer; // Le nombre de caractères par ligne (largeur) FBuffer: TBitmap; // Le buffer 'off screen'
procedure ResizeAll; procedure DrawBackground; procedure ChooseVisibleChars; procedure MoveChars; procedure Draw(const Surface: TCanvas); function Fade(const AColor: TColor; ADistance: Integer): TColor;
procedure Idle(Sender: TObject; var Done: Boolean); public { Déclarations publiques } constructor Create(AOwner: TComponent); override; destructor Destroy; override; end;
const { Quelques constantes pratiques } BrightColor = $0000FF00; // Couleur verte max MinFrameLength = 50; // Durée minimale d'une frame en ms WhiteColor = clWhite; // Couleur blanche (apparition du caractère)
var MainForm: TMainForm;
implementation uses Math { Utile pour les fonctions Min et Max };
{$R *.DFM}
{ TMainForm }
procedure TMainForm.ChooseVisibleChars; { Procédure déterminant la position du caractère blanc de chaque colonne au départ (initialisation) de façon aléatoire } var i: Integer; begin for i:=0 to FCharsPerRow - 1 do FBrightChars[i]:= Random(FCharsPerColumn); end;
constructor TMainForm.Create(AOwner: TComponent); { Premières initialisation dans le constructeur de la fenêtre } begin inherited;
{ Création du buffer dans lequel on va dessiner } FBuffer:= TBitmap.Create; FBuffer.Canvas.Brush.Style:= bsClear; // Pas de fond lors de l'écriture
{ Les propriétés de la fonte utilisée saont récupérées de la fenêtre pour être facilement modifiables. Pour bien faire, il nous faudrait une police japonaise, mais où la trouver? } FBuffer.Canvas.Font.Size:= Font.Size; FBuffer.Canvas.Font.Name:= Font.Name;
{ Calcul des largeur et hauteur approximatives des caractères } FCharWidth:= FBuffer.Canvas.TextWidth('m'); {m à la place de W} FCharHeight:= FBuffer.Canvas.TextHeight('m'); {sinon pas de scroll}
{ Initialisation du générateur aléatoire } Randomize;
{ Il n'est pas nécessaire d'appeler la méthode ici car elle est déclenchée par l'évènement OnResize de la fenêtre } // ResizeAll;
{ On branche notre méthode de traitement sur l'évènement OnIdle de l'application } Application.OnIdle:= Idle; end;
destructor TMainForm.Destroy; begin { Libération du buffer } FreeAndNil(FBuffer); inherited; end;
procedure TMainForm.Draw(const Surface: TCanvas); { La routine de tracé elle-même. Celle-ci est très simple, elle se contente de parcourir la matrice et d'écrire chaque caractère dans le buffer. Celui-ci est ensuite copié dans le canevas de la fenêtre. } var i, j: Integer; // Indices de boucles c: Char; // Le caractère à écrire CurrentWidth, CurrentHeight: Integer; // Largeur et hauteur du caractère deltaX, deltaY: Integer; // Décalages x, y: Integer; // Coordonnées écran du caractère à écrire begin for i:= 0 to FCharsPerRow - 1 do for j:=0 to FCharsPerColumn - 1 do begin c:= FChars[i][j].Character; // On récupère le caractère à écrire currentWidth:= FBuffer.Canvas.TextWidth(c); // On calcule sa largeur currentHeight:= FBuffer.Canvas.TextHeight(c); // et sa hauteur deltaX:= FCharWidth - currentWidth div 2; // Les décalages permettent de bien deltaY:= FCharHeight - currentHeight div 2; // centrer le caractère x:= i * FCharWidth + deltaX; // Calcul des coordonées du caractère y:= j * FCharHeight + deltaY; // à l'écran FBuffer.Canvas.Font.Color:= FChars[i][j].Color; // On récupère sa couleur FBuffer.Canvas.TextOut(x, y, c); // Et on l'écrit dans le buffer end;
{ La fonction BitBlt permet de copier rapidement le buffer dans la fenêtre } BitBlt(Surface.Handle, 0, 0, FBuffer.Width, FBuffer.Height, FBuffer.Canvas.Handle, 0, 0, SRCCOPY); end;
procedure TMainForm.DrawBackground; { Cette méthode se contente de remplir le buffer en noir } begin BitBlt(FBuffer.Canvas.Handle, 0, 0, FBuffer.Width, FBuffer.Height, 0, 0, 0, BLACKNESS); end;
function TMainForm.Fade(const AColor: TColor; ADistance: Integer): TColor; { La méthode Fade calcule la couleur d'un cara ctère par rapport à sa distance avec le caractère brillant. }
function FadeComposite(const Level: Byte): Byte; { On diminue la luminosité d'une composante à la fois } begin { La méthode de calcul est calibrée au pif. On peut s'essayer à diverses techniques ici } result:= Max(Level - 10 * ADistance, 0); end;
begin { Si distance = 0 c'est que nous sommes sur le caractère brillant } if ADistance = 0 then result:= clWhite else begin { Pour éviter que la ligne entière ne disparaisse quand le caractère brillant arrive en bas de l'écran } if ADistance < 0 then ADistance:= FCharsPerColumn + ADistance;
{ Appel de FadeComposite pour chaque composante de la couleur } result:= RGB(FadeComposite(GetRValue(AColor)), FadeComposite(GetGValue(AColor)), FadeComposite(GetBValue(AColor))); end; end;
procedure TMainForm.Idle(Sender: TObject; var Done: Boolean); { Notre méthode principale. Celle-ci est déclenchée en permanence. } var t, frameLength: DWORD; begin { Mettre Done à false permet que la méthode soit appelée tout le temps. Sinon, elle n'est déclenchée que lorsque l'application n'a plus rien à faire. Dans notre cas, elle va avoir du travail! } Done:= false;
t:= GetTickCount; // On récupère un top temporel MoveChars; // On calcule les couleurs de chaque caractère Draw(self.Canvas); // On dessine la matrice
frameLength:= GetTickCount - t; // On calcule le temps qui s'est écoulé if frameLength < MinFrameLength then // S'il est inférieur au minimum choisi, Sleep(MinFrameLength - frameLength); // on attend le reste de la durée end;
procedure TMainForm.MoveChars; { Calcul des couleurs pour chaque caractère } var i, j: Integer; begin for i:= 0 to FCharsPerRow - 1 do begin { L'utilisation de mod nous permet de boucler sur la colonne } FBrightChars[i]:= (FBrightChars[i] + 1) mod FCharsPerColumn; for j:=0 to FCharsPerColumn - 1 do FChars[i][j].Color:= Fade(BrightColor, FBrightChars[i] - j); end; end;
procedure TMainForm.ResizeAll; { Cette méthode redimensionne le buffer et les tableaux en fonction de la taille de la fenêtre. } var i, j: Integer; begin { Taille de la zone cliente de la fenêtre } FBuffer.Width:= ClientWidth; FBuffer.height:= ClientHeight;
{ On peint le buffer en noir } DrawBackground;
{ On calcule les dimensions de la matrice } FCharsPerColumn:= ClientHeight div FCharHeight; FCharsPerRow:= ClientWidth div FCharWidth;
{ On dimensionne les tableaux en fonction } SetLength(FChars, FCharsPerRow); SetLength(FBrightChars, FCharsPerRow); for i:=0 to High(FChars) do begin SetLength(FChars[i], FCharsPerColumn); { On profite de la boucle pour initialiser les caractères } for j:=0 to High(FChars[i]) do begin FChars[i][j].Character:= Chr(Random(127-48) + 18); {127 à la place de 255 pour s'adapter à la police} FChars[i][j].Color:= clBlack; {un peu plus de vitesse aussi} end; end;
{ Choix de la position de chaque caractère brillant } ChooseVisibleChars; end;
procedure TMainForm.FormResize(Sender: TObject); begin ResizeAll; end;
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char); begin Close; end;
procedure TMainForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Close; end;
procedure TMainForm.FormCreate(Sender: TObject); var rgn : hrgn; begin {Changement de forme du Memo en cercle} with MainForm.Memo1 do begin rgn:=CreateEllipticRgn(0,0,width,height); SetWindowRgn(handle, rgn, true); end; end;
end.
|
|
|
|
Cette discussion est classé dans : end, caractère, procedure, begin, fbuffer
Répondre à ce message
Sujets en rapport avec ce message
Hints dans une DLL [ par almi ]
J'ai une fenêtre (TForm) qui fonctionne parfaitement dans mon executable.Si je la place dans une DLL, j'obtiens le message :Ne peut assigner TFont à T
Problème Econversion Error lors de l'affichage d'une info bulle dans une fenetre MDIChild dans une DLL [ par DarkSky ]
Salut a tous,j'ai créer un projet MDI avec Delphi 6 donc les fenetre MDi Filles sont dans une DLL.j'ai une erreur EConversionError a la place de l'aff
pb d'affichage d'un TChart [ par Pegase20 ]
bonjour, J'affiche une autre fiche qui contient un graphique (créé à l'aide d'un TChart) quand je clique sur un bouton.Mon pb c'est que le graph ne
MDI Filles dans une DLL [ par DarkSky ]
..::= DarkSky =::..Salut almi,j'ai exactement le même problème que toi (Hint) sur l'utilisation de MDI Filles dans une DL
Probleme lecture/ecriture dans fichier. [ par Cybric ]
Bonsoir.Je débute avec DELPHI, donc novice.Je recopie tel quel le code de lecture de fichier trouvé dans "tout en poche" et cela ne fonctionne pas. Le
projet de chat avec delphi 7 [ par dk ]
hello every body j'aimerais faire un chat mais voila le probleme (si on peut dire) c ke g delphi 7 avec comme composant installer Tcpserver et Tcpclie
plein derreur a la fermeture de mon prog qui font lanter windows [ par dk ]
voila javais deja eu qq petits soucis avec le prjet de chat que je suis en train de realiser mais jamais a cette ampleur lol, qd je lance mon prog ca
Aide pour appelé des procédures [ par prevok ]
Lorsque je démarre le programme, pas de problème, je peux aller choisir dans le menu l'option que je veux, qui appelle une procedure, mais quand de ce
Reutiliser une procedure [ par jimmy69 ]
Bonjour a tous,Voila je debute avec delphi et je suis un peu fade :-) !!!!J'aimerais savoir s'il etait possible de reutiliser une procedure recement d
Creation d'un chat [ par kitana ]
bonjour, je fais un chat pour mon exam de lundi :s à partir d'un exemple d'un livre de delphi et je n'arrive pas à faire la partie deconnexion : je
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
|