• nomen-nescio (28.04.11 17:35) [0]
    Доброго времени суток. Я создаю компонент, свой RadioButton, в котором можно было бы выбирать символ, используемый для флажка-метки вместо обычной стандартной точки. Подскажите пожалуйста возможные пути реализации такого компонента.
  • DimaBr © (29.04.11 01:07) [1]

    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;


  • nomen-nescio (29.04.11 02:04) [2]
    спасибо!
  • nomen-nescio (30.04.11 14:56) [3]
    Ещё один небольшой вопросик) Когда мы нажимаем на переключатели, как сделать так, чтобы они правильно отрисовывались, т.е. чтобы  всегда включенным оставался один. Переопределить метод Click как-то.. подскажите, если не трудно. Заранее спасибо)
  • DimaBr © (01.05.11 00:56) [4]
    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;

  • nomen-nescio (01.05.11 01:24) [5]
    Спасибо огромное, очень выручили, респект и уважуха!
Есть новые Нет новых   [119114   +111][b:0.048][p:0.026]