Haz published la propiedad AllowGrayed (igual que Checked) y en el wm_paint ten en cuenta que puede tener 3 valores.
Código Delphi
[-]
if Checked = cbGrayed then begin
pues eso, como quieras pintarlo
end
else Checked= cbChecked then
begin
Canvas.Font.Style := [fsBold];
Canvas.Font.Name := 'Tahoma';
Canvas.Font.Color := FBoxCheckShadow; Canvas.TextOut(7,3, 'x');
Canvas.Font.Color := FBoxCheckColor; Canvas.TextOut(6,2, 'x');
end;
El truco parece estar al tiempo de "crear" El tcheckbox:
Código Delphi
[-]
procedure TCustomCheckBox.CreateWnd;
begin
inherited CreateWnd;
SendMessage(Handle, BM_SETCHECK, Integer(FState), 0);
end;
Fstate puede tener los valores TCheckBoxState = (cbUnchecked, cbChecked, cbGrayed);
cuando dice Integer(Fstate), está cogiendo el primer valor que es cero, es decir, cbUnchecked.
En el procedimiento Toggle, es donde se usa AllowGrayed:
Código Delphi
[-]
procedure TCustomCheckBox.Toggle;
begin
case State of
cbUnchecked:
if AllowGrayed then State := cbGrayed else State := cbChecked;
cbChecked: State := cbUnchecked;
cbGrayed: State := cbChecked;
end;
end;
Si está Unchecked y permite tener 3 estados, se pone a cbGrayed.
Saludos