1、在Pagecontrol中标签的hit只能显示Pagecontrol的,而不能显示Tabsheel的,如何让鼠标指向(注意不是点击,该页非当前页)标签时显示对应Tabsheel的hit2、当Pagecontrol的标签多行显示而Pagecontrol不够大时,低层的标签显示不出来,该如何动态将Pagecontrol扩大让所有的标签显示出来,因为我需要的只是它的标签,下面的页面我给缩到最小了。我要做的就是像MYIE的页面控制栏那样的效果,它也是用Pagecontrol+MDI子窗口的。可惜它的源码是C++的。
下面是个例子,新建一个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.
pagecontrol1.pages[0].tabvisible:=false隐藏后,就出现问题了,它显示的不是当前页,第二页会显示第三页的Hit,多隐藏几页就会多推几页。
请你帮个忙把漏洞堵上,第二个问题不用答也给满分。
谢谢了!
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;
通过了,谢谢,分都给你了。
下面的问题你看看能不能帮个忙:http://expert.csdn.net/Expert/topic/1455/1455408.xml?temp=.2629053
procedure TForm1.PageControl1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
self.PageControl1.Hint:=PageControl1.Pages[PageControl1.IndexOfTabAt(x,y)].Hint;
end;