Redimensionnement des cellules
Remonter à Personnalisation d'une grille - Index
Remarque : Lorsqu'un utilisateur ou une application modifie la taille d'une fenêtre ou d'un contrôle, Windows envoie le message WM_SIZE à la fenêtre ou au contrôle concerné pour lui permettre d'ajuster les paramètres nécessaires afin de dessiner ultérieurement son image dans la nouvelle taille. Votre composant VCL peut répondre à ce message en modifiant la taille des cellules de façon à ce qu'elles s'inscrivent dans les limites du contrôle. Pour répondre au message WM_SIZE, vous devez ajouter au composant une méthode de gestion du message.
La création d'une méthode de gestion de message est décrite en détail dans la section Création de nouveaux gestionnaires de messages.
Dans notre exemple, le contrôle calendrier devant répondre au message WM_SIZE, vous devez ajouter une méthode protégée appelée WMSize au contrôle indexé sur le message WM_SIZE, puis écrire la méthode de calcul de la taille des cellules qui permettra à toutes d'être visibles :
type
TSampleCalendar = class(TCustomGrid)
protected
procedure WMSize(var Message: TWMSize); message WM_SIZE;
.
.
.
end;
.
.
.
procedure TSampleCalendar.WMSize(var Message: TWMSize);
var
GridLines: Integer; { variable locale temporaire }
begin
GridLines := 6 * GridLineWidth; { calculer la taille combinée de toutes les lignes }
DefaultColWidth := (Message.Width - GridLines) div 7; { définir la nouvelle largeur de cellule par défaut }
DefaultRowHeight := (Message.Height - GridLines) div 7; { ainsi que sa hauteur }
end;
// fichier en-tête
class PACKAGE TSampleCalendar : public TCustomGrid
{
.
.
.
protected:
void __fastcall WMSize(TWMSize &Message);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SIZE, TWMSize, WMSize)
END_MESSAGE_MAP(TCustomGrid)
};
// fichier d'implémentation
void __fastcall TSampleCalendar::WMSize(TWMSize &Message)
{
int GridLines; // variable locale temporaire
GridLines = 6 * GridLineWidth; // calcul de la taille combinée de toutes les lignes
DefaultColWidth = (Message.Width - GridLines) / 7; // nouvelle largeur de cellule par défaut
DefaultRowHeight = (Message.Height - GridLines) / 7; // et nouvelle hauteur de cellule par défaut
}
Maintenant lorsque le calendrier est redimensionné, il affiche toutes les cellules dans la taille maximum avec laquelle ils peuvent rentrer dans le contrôle.
Dans ce cas, le contrôle calendrier doit redéfinir BoundsChanged afin qu'elle calcule la taille de cellule adéquate pour que toutes les cellules soient visibles avec la nouvelle taille :
type
TSampleCalendar = class(TCustomGrid)
protected
procedure BoundsChanged; override;
.
.
.
end;
.
.
.
procedure TSampleCalendar.BoundsChanged;
var
GridLines: Integer; { variable locale temporaire }
begin
GridLines := 6 * GridLineWidth; { calculer la taille combinée de toutes les lignes }
DefaultColWidth := (Width - GridLines) div 7; { définir la nouvelle largeur de cellule par défaut }
DefaultRowHeight := (Height - GridLines) div 7; { ainsi que sa hauteur }
inherited; {appeler maintenant la méthode dérivée }
end;
// fichier en-tête
class PACKAGE TSampleCalendar : public TCustomGrid
{
.
.
.
protected:
void __fastcall BoundsChanged(void);
};
// fichier d'implémentation
void __fastcall TSampleCalendar::BoundsChanged(void)
{
int GridLines; // variable locale temporaire
GridLines = 6 * GridLineWidth; // calcul de la taille combinée de toutes les lignes
DefaultColWidth = (Width - GridLines) / 7; // nouvelle largeur de cellule par défaut
DefaultRowHeight = (Height - GridLines) / 7; // nouvelle hauteur de cellule par défaut
TCustomGrid::BoundsChanged(); // appelle la méthode héritée
}