Dessiner composant check-box

zwyx Messages postés 146 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 mars 2016 - 20 sept. 2010 à 17:03
zwyx Messages postés 146 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 mars 2016 - 30 sept. 2010 à 17:26
Bonjour à tous,

Je cherche à créer un composant héritant de TCheckBox, proposant de changer la couleur de fond de la case à cocher, par une propriété. Il me faut donc juste revoir la méthode qui dessine le composant.

Toutes les check-box personnalisées que j'ai pu trouver dérivent de TGraphicControl, surchargeant alors la méthode Paint. Le composant TCheckBox, dérivant de TButtonControl, n'en dispose pas. Je n'ai donc pu que surcharger la méthode WndProc, qui traite les messages Windows, comme suit:
procedure TCheckBoxReadOnly.WndProc(var AMessage: TMessage);
begin
  inherited;
  // si le message concerne le dessin du composant
  if (AMessage.Msg = WM_PAINT) then
    // on le redessine
    DessinerCheckBox;
end;

Mais voilà, je ne trouve pas la méthode originale qui dessine ce composant, pour en changer juste la partie qui remplit la couleur de la case à cocher.

Ainsi, je vous demande de m'éclairer, parce que j'ai peur qu'en écrivant ma procédure DessinerCheckBox au petit bonheur la chance, j'en oublie plein de propriétés gérées par le composant check-box original (3D, alignement, bordure, ...).

Bien à vous,

3 réponses

Utilisateur anonyme
21 sept. 2010 à 09:55
Salut

Deux remarques:

1°D'après l'aide de Delphi

TCustomCheckBox.CreateWnd

Crée un contrôle Windows correspondant à la case à cocher.

procedure CreateWnd; override;

Description

La méthode CreateWndWidget appelle la méthode héritée, puis envoie un message BM_SETCHECK pour définir l'état du contrôle.


Ca me semble un peu plus sain que de surcharger la méthode WndProc

2)Personnellement je partirais non pas d'un TGraphicControl mais d'un TLabel qui admet un canvas .
0
zwyx Messages postés 146 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 mars 2016
21 sept. 2010 à 12:08
Merci pour ta réponse Francky,

Je suis obligé de conserver mon héritage initial de TCheckBox, car ça sinon, ça aurait trop de répercussions dans le code. En fait, je cherche à modifier le composant pour ne pas avoir à toucher à mon code, qui l'utilise abondamment.

Maintenant, je vais creuser un peu plus du côté de CreateWnd et de CreateWndWidget.
0
zwyx Messages postés 146 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 mars 2016
30 sept. 2010 à 17:26
En fait, je cherche simplement à ce que le fond de la case apparaisse grisée, lorsque la check-box est en lecture seule, mais le texte doit rester écrit en noir.

Mon problème est résolu dans le cas où la case est cochée, car il suffit d'attribuer: CheckBox1.State := cbGrayed; et de surcharger la procédure Toggle, par exemple de la manière suivante:
procedure TCheckBoxReadOnly.Toggle;
begin
  if not FReadOnly then
    inherited Toggle;
end;

Mais cela parait impossible d'afficher la case à cocher à la fois vide et grisée. En effet, affecter: CheckBox1.Enabled := False; grise également le texte de l'objet.

Me trompe-je ?
0
Rejoignez-nous