请教高手如何能做出一个特殊形状的按钮,比如是圆角矩形,椭圆形等.用API函数实现的,不用图片.
在线期待~~!

解决方案 »

  1.   

    通常图形按钮都是从TGraphicControl派生,不用直接调用GDI,利用VCL封装的Canvas绘制图形即可!图形也是用GDI画,好看的按钮还得先做出图像来!Canvas.RoundRect(0,0,Width,Height,5,5);//圆角矩形Canvas.Ellipse(0,0,Width,Height);//椭圆其它就是对消息WM_PAINT处理进行重画,WM_LBUTTONDOWN,WM_LBUTTONUP改变鼠标按下抬起图形的变化,还有CM_MOUSEENTER,CM_MOUSELEAVE等等...
      

  2.   

    TButtonTest = class(TGraphicControl)
    public
      constructor Create(aOwner: TComponent); override;
    protected
      procedure Paint; override;
    end;constructor TButtonTest.Create(aOwner: TComponent);
    begin
      inherited;
      Height:=50;
      Width:=100;
    end;procedure TButtonTest.Paint;
    begin
      inherited;
      Canvas.Brush.Style:=bsClear;
      Canvas.Pen.Color:=clBlue;
      Canvas.Brush.Color:=clGreen;
      Canvas.RoundRect(0,0,Width,Height,8,8);//圆角矩形
      Canvas.Ellipse(0,0,Width,Height);//椭圆
    end;var Btn:TButtonTest;Btn:=TButtonTest.Create(self);
    Btn.Parent:=Self;
      

  3.   

    椭圆形按钮:
    type
      TRbutton=class(TButton)
    private
      .......
    protected
      procedure CreateWnd;override;
      ........
      ........
    procedure TRbutton.CreateWnd;//在控件一建立就设置
    var
      hRgn :THandle;
    begin
      inherited  CreateWnd;
      hRgn:=CreateEllipticRgn(0,0,Width,Height);//创建一个椭圆剪裁域;
      SetWindowRgn(Handle,hRgn,True);
    end;
      

  4.   

    把你的button拖过来,再用setwindownrgn搞定, 里面传入的handle参数就是刚才的button1.handle,  具体设置见 cg1120(代码最优化-§新年祝福你,好运伴着你§) ,里面的hrgn就是你要的图形句柄!