zwyx
Messages postés146Date d'inscriptionjeudi 22 novembre 2007StatutMembreDernière intervention21 mars 2016
-
20 sept. 2010 à 17:03
zwyx
Messages postés146Date d'inscriptionjeudi 22 novembre 2007StatutMembreDernière intervention21 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, ...).
zwyx
Messages postés146Date d'inscriptionjeudi 22 novembre 2007StatutMembreDernière intervention21 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.
zwyx
Messages postés146Date d'inscriptionjeudi 22 novembre 2007StatutMembreDernière intervention21 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.