1、在Pagecontrol中标签的hit只能显示Pagecontrol的,而不能显示Tabsheel的,如何让鼠标指向(注意不是点击,该页非当前页)标签时显示对应Tabsheel的hit2、当Pagecontrol的标签多行显示而Pagecontrol不够大时,低层的标签显示不出来,该如何动态将Pagecontrol扩大让所有的标签显示出来,因为我需要的只是它的标签,下面的页面我给缩到最小了。我要做的就是像MYIE的页面控制栏那样的效果,它也是用Pagecontrol+MDI子窗口的。可惜它的源码是C++的。

解决方案 »

  1.   

    第一个问题解决方法如下,继承TPageControl,处理一些消息。
    下面是个例子,新建一个Form,放一个PageControl,建两个Sheet。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, CommCtrl;type
      TPageControl = class(ComCtrls.TPageControl)
      private
        FMouseTabIndex: Integer;
        procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
      protected
        procedure WndProc(var Message:TMessage); override;
      public
        constructor Create(AOwner: TComponent); override;
        function FindTabAtPos(Point: TPoint): Integer;
      end;type
      TForm1 = class(TForm)
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}constructor TPageControl.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FMouseTabIndex := -1;
    end;function TPageControl.FindTabAtPos(Point: TPoint): Integer;
    var
      HitTestInfo: TTCHitTestInfo;
    begin
      HitTestInfo.pt := Point;
      Result := SendMessage(Handle,TCM_HITTEST, 0, Longint(@HitTestInfo));
    end;procedure TPageControl.CMHintShow(var Message: TCMHintShow);
    begin
      inherited;
      if (FMouseTabIndex >= 0) then
        Message.HintInfo^.HintStr := Pages[FMouseTabIndex].Hint
      else
        Message.HintInfo^.HintStr := Hint;
    end;procedure TPageControl.WndProc(var Message:TMessage);
    var
      oldPos: Integer;
    begin
      if (Message.Msg = WM_MOUSEMOVE) then
      begin
        oldPos := FMouseTabIndex;
        FMouseTabIndex := FindTabAtPos(Point(Message.LParamLo, Message.LParamHi));
        if oldPos <> FMouseTabIndex then Application.CancelHint;
      end;
      inherited WndProc(Message);
    end;end.
      

  2.   

    sysu(死树):  你的代码有点漏洞,正常是可以运行,但当我把其中一页用:
      pagecontrol1.pages[0].tabvisible:=false隐藏后,就出现问题了,它显示的不是当前页,第二页会显示第三页的Hit,多隐藏几页就会多推几页。
      请你帮个忙把漏洞堵上,第二个问题不用答也给满分。
      谢谢了!
      

  3.   

    呵呵是有点漏洞,没考虑到TabVisible,把其中的CMHintShow过程改一下就行了:
    procedure TPageControl.CMHintShow(var Message: TCMHintShow);
    var
      i: Integer;
      sheet: TTabSheet;
    begin
      inherited;
      if (FMouseTabIndex >= 0) then begin
        sheet := Pages[0];
        if sheet.TabVisible then
          for i := 1 to FMouseTabIndex do
            sheet := FindNextPage(sheet, True, True)
        else
          for i := 0 to FMouseTabIndex do
            sheet := FindNextPage(sheet, True, True);
        Message.HintInfo^.HintStr := sheet.Hint;
      end
      else
        Message.HintInfo^.HintStr := Hint;
    end;
      

  4.   

    MyIE好象用的是TabControl,不是PageControl
      

  5.   

    sysu(死树) :
    通过了,谢谢,分都给你了。
    下面的问题你看看能不能帮个忙:http://expert.csdn.net/Expert/topic/1455/1455408.xml?temp=.2629053
      

  6.   

    第一个问题:先分别设定各个TabSheet的hint再把PageControl的showhint打开,写以下代码
    procedure TForm1.PageControl1MouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
     self.PageControl1.Hint:=PageControl1.Pages[PageControl1.IndexOfTabAt(x,y)].Hint;
    end;