-
Доброго времени суток. Я создаю компонент, свой RadioButton, в котором можно было бы выбирать символ, используемый для флажка-метки вместо обычной стандартной точки. Подскажите пожалуйста возможные пути реализации такого компонента.
-
TMyRadioButton = class(StdCtrls.TRadioButton)
private
FControlCanvas: TControlCanvas;
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
public
constructor Create(AOwner: TComponent);override;
procedure CreateParams(var Params: TCreateParams); override;
end;
constructor TMyRadioButton.Create(AOwner: TComponent);
begin
inherited;
FControlCanvas := TControlCanvas.Create; FControlCanvas.Control := Self;
end;
procedure TMyRadioButton.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do Style := Style and not BS_RADIOBUTTON or BS_OWNERDRAW;
end;
procedure TMyRadioButton.CNDrawItem(var Message: TWMDrawItem);
begin FControlCanvas.Ellipse(ClientRect);
end;
-
спасибо!
-
Ещё один небольшой вопросик) Когда мы нажимаем на переключатели, как сделать так, чтобы они правильно отрисовывались, т.е. чтобы всегда включенным оставался один. Переопределить метод Click как-то.. подскажите, если не трудно. Заранее спасибо)
-
TMyRadioButton = class(StdCtrls.TRadioButton)
private
FControlCanvas: TControlCanvas;
procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
protected
procedure SetChecked(Value: Boolean); override;
public
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;
procedure CreateParams(var Params: TCreateParams); override;
end;
constructor TMyRadioButton.Create(AOwner: TComponent);
begin
inherited;
FControlCanvas := TControlCanvas.Create;
FControlCanvas.Control := Self;
end;
procedure TMyRadioButton.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
Style := Style and not BS_RADIOBUTTON or BS_OWNERDRAW;
end;
procedure TMyRadioButton.CNDrawItem(var Message: TWMDrawItem);
var R: TRect;
begin
R := ClientRect;
R.Right := R.Bottom;
FControlCanvas.Brush.Color := clWhite;
FControlCanvas.Ellipse(R);
InflateRect(R,-3,-3);
FControlCanvas.Brush.Color := clRed;
if Checked then FControlCanvas.Ellipse(R);
FControlCanvas.Brush.Style := bsClear;
with ClientRect do FControlCanvas.TextRect(Rect(Bottom,Top,Right,Bottom),Bottom,0,Caption);
end;
procedure TMyRadioButton.SetChecked(Value: Boolean);
begin
inherited;
Invalidate;
end;
destructor TMyRadioButton.Destroy;
begin
FControlCanvas.Free;
inherited;
end;
-
Спасибо огромное, очень выручили, респект и уважуха!
|