Intercepter un Message Windows ? Créer un Composant Grille !
Voila j'ai un gros probléme, et même l'aide de Delphi ne m'a pas donnée la réponse, enfin si, mais ça marche pas ! Alors s'il vous plait Aidez-Moi. :cry:
Un petit résumé de ce que je voudrais faire :
En faite je suis débutant sur Delphi depuis 1 mois a peu prés, et je suis aussi débutant sur ce forum, enfin le probléme n'est pas là. Mon probléme est que je suis en train d'éssayer de créer mon premier composant, et j'y arrive, mais c'est laborieux.
Le gros probléme est que j'ai besoin d'éxécuter un redimensionnement de mon composant, et pour cela je voulais intercepter un message Windows nommé WM_Size, pour savoir quand est-ce que peut redimensionner mon composant. Cela m'a été conseiller de la par de l'aide de Delphi 7, mais malheureusement ceci ne fonctionne pas.
Je dérive du composant TImage, et quand je redimenssionne mon composant sur une TForm celui-ci ce redimensionne mais pas le Canvas et cela est trés gênant, bien entendus le redimensionnement se fait a la conception, et non a l'éxécution.
Alors pour vous éclairer je vous laisse tout le code source, qui je doit dire n'est pas énorme.
Donc pour commencer voici les unités que j'utilise, Etant donnée qu'il ne les mets pas automatiquement, je les rajoute moi-même, alors j'espére que j'en est pas oublié :
Code:
1 2
| uses
SysUtils, Classes, Controls, ExtCtrls, Windows, Messages, Forms, Graphics; |
Ensuite vient mes déclaration de Type :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| type
TGrid = class(TImage)
private
FFactor:Integer;
FShowGrid:Boolean;
protected
procedure WMSize(var Message:TWMSize); message WM_Size;
public
constructor Create(AOwner:TComponent);override;
procedure TraceGrid;
published
property Factor:Integer read FFactor write FFactor;
property ShowGrid:Boolean read FShowGrid write FShowGrid;
property Width default 350;
property Height default 200;
end; |
Ici je vous passe les détailles de la procédure Register, pour vous montrer la redéfinition du Constructeur Hérité, avec un appel a la procédure TraceGrid :
Code:
1 2 3 4 5 6 7 8
| constructor TGrid.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
Factor:=10;
Width:=350;
Height:=200;
TraceGrid;
end; |
Ici je m'était dit que ce n'était pas nécéssaire de vous montrer la façon dont je trace la grille, et puis finalement vaut mieux avoir toutes les clé en main, Non ! Alors voici la procédure TraceGrid, et si il y a plus simple dit le moi ! :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| procedure TGrid.TraceGrid;//Traçage de la grille
var
DX, AX, DY, AY, i, j, L, H:Integer;
begin
L:=Width; H:=Height;
L:=Round(L/10); H:=Round(H/10); //la hauteur et largeur est divisé par le pas de la grille
DX:=0; DY:=0; AX:=1; AY:=1;
for j:=0 to H do //Boucle de pointillement sur la hauteur
begin
DX:=0; AX:=1; //Réinitialisation des valeurs au début de la largeur
for i:=0 to L do //Boucle de pointillement sur la largeur
begin
Canvas.MoveTo(DX,DY);
Canvas.LineTo(AX,AY);
if DX<9 then
begin
DX:=9;
AX:=10;
end
else
begin
inc(DX,10);
inc(AX,10);
end;
end; //Fin de Boucle de pointillement sur la largeur
if DY<9 then
begin
DY:=9;
AY:=10;
end
else
begin
inc(DY,10);
inc(AY,10);
end;
end; //Fin de Boucle de pointillement sur la hauteur
end; |
Et maintenant voici le petit bout de code qui me pose probléme, ici je ne fais que remplacer les anciennes valeur de Width et Height, en ré-appelant la procédure TraceGrid a la fin de la procédure, et ça fonctionne pas, alors soit c'est mon message qui déconne, ou c'est la procédure qui n'est pas appelé :
Code:
1 2 3 4 5 6
| procedure TGrid.WMSize(var Message:TWMSize);
begin
Width:=Message.Width;
Height:=Message.Height;
TraceGrid;
end; |
Note : La procédure Register est juste en dessous de l'implementation, et toutes les procédure suives aprés, je ne pense pas que cela est de l'importance, mais je vous le dit quand même.
Voila comme vous pouvez le voir ce composant est loin d'être compliquer,
sachant qu'il n'est pas finis, alors Merci a vous !