SALUDOS
resulta ser que desde hace algun tiempo estoy programando componentes basandome en los estandars para aplicarles una especie de skin, la cual es simple practicamente, consiste en pintar mi propio estilo usando el canvas de los mismos, hace ya unos dias se me presentaron dudas para conformar mi nuevo TButton y las hice publicas aqui en los foros, el problema con el TButton ya fue resuelto, pero ahora se me presenta un problema similar con el TCheckbox, sucede que cuando doy click o presiono barra espaciadora sobre el nuevo componente con "skin" para cambiar su estado de chequeo se pinta como es normalmente y luego se efectuan los cambios sobre el canvas del mismo para "skinearlo" a mi manera, esto provoca un efecto algo desagradable como si fuera un parpadeo, quisiera que alguien me ayude a solucionar esto porque hasta el momento no hallo solucion alguna, posteriormente muestro la implementación de lo que he hecho hasta ahora, ojalá me puedan ayudar:
Código Delphi
[-]
type
TXCheckBox = class (TCheckBox)
private
protected
procedure CMDrawItem(var Message: TWMDrawItem); message WM_PAINT;
procedure SetChecked(Value: Boolean); override;
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
procedure Click; override;
procedure Toggle; override;
procedure CreateParams(var Param: TCreateParams); override;
public
constructor Create(aOwner: TComponent); override;
end;
implementation
constructor TXCheckBox.Create(aOwner: TComponent);
begin
inherited;
end;
procedure TXCheckBox.CreateParams(var Param: TCreateParams);
begin
inherited;
Param.Style := Param.Style or BS_OWNERDRAW;
end;
procedure TXCheckBox.Toggle;
begin
inherited;
invalidate;
end;
procedure TXCheckBox.Click;
begin
inherited;
invalidate;
end;
procedure TXCheckBox.CNCommand(var Message: TWMCommand);
begin
inherited;
invalidate;
end;
procedure TXCheckBox.SetChecked(Value: Boolean);
begin
inherited;
Invalidate;
end;
procedure TXCheckBox.CMDrawItem(var Message: TWMDrawItem);
var
DC: TCanvas;
a: TPaintStruct;
begin
BeginPaint(Handle, a);
DC := TCanvas.Create;
DC.Handle := GetDc(Handle);
DC.Brush.Style := bsSolid;
DC.Brush.Color := clGray;
DC.RoundRect(2,2,13,13, 3,3);
DC.Brush.Style := bsClear;
if Checked then
DC.TextOut(5,0, 'x');
EndPaint(Handle, a);
end;
end.
bueno, a esto le falta un mundo aún, solo quiero solucionar el problema del parpadeo por el momento.
mil gracias de antemano colegas
saludos!!
aeff!!