?? bsskintabs.pas
字號:
//
SaveIndex := -1;
IR := GetActiveTabRect;
if not IsNullRect(IR)
then
begin
SaveIndex := SaveDC(Cnvs.Handle);
ExcludeClipRect(Cnvs.Handle, IR.Left, IR.Top, IR.Right, IR.Bottom);
end;
//
Cnvs.Draw(R.Left, R.Top, TB);
Cnvs.Draw(R.Left, R.Top + TB.Height, LB);
Cnvs.Draw(R.Left + RectWidth(R) - RB.Width, R.Top + TB.Height, RB);
Cnvs.Draw(R.Left, R.Top + RectHeight(R) - BB.Height, BB);
if SaveIndex <> -1 then RestoreDC(Cnvs.Handle, SaveIndex);
LB.Free;
TB.Free;
RB.Free;
BB.Free;
end;
procedure TbsSkinPageControl.Loaded;
begin
inherited Loaded;
if FIndex = -1
then
begin
if TabHeight <= 0
then
SetItemSize(TabWidth, FDefaultItemHeight)
else
SetItemSize(TabWidth, TabHeight);
Change2;
ReAlign;
end;
end;
procedure TbsSkinPageControl.WMPaint(var Msg: TWMPaint);
begin
if PageCount = 0
then
begin
PaintHandler(Msg);
end
else
inherited;
end;
function TbsSkinPageControl.CheckVisibleTabs: Boolean;
var
i: Integer;
begin
Result := False;
if PageCount = 0
then
Result := False
else
begin
for i := 0 to PageCount - 1 do
begin
if Pages[i].TabVisible
then
begin
Result := True;
Break;
end;
end;
end;
end;
procedure TbsSkinPageControl.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
if (PageCount = 0) or (not CheckVisibleTabs)
then
begin
GetSkinData;
if FIndex = -1
then
inherited
else
DrawEmptyBackGround(Msg.DC);
end
else
begin
Msg.Result := 1;
end;
end;
procedure TbsSkinPageControl.WndProc(var Message:TMessage);
var
TOff, LOff, Roff, BOff: Integer;
begin
if Message.Msg = TCM_ADJUSTRECT
then
begin
inherited WndProc(Message);
if FIndex <> -1
then
begin
TOff := ClRect.Top;
LOff := ClRect.Left;
ROff := RectWidth(SkinRect) - ClRect.Right;
BOff := RectHeight(SkinRect) - ClRect.Bottom;
end;
case TabPosition of
tpLeft:
if FIndex <> -1
then
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left + LOff - 4;
PRect(Message.LParam)^.Right := ClientWidth - ROff;
{$IFNDEF VER130}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 4 + TOff;
{$ELSE}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 6 + TOff;
{$ENDIF}
PRect(Message.LParam)^.Bottom := ClientHeight - BOff;
if FHideTabs then PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 1;
end
else
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 3;
PRect(Message.LParam)^.Right := ClientWidth - 1;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 5;
PRect(Message.LParam)^.Bottom := ClientHeight - 1;
if FHideTabs then PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 1;
end;
tpRight:
if FIndex <> -1
then
begin
PRect(Message.LParam)^.Left := LOff;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right - ROff + 4;
{$IFNDEF VER130}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 4 + TOff;
{$ELSE}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 6 + TOff;
{$ENDIF}
PRect(Message.LParam)^.Bottom := ClientHeight - BOff;
if FHideTabs then PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right + 1;
end
else
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 3;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right + 3;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 5;
PRect(Message.LParam)^.Bottom := ClientHeight - 1;
if FHideTabs then PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right + 1;
end;
tpTop:
if FIndex <> -1
then
begin
PRect(Message.LParam)^.Left := LOff;
PRect(Message.LParam)^.Right := ClientWidth - ROff;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 6 + TOff;
PRect(Message.LParam)^.Bottom := ClientHeight - BOff;
if FHideTabs then PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 1;
end
else
begin
PRect(Message.LParam)^.Left := 1;
PRect(Message.LParam)^.Right := ClientWidth - 1;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 5;
PRect(Message.LParam)^.Bottom := ClientHeight - 1;
if FHideTabs then PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 1;
end;
tpBottom:
if FIndex <> -1
then
begin
PRect(Message.LParam)^.Left := LOff;
PRect(Message.LParam)^.Right := ClientWidth - ROff;
{$IFNDEF VER130}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 4 + TOff;
{$ELSE}
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 6 + TOff;
{$ENDIF}
PRect(Message.LParam)^.Bottom := PRect(Message.LParam)^.Bottom + 4 - BOff;
if FHideTabs then PRect(Message.LParam)^.Bottom := PRect(Message.LParam)^.Bottom + 1;
end
else
begin
PRect(Message.LParam)^.Left := 1;
PRect(Message.LParam)^.Right := ClientWidth - 1;
PRect(Message.LParam)^.Top := 1;
PRect(Message.LParam)^.Bottom := PRect(Message.LParam)^.Bottom + 3;
end;
end;
end
else
if Message.Msg = TCM_GETITEMRECT
then
begin
inherited WndProc(Message);
if Style = tsTabs
then
case TabPosition of
tpLeft:
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 2;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right - 2;
end;
tpRight:
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left + 2;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right + 2;
end;
tpTop:
begin
if not MultiLine
then
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 2;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right - 2;
end;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top - 2;
PRect(Message.LParam)^.Bottom := PRect(Message.LParam)^.Bottom - 2;
end;
tpBottom:
begin
if not MultiLine
then
begin
PRect(Message.LParam)^.Left := PRect(Message.LParam)^.Left - 2;
PRect(Message.LParam)^.Right := PRect(Message.LParam)^.Right - 2;
end;
PRect(Message.LParam)^.Top := PRect(Message.LParam)^.Top + 2;
PRect(Message.LParam)^.Bottom := PRect(Message.LParam)^.Bottom + 2;
end;
end;
end
else
inherited WndProc(Message);
if (Message.Msg = WM_SIZE) and (not MultiLine) and
not (csDesigning in ComponentState)
then
begin
CheckScroll;
end;
end;
function TbsSkinPageControl.GetItemRect(index: integer): TRect;
var
R: TRect;
begin
SendMessage(Handle, TCM_GETITEMRECT, index, Integer(@R));
Result := R;
if (Index = 0) and not MultiLine then Result.Left := Result.Left + 1;
end;
procedure TbsSkinPageControl.SetItemSize;
begin
SendMessage(Handle, TCM_SETITEMSIZE, 0, MakeLParam(AWidth, AHeight));
end;
procedure TbsSkinPageControl.PaintWindow(DC: HDC);
var
SaveIndex: Integer;
begin
if (Width <= 0) or (Height <=0) then Exit;
GetSkinData;
SaveIndex := SaveDC(DC);
try
Canvas.Handle := DC;
if FIndex = -1
then
PaintDefaultWindow(Canvas)
else
PaintSkinWindow(Canvas);
DrawTabs(Canvas);
Canvas.Handle := 0;
finally
RestoreDC(DC, SaveIndex);
end;
end;
procedure TbsSkinPageControl.TestActive(X, Y: Integer);
var
i, j, k: Integer;
R: TRect;
BR: TRect;
begin
if FHideTabs then Exit;
FOldActiveTab := FActiveTab;
FOldActiveTabIndex := FActiveTabIndex;
FActiveTab := -1;
FActiveTabIndex := -1;
k := -1;
j := -1;
for i := 0 to PageCount - 1 do
if Pages[i].TabVisible then
begin
Inc(k);
R := GetItemRect(k);
if PtInRect(R, Point(X, Y))
then
begin
j := k;
Break;
end;
end;
FActiveTab := i;
FActiveTabIndex := j;
if (FOldActiveTabIndex <> FActiveTabIndex)
then
begin
if (FOldActiveTabIndex <> - 1) and (FOldActiveTabIndex <> TabIndex) and
(FOldActiveTabIndex < PageCount)
then
begin
R := GetItemRect(FOldActiveTabIndex);
TbsSkinCustomTabSheet(Pages[FOldActiveTab]).ButtonMouseIn := False;
TbsSkinCustomTabSheet(Pages[FOldActiveTab]).ButtonMouseDown := False;
DrawTabs(Canvas);
end;
if (FActiveTabIndex <> -1) and (FActiveTabIndex <> TabIndex) and
(FActiveTabIndex < PageCount)
then
begin
R := GetItemRect(FActiveTabIndex);
DrawTabs(Canvas);
end;
end;
if (FActiveTabIndex <> -1) and FShowCloseButtons
then
with TbsSkinCustomTabSheet(Pages[FActiveTab]) do
begin
R := GetItemRect(FActiveTabIndex);
BR := ButtonRect;
OffsetRect(BR, R.Left, R.Top);
if PtInRect(BR, Point(X, Y)) and not ButtonMouseIn
then
begin
ButtonMouseIn := True;
DrawTabs(Canvas);
end
else
if not PtInRect(BR, Point(X, Y)) and ButtonMouseIn
then
begin
ButtonMouseIn := False;
ButtonMouseDown := False;
DrawTabs(Canvas);
end;
end;
end;
procedure TbsSkinPageControl.DrawTabs;
var
i, j: integer;
IR: TRect;
w, h, XCnt, YCnt, X, Y, TOff, LOff, Roff, BOff, YO: Integer;
Rct, R, DR: TRect;
Buffer, Buffer2: TBitMap;
ATabIndex, SaveIndex: Integer;
begin
if FHideTabs
then
begin
Exit;
end;
//
if (PageCount = 0) then Exit;
if FIndex = -1
then
begin
j := -1;
for i := 0 to PageCount-1 do
if Pages[i].TabVisible then
begin
inc(j);
R := GetItemRect(j);
DrawTab(i, R, (j = TabIndex), j = FActiveTabIndex, Cnvs);
end;
Exit;
end;
//
GetSkinData;
TOff := ClRect.Top;
LOff := ClRect.Left;
ROff := RectWidth(SkinRect) - ClRect.Right;
BOff := RectHeight(SkinRect) - ClRect.Bottom;
DR := Self.DisplayRect;
R := Rect(DR.Left - LOff, DR.Top - TOff, DR.Right + ROff, DR.Bottom + BOff);
Buffer := TBitMap.Create;
case TabPosition of
tpTop:
begin
Buffer.Width := Width;
Buffer.Height := R.Top;
end;
tpBottom:
begin
Buffer.Width := Width;
Buffer.Height := Height - R.Bottom;
end;
tpRight:
begin
Buffer.Width := Width - R.Right;
Buffer.Height := Height;
end;
tpLeft:
begin
Buffer.Width := R.Left;
Buffer.Height := Height;
end;
end;
// draw tabsbg
if IsNullRect(TabsBGRect)
then
begin
TabsBGRect := ClRect;
OffsetRect(TabsBGRect, SkinRect.Left, SkinRect.Top);
end;
w := RectWidth(TabsBGRect);
h := RectHeight(TabsBGRect);
XCnt := Buffer.Width div w;
YCnt := Buffer.Height div h;
if not TabsBGTransparent
then
begin
Buffer2 := TBitMap.Create;
Buffer2.Width := w;
Buffer2.Height := h;
Buffer2.Canvas.CopyRect(Rect(0, 0, w, h), Picture.Canvas, TabsBGRect);
for X := 0 to XCnt do
for Y := 0 to YCnt do
begin
Buffer.Canvas.Draw(X * w, Y * h, Buffer2);
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -