我继承了TGraphicControl类做了一个控件,要把内容擦除,恢复透明状态,我已经参照了TShape的做法,可是还是不行,不知为何,请指点,代码如下:
    Pen.Style := psClear;
    Pen.Width := 1;
    Pen.Mode  := pmCopy;
    Brush.Style := bsClear;
    Rectangle(Rect);

解决方案 »

  1.   

    type
      TTempGraphic = class(TGraphicControl)
      protected
        procedure Paint; override;
      end;{ TTempGraphic }procedure TTempGraphic.Paint;
    begin
      inherited;
    //  Canvas.Pen.Style := psClear;//如果有这条就是全部透明了~~  Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(Rect(0, 0, Width, Height));
    end;{ TForm1 }procedure TForm1.FormCreate(Sender: TObject);
    begin
      with TTempGraphic.Create(Self) do begin
        Parent := Self;
        Width := 100;
        Height := 100;
      end;
    end;
    //不明白你的意思,随便灌灌~~
      

  2.   

    你差不多明白我的意思,不过还是有些含糊,我把你的程序改了一下写成下面的这段,你看一下,我在里面画了一个小方框,要把这个小方框的内容擦除并透明。type
      TForm1 = class(TForm)
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        procedure FormCreate(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;type
      TTempGraphic = class(TGraphicControl)
      protected
        procedure Paint; override;
      end;var
      Form1: TForm1;
      xx: TTempGraphic;
      d: Boolean = true;implementationprocedure TTempGraphic.Paint;
    begin
      inherited;
    //  Canvas.Pen.Style := psClear;//如果有这条就是全部透明了~~  Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(Rect(0, 0, Width, Height));
      if d then
      begin
        Canvas.Pen.Style := psSolid;
        Canvas.Rectangle(Rect(10, 10, 20, 20));
      end
      else
      begin
        Canvas.Pen.Style := psClear;//如果有这条就是全部透明了~~
        Canvas.Rectangle(Rect(10, 10, 20, 20));
      end;
    end;
    {$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      xx := TTempGraphic.Create(Self);
      with xx do begin
        Parent := Self;
        Width := 100;
        Height := 100;
      end;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      d := True;
      xx.Paint;
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
      d := False;
      xx.Paint;
    end;
      

  3.   

    //自己多做做测试,有时候穷举法很笨,但很管用~~type
      TTempGraphic = class(TGraphicControl)
      private
        FTransparent: Boolean;
        procedure SetTransparent(const Value: Boolean);
      protected
        procedure Paint; override;
      public
        property Transparent: Boolean read FTransparent write SetTransparent;
      end;type
      TForm1 = class(TForm)
        Label1: TLabel;
        CheckBox1: TCheckBox;
        Image1: TImage;
        procedure FormCreate(Sender: TObject);
        procedure CheckBox1Click(Sender: TObject);
      private
        { Private declarations }
        FTempGraphic: TTempGraphic;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TTempGraphic }procedure TTempGraphic.Paint;
    begin
      inherited;
      Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(Rect(0, 0, Width, Height));
      if not FTransparent then Canvas.Brush.Style := bsSolid;
      Canvas.Rectangle(Rect(10, 10, 20, 20));
    end;procedure TTempGraphic.SetTransparent(const Value: Boolean);
    begin
      if FTransparent = Value then Exit;
      FTransparent := Value;
      Repaint;
    end;{ TForm1 }procedure TForm1.FormCreate(Sender: TObject);
    begin
      FTempGraphic := TTempGraphic.Create(Self);
      with FTempGraphic do begin
        Parent := Self;
        Width := 100;
        Height := 100;
      end;
    end;procedure TForm1.CheckBox1Click(Sender: TObject);
    begin
      FTempGraphic.Transparent := TCheckBox(Sender).Checked;
    end;
      

  4.   

    谢谢,你这样的做法确实可以用。但是我要实现的略有不同,但不知如何实现,我要做的代码如下:
    Value值改变后原来的没有擦除:(unit Unit1;interfaceuses SysUtils, Classes, Types, Controls, Graphics, Windows;type
      TTest = class(TGraphicControl)
      private
        FValue: Integer;    procedure SetValue(Value: Integer);
      public
      protected
        procedure Paint; override;
      published
        property Value: Integer read FValue write SetValue;
      end;
    procedure Register;implementationprocedure TTest.Paint;
    var
      R: TRect;
    begin
      inherited;
      Canvas.Brush.Style := bsClear;
      Canvas.Rectangle(Rect(0, 0, Width, Height));  Canvas.Font.Size := 24;  R.Top := 0;
      R.Right := 0;
      R.Right := Width;
      R.Bottom := Height;
      DrawText(Canvas.Handle, PChar(IntToStr(FValue)), Length(IntToStr(FValue)), R, DT_EXPANDTABS);
    end;procedure TTest.SetValue(Value: Integer);
    begin
      FValue := Value;
      Paint;
    end;procedure Register;
    begin
      RegisterComponents('Test', [TTest]);
    end;end.
      

  5.   

    procedure TTest.SetValue(Value: Integer);
    begin
      FValue := Value;
      Paint; //Paint替换成Repaint; //画布更改了,还要显示在屏幕上~~
    end;