一、如何实现仿Windows 优化大师左侧界面的按钮效果(即按下某一按钮后能将其下一层的内容展现在此按钮下);
二、如何制作圆形按钮。

解决方案 »

  1.   

    呵呵,以前用帖子!实现不规则按钮用unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        ImageRight: TImage;
        ImageDown: TImage;
        PanelCenter: TPanel;
        ImageCenter: TImage;
        MemoRight: TMemo;
        MemoDown: TMemo;
        SpeedButtonRight: TSpeedButton;
        SpeedButtonDown: TSpeedButton;
        SpeedButtonClose: TSpeedButton;
        procedure SpeedButtonRightClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure SpeedButtonDownClick(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure ImageCenterMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure SpeedButtonCloseClick(Sender: TObject);
      private
        { Private declarations }
        FRGNRight: HRGN;
        FRGNDown: HRGN;
        FRGNCenter: HRGN;
        FRGNForm: HRGN;
        FShowRight: Boolean;
        FShowDown: Boolean;
        procedure SetShowRight(const value: Boolean);
        procedure SetShowDown(const value: Boolean);
        procedure ShowFormRgn;
      public
        { Public declarations }
        property ShowRight: Boolean read FShowRight write SetShowRight;
        property ShowDown: Boolean read FShowDown write SetShowDown;
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.SpeedButtonRightClick(Sender: TObject);
    begin
      ShowRight := not ShowRight;
    end;procedure TForm1.SpeedButtonDownClick(Sender: TObject);
    begin
      ShowDown := not ShowDown;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      with ImageCenter do begin
        Picture.Bitmap.Width := Width;
        Picture.Bitmap.Height := Height;
        Picture.Bitmap.Canvas.Brush.Color := clBlue;
        Picture.Bitmap.Canvas.FillRect(Rect(0, 0, Width, Height));
      end;  ///////Begin 创建不规则的区域
      { TODO : 修改区域 }
      FRGNRight := CreateRectRgn(
        ImageRight.BoundsRect.Left,
        ImageRight.BoundsRect.Top,
        ImageRight.BoundsRect.Right,
        ImageRight.BoundsRect.Bottom);  FRGNDown := CreateRectRgn(
        ImageDown.BoundsRect.Left,
        ImageDown.BoundsRect.Top,
        ImageDown.BoundsRect.Right,
        ImageDown.BoundsRect.Bottom);  FRGNCenter :=  CreateRectRgn(
        ImageCenter.BoundsRect.Left,
        ImageCenter.BoundsRect.Top,
        ImageCenter.BoundsRect.Right,
        ImageCenter.BoundsRect.Bottom);
      ///////End 创建不规则的区域
      
      ShowFormRgn;  DoubleBuffered := True;
      FShowRight := False;
      FShowDown := False;
    end;procedure TForm1.SetShowRight(const value: Boolean);
    const
      {$J+}vChanging: Boolean = False;
    const
      cOffset = 3;
    var
      I: Integer;
      vStart, vEnd: Integer;
      vOffset: Integer; //偏移量
    begin
      if FShowRight = value then Exit;
      if vChanging then Exit;
      FShowRight := value;
      vChanging := True;
      if FShowRight then begin
        vOffset := -cOffset;
        vStart := ImageRight.Left;
        vEnd := ImageRight.Left - ImageRight.Width + 20;
      end else begin
        vOffset := +cOffset;
        vStart := ImageRight.Left;
        vEnd := ImageRight.Left + ImageRight.Width - 20;
      end;
      I := vStart;
      while Abs(I - vEnd) > Abs(vOffset) do begin
        ImageRight.Left := I;
        MemoRight.Left := I + 1;
        SpeedButtonRight.Left := I + 170;
        Application.ProcessMessages;
        OffsetRgn(FRGNRight, vOffset, 0); //偏移区域
        ShowFormRgn;
        ClientWidth := I + ImageRight.Width + 2; //宽度改变
        Update;
        I := I + vOffset;
      end;
      vChanging := False;
    end;procedure TForm1.SetShowDown(const value: Boolean);
    const
      {$J+}vChanging: Boolean = False;
    const
      cOffset = 3;
    var
      I: Integer;
      vStart, vEnd: Integer;
      vOffset: Integer; //偏移量
    begin
      if FShowDown = value then Exit;
      if vChanging then Exit;
      FShowDown := value;
      vChanging := True;
      if FShowDown then begin
        vOffset := -cOffset;
        vStart := ImageDown.Top;
        vEnd := ImageDown.Top - ImageDown.Height + 20;
      end else begin
        vOffset := +cOffset;
        vStart := ImageDown.Top;
        vEnd := ImageDown.Top + ImageDown.Height - 20;
      end;
      I := vStart;
      while Abs(I - vEnd) > Abs(vOffset) do begin
        ImageDown.Top := I;
        MemoDown.Top := I + 1;
        SpeedButtonDown.Top := I + 95;
        Application.ProcessMessages;
        OffsetRgn(FRGNDown, 0, vOffset); //偏移区域
        ShowFormRgn;
        ClientHeight := I + ImageDown.Height + 2; //宽度改变
        Update;
        I := I + vOffset;
      end;
      vChanging := False;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      DeleteObject(FRGNRight);
      DeleteObject(FRGNDown);
      DeleteObject(FRGNCenter);
      DeleteObject(FRGNForm);
    end;procedure TForm1.ShowFormRgn;
    begin
      ///////Begin 清除区域
      DeleteObject(FRGNForm);
      FRGNForm := CreateRectRgn(0, 0, 0, 0);
      ///////End 清除区域
      CombineRgn(FRGNForm, FRGNCenter, FRGNRight, RGN_OR);
      CombineRgn(FRGNForm, FRGNForm, FRGNDown, RGN_OR);
      SetWindowRgn(Handle, FRGNForm, True);
    end;procedure TForm1.ImageCenterMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      ReleaseCapture;
      Perform(WM_SYSCOMMAND, SC_MOVE + 1, 0);
    end;procedure TForm1.SpeedButtonCloseClick(Sender: TObject);
    begin
      Close;
    end;end.
      

  2.   

    不规则按牛好做。从CustomCONTROL派生处理RGN和画就是了。你说的哪个可展开的东西我做过。参考类似VCL CODE吧。难点应该就是在每个按钮对应的哪个容器面版,相关知识在D5开发指南中有说到。我就是看了书和参考了一个类似代码做的。看现在新版本的QQ的界面就用的这个东西。做的很全了。
      

  3.   

    有很多控件,你试试:
       1:Raize
       2:flatstyle
    还有很多。到51delphi上去看看。
      

  4.   

    用DevExpress吧!
    一、ExpressBar的SideBar,ExpressForum Lib中有类似OutLook效果的,具体名称忘了
    二、好象有个Skin空间可以做到!
    http://expert.csdn.net/Expert/topic/1855/1855814.xml?temp=.8888666
    以前我的问题,呵呵!