Unit Unit1;
//
// Sujet : Modification du Caret
//
// Par Nono40 : http://nono40.developpez.com http://nono40.fr.st
// mailTo:nono40@fr.st
//
// Le 17/05/2003
//
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
Const
// Message personnalisé pour la mise à jour du carret
CAR_MESSAGE = WM_USER+1;
// Consante de définition des types de Caret possibles
CAR_CARETNOIR = 1;
CAR_CARETGRIS = 2;
CAR_CARETBITMAP = 3;
Type
TForm1 = Class(TForm)
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit2: TEdit;
Edit3: TEdit;
Image1: TImage;
Label4: TLabel;
Image2: TImage;
Label5: TLabel;
Procedure CarMessage(Var Msg: TMessage); message CAR_MESSAGE;
Procedure Edit1Enter(Sender: TObject);
Procedure Edit2Enter(Sender: TObject);
Procedure Edit3Enter(Sender: TObject);
Procedure Edit1Exit(Sender: TObject);
Procedure FormCreate(Sender: TObject);
Private
{ Déclarations privées }
Public
{ Déclarations publiques }
End;
Var
Form1: TForm1;
Implementation
{$R *.dfm}
// Le problème est que dans OnEnter on ne peut pas définir le Caret car
// le focus n'est pas encore sur le composant. Pour éviter d'avoir à dériver
// un composant du TEdit afin de détourner le message WM_SETFOCUS, on place
// un message personnalisé dans la file d'attente des message. Le message
// sera alors exécuté après les autres, donc à un moment ou le contrôle aura
// le focus.
Procedure TForm1.Edit1Enter(Sender: TObject);
Begin
// Demande d'un Caret Noir
PostMessage(Handle,CAR_MESSAGE,TWinControl(Sender).Handle,CAR_CARETNOIR);
End;
Procedure TForm1.Edit2Enter(Sender: TObject);
Begin
// Demande d'un Caret Gris
PostMessage(Handle,CAR_MESSAGE,TWinControl(Sender).Handle,CAR_CARETGRIS);
End;
Procedure TForm1.Edit3Enter(Sender: TObject);
Begin
// Demande d'un Caret défini à partir d'un bitmap
PostMessage(Handle,CAR_MESSAGE,TWinControl(Sender).Handle,CAR_CARETBITMAP);
End;
// A la sortie du contrôle, le caret doit être détruit.
Procedure TForm1.Edit1Exit(Sender: TObject);
Begin
DestroyCaret;
End;
// Procédure de réponse aux messages personnalisés
Procedure TForm1.CarMessage(Var Msg: TMessage);
Begin
Case Msg.LParam Of
// Création d'un caret noir de 10x20
CAR_CARETNOIR : CreateCaret(Msg.WParam,0,10,20);
// Création d'un caret gris de 10x20
CAR_CARETGRIS : CreateCaret(Msg.WParam,1,10,20);
// Création d'un caret basé sur un bitmap
// ( ici le bitmap est le contenu de Image2 )
CAR_CARETBITMAP : CreateCaret(Msg.WParam,Image2.Picture.Bitmap.Handle,0,0);
End;
// affichage du message ainsi créé.
ShowCaret(Msg.WParam);
End;
Procedure TForm1.FormCreate(Sender: TObject);
Var i,j:Integer;
Begin
// Petite boucle pour inverser l'image contenue dans Image1
// en effet Windows utilise un crayon XOR pour le dessin.
// le fait d'inverser la couleur avant, permet d'obtenir un caret
// de la même couleur que l'image sur un fond blanc.
Image2.Picture.Assign(Image1.Picture);
For i:=0 To Image2.Width-1 Do
For j:=0 To Image2.Height-1 Do
Image2.Canvas.Pixels[i,j]:=Image2.Canvas.Pixels[i,j]Xor $FFFFFF;
End;
end.
|