Delphi nous met à disposition des types d'enregistrements permettant de récupérer directement les paramètres des messages (sans passer par des transtypages).
Ces types sont déclarés dans l'unité message.pas (Si vous le possédez, allez voir le source de message.pas )
Par exemple, le type TWMMouse permettra de récupérer la position de la souris en x (XPos) et en y (YPos) lors de la réception du message WM_LBUTTONDOWN
TWMMouse = record
Msg: Cardinal;
Keys: Longint;
case Integer of
0: (
XPos: Smallint;
YPos: Smallint);
1: (
Pos: TSmallPoint;
Result: Longint);
end;
Comment utiliser ces types ?
Exemple : on cherche à limiter la dimension mini et maxi de la fenêtre de notre application lorsque l'utilisateur la redimensionne. On sait (ou je vous apprends) que dans un tel cas, des messages WM_GETMINMAXINFO sont émis. En faisant une recherche (par exemple sur les caractères GETMINMAXINFO) dans le source message.pas (oui je sais, tout le monde ne l'a pas) On trouve le type TWMGetMinMaxInfo
TWMGetMinMaxInfo = record Msg: Cardinal; Unused: Integer; MinMaxInfo: PMinMaxInfo; // MinMaxInfo va nous permettre de limiter les dimensions de la fenêtre Result: Longint; end;
et en faisant une recherche dans le source de l'unité windows.pas, on trouve la déclaration de PMinMaxInfo
// Struct pointed to by WM_GETMINMAXINFO lParam PMinMaxInfo = ^TMinMaxInfo;// pointeur sur le type TMinMaxInfo TMinMaxInfo = packed record ptReserved: TPoint; ptMaxSize: TPoint; ptMaxPosition: TPoint; ptMinTrackSize: TPoint; // largeur et hauteur mini de la fenêtre ptMaxTrackSize: TPoint; // largeur et hauteur maxi de la fenêtre end;
rapel : de la déclaration de TPoint:
type TPoint = record X: Longint; // largeur Y: Longint; // hauteur end;
Ouvrez un nouveau projet et ajoutez y un TCheckBox
Ajoutons dans la partie private de la déclaration du type TForm1 :
private procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO; // le nom de la procédure est à notre libre choixCela signifie à Delphi que lorsqu'un message WM_GETMINMAXINFO sera émis vers notre Form1, la procédure WMGetMinMaxInfo sera déclenchée.
Implémentons notre procédure WMGetMinMaxInfo
procedure TForm1.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); begin inherited; // Traitement habituel du message WM_GETMINMAXINFO if CheckBox1.Checked then // Si limitation de taille demandée with Msg.MinMaxInfo^ do // avec la variable pointée par le pointeur Msg.MinMaxInfo (variable de type TMinMaxInfo) begin ptMinTrackSize.x:= 250; // largeur mini 250 pixels // équivalent à Msg.MinMaxInfo^.ptMinTrackSize.x:= 250 ptMinTrackSize.y:= 150; // hauteur mini 150 pixels ptMaxTrackSize.x:= 400; // largeur maxi 400 pixels ptMaxTrackSize.y:= 400; // hauteur maxi 300 pixels end; end;
Testez votre programme ..