请问如何实现类似QQ的窗口界面效果?谢谢!

解决方案 »

  1.   

    使用jvc控见,到www.playicq.com找找看
    也可以自己写一个
      

  2.   

    我自己写的代码type
      TBtnInfo = Record
        Button: TButton;
        //FTop : integer;
      end;
      BtnInfoArr = Array of TBtnInfo;  TForm1 = class (TForm)
        Panel1: TPanel;
        btn1: TButton;
        tv1: TTreeView;
        btn2: TButton;
        btn3: TButton;
        btn4: TButton;
        btn5: TButton;
        tv2: TTreeView;
        tv3: TTreeView;
        tv4: TTreeView;
        tv5: TTreeView;
        Edit1: TEdit;
        Label1: TLabel;
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
        procedure btn3Click(Sender: TObject);
        procedure btn4Click(Sender: TObject); 
        procedure btn5Click(Sender: TObject);
        procedure FormResize(Sender: TObject);
        procedure FormCanResize(Sender: TObject; var NewWidth,
          NewHeight: Integer; var Resize: Boolean);
        procedure FormCreate(Sender: TObject);  private
        procedure TreeViewMoveTo(TreeView: TTreeView; Button: TButton;
          Parent_Panel: TPanel);
        function GetBtnInfo(Button: TButton; TreeView: TTreeView;
          Parent_Panel: TPanel): BtnInfoArr;
        function BtnUnderTv(Button: TButton; TreeView: TTreeView): boolean;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function TForm1.BtnUnderTv(Button: TButton; TreeView: TTreeView): boolean;
    begin
      Result := (Button.Top > TreeView.Top);
    end;function TForm1.GetBtnInfo(Button: TButton; TreeView: TTreeView;
      Parent_Panel: TPanel): BtnInfoArr;
    { Get Informations of the buttons that between Button and TreeView }
    var
      i, j: integer;
      MinTop, MaxTop: integer;
      pTBtnInfo : ^TBtnInfo;
    begin
      if Button.Top < TreeView.Top then begin
        MinTop := Button.Top;
        MaxTop := TreeView.Top;
      end
      else begin
        MinTop := TreeView.Top;
        MaxTop := Button.Top;
      end;  j := 0;
      for i := 0 to self.ComponentCount - 1 do
        if (self.Components[i] is TButton)and
          (TButton(self.Components[i]).Parent = Parent_Panel) then
          if (TButton(self.Components[i]).Top < MaxTop)
            and(TButton(self.Components[i]).Top > MinTop) then
              Inc(j);  SetLength(Result, j);  j := 0;
      for i := 0 to self.ComponentCount - 1 do
        if (self.Components[i] is TButton)and
          (TButton(self.Components[i]).Parent = Parent_Panel) then
          if (TButton(self.Components[i]).Top < MaxTop)
            and(TButton(self.Components[i]).Top > MinTop) then
          begin
            new(pTBtnInfo);
            pTBtnInfo^.Button := TButton(self.Components[i]);
            Result[j] := pTBtnInfo^;
            Dispose(pTBtnInfo);
            Inc(j);
          end;
    end;
    procedure TForm1.TreeViewMoveTo(TreeView: TTreeView; Button: TButton;
      Parent_Panel: TPanel);
    var
      i, Len: integer;
      myArr : BtnInfoArr;
    begin
      myArr := GetBtnInfo(Button, TreeView, Panel1);
      Len := Length(MyArr);    if Len <> 0 then    if BtnUnderTv(Button, TreeView) then begin 
          TreeView.Top := TreeView.Top + ((Len + 1)* Button.Height);
          for i := 0 to Len - 1 do
            myArr[i].Button.Top := myArr[i].Button.Top 
              - TreeView.Height;
          Button.Top := Button.Top - TreeView.Height;
        end
        else begin    
          TreeView.Top := TreeView.Top - (Len * Button.Height);
          for i := 0 to Len - 1 do
            myArr[i].Button.Top := myArr[i].Button.Top + TreeView.Height;
        end  else begin//中间没有间隔
        //Button刚刚在TreeView的下面
        if (TreeView.Top + TreeView.Height = Button.Top) then begin
          TreeView.Top := TreeView.Top + Button.Height;
          Button.Top := Button.Top - TreeView.Height;
        end;
      end;  //Button刚刚在TreeView的上面
      if (Button.Top + Button.Height = TreeView.Top) then begin
        for i := 0 to self.ComponentCount - 1 do
          if (self.Components[i] is TTreeView)
            and(TTreeView(self.Components[i]).Parent = Parent_Panel) then
          begin
            TTreeView(self.Components[i]).Visible := false;
            TTreeView(self.Components[i]).Top := TreeView.Top;
          end;
        TreeView.Visible := true;
      end;
    end;procedure TForm1.btn1Click(Sender: TObject);
    begin
      TreeViewMoveTo(tv1, btn1, Panel1);
    end;procedure TForm1.btn2Click(Sender: TObject);
    begin
      TreeViewMoveTo(tv2, btn2, Panel1);
    end;procedure TForm1.btn3Click(Sender: TObject);
    begin
      TreeViewMoveTo(tv3, btn3, Panel1);
    end;procedure TForm1.btn4Click(Sender: TObject);
    begin
      TreeViewMoveTo(tv4, btn4, Panel1);
    end;procedure TForm1.btn5Click(Sender: TObject);
    begin
      TreeViewMoveTo(tv5, btn5, Panel1);
    end;   
    procedure TForm1.FormResize(Sender: TObject);
    var
      i: integer;
    begin
      //btn_Width := self.Width - 14;
      Panel1.Width := self.Width - 8;
      for i := 0 to self.ComponentCount - 1 do
        if TWinControl(self.Components[i]).Parent = Panel1 then
          TWinControl(self.Components[i]).width := Panel1.Width - 6;
    end;procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
      NewHeight: Integer; var Resize: Boolean);
    begin
      try
        if NewWidth > StrToInt(edit1.Text) then
          Resize := false;
      except
        ShowMessage('非法数值!');
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      edit1.Text := '300';
    end;end.
      

  3.   

    DevexpressExpressBar的SideBar
    EForumLib中有类似OutLook的控件!