从TButton继承一个新类,添加一个属性Canvas.在TButton.Create,里面创建TCanvas对象

解决方案 »

  1.   

    就是给没有Canvas的控件加上Canvas的属性。
    我看过一篇上面说在  published 加可是不管用。
      

  2.   

    我同意debussy(debussy)的
    你可以自制一个控件
    继承tbutton
      

  3.   

    to debussy(debussy)
    to zhptj(北狼) 
    我就是继承tbutton,可是要怎样写呀?
      

  4.   

    看我的:// 先放两个按钮unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        MyCanvas: TCanvas;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    begin
      MyCanvas.Handle := GetDC(Button1.Handle);
      MyCanvas.Ellipse(2, 2, 8, 8);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      MyCanvas := TCanvas.Create;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      MyCanvas.Free;
    end;end.////////////////////////////////////////思想就是取得 Button 的 HDC ,传给 MyCanvas ......
      

  5.   

    看我的:// 先放两个按钮unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        MyCanvas: TCanvas;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    begin
      MyCanvas.Handle := GetDC(Button1.Handle);
      MyCanvas.Ellipse(2, 2, 8, 8);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      MyCanvas := TCanvas.Create;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      MyCanvas.Free;
    end;end.////////////////////////////////////////思想就是取得 Button 的 HDC ,传给 MyCanvas ......
      

  6.   

    对原来没有Canvas的控件
    要在private段定义
        FCanvas: TCanvas;不是在published,published中是从父类继承的属性。
      

  7.   

    那么如何在 TButton 类中引入 Canvas 呢,看看 TCustomControl :TCustomControl = class(TWinControl)
      private
        FCanvas: TCanvas;
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
      protected
        procedure Paint; virtual;
        procedure PaintWindow(DC: HDC); override;
        property Canvas: TCanvas read FCanvas;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      end;{ TCustomControl }constructor TCustomControl.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FCanvas := TControlCanvas.Create;
      TControlCanvas(FCanvas).Control := Self;
    end;destructor TCustomControl.Destroy;
    begin
      FCanvas.Free;
      inherited Destroy;
    end;procedure TCustomControl.WMPaint(var Message: TWMPaint);
    begin
      Include(FControlState, csCustomPaint);
      inherited;
      Exclude(FControlState, csCustomPaint);
    end;procedure TCustomControl.PaintWindow(DC: HDC);
    begin
      FCanvas.Lock;
      try
        FCanvas.Handle := DC;
        try
          TControlCanvas(FCanvas).UpdateTextFlags;
          Paint;
        finally
          FCanvas.Handle := 0;
        end;
      finally
        FCanvas.Unlock;
      end;
    end;procedure TCustomControl.Paint;
    begin
    end;
      

  8.   

    torble(阿裕) 的已经分析得很清楚,你只要参照写进去就行了,我没什么好说的了。
      

  9.   

    不行,出错,谁还能帮我看看?unit Button1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TButton1 = class(TButton)
      private
        FCanvas: TCanvas;
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
      protected
        procedure Paint; virtual;
        procedure PaintWindow(DC: HDC); override;
        property Canvas: TCanvas read FCanvas;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      end;
    procedure Register;implementationconstructor TButton1.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FCanvas := TControlCanvas.Create;
      TControlCanvas(FCanvas).Control := Self;
    end;destructor TButton1.Destroy;
    begin
      FCanvas.Free;
      inherited Destroy;
    end;procedure TButton1.WMPaint(var Message: TWMPaint);
    begin
      Include(FControlState, csCustomPaint);
      inherited;
      Exclude(FControlState, csCustomPaint);
    end;procedure TButton1.PaintWindow(DC: HDC);
    begin
      FCanvas.Lock;
      try
        FCanvas.Handle := DC;
        try
          TControlCanvas(FCanvas).UpdateTextFlags;
          Paint;
        finally
          FCanvas.Handle := 0;
        end;
      finally
        FCanvas.Unlock;
      end;
    end;procedure TButton1.Paint;
    begin
    end;procedure Register;
    begin
      RegisterComponents('Samples', [TButton1]);
    end;end.
      

  10.   

    unit Button1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TButton1 = class(TButton)
      private
        FCanvas: TCanvas;
    //加一句
        FControlState: TControlState; 
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
      protected
        procedure Paint; virtual;
        procedure PaintWindow(DC: HDC); override;
    //    property Canvas: TCanvas read FCanvas;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        property Canvas: TCanvas read FCanvas;
      end;
    procedure Register;implementationconstructor TButton1.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FCanvas := TControlCanvas.Create;
      TControlCanvas(FCanvas).Control := Self;
    end;destructor TButton1.Destroy;
    begin
      FCanvas.Free;
      inherited Destroy;
    end;procedure TButton1.WMPaint(var Message: TWMPaint);
    begin
      Include(FControlState, csCustomPaint);
      inherited;
      Exclude(FControlState, csCustomPaint);
    end;procedure TButton1.PaintWindow(DC: HDC);
    begin
      FCanvas.Lock;
      try
        FCanvas.Handle := DC;
        try
          TControlCanvas(FCanvas).UpdateTextFlags;
          Paint;
        finally
          FCanvas.Handle := 0;
        end;
      finally
        FCanvas.Unlock;
      end;
    end;procedure TButton1.Paint;
    begin
    end;procedure Register;
    begin
      RegisterComponents('Samples', [TButton1]);
    end;end.