📄 dockform.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "DockForm.h"
#include "IDE.h"
#include "ConJoinHost.h"
#include "TabHost.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TDockableForm *DockableForm;
//---------------------------------------------------------------------------
__fastcall TDockableForm::TDockableForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TDockableForm::FormCreate(TObject *Sender)
{
DockableForm->FormStyle = fsStayOnTop;
DockableForm->BorderStyle = bsSizeToolWin;
DockableForm->DockSite = true;
DockableForm->DragKind = dkDock;
DockableForm->DragMode = dmAutomatic;
DockableForm->UseDockManager = false;
}
//---------------------------------------------------------------------------
void __fastcall TDockableForm::FormClose(TObject *Sender,
TCloseAction &Action)
{
if(dynamic_cast<TConJoinDockHost*>(HostDockSite) != NULL)
{
(static_cast<TConJoinDockHost*>(HostDockSite))->UpdateCaption(this);
if(HostDockSite->VisibleDockClientCount <= 1)
HostDockSite->Hide();
}
if(dynamic_cast<TPanel*>(HostDockSite) != NULL)
IdeForm->ShowDockPanel(static_cast<TPanel*>(HostDockSite), false, NULL);
Action = caHide;
IsShow = false;
}
//---------------------------------------------------------------------------
void __fastcall TDockableForm::FormDockOver(TObject *Sender,
TDragDockObject *Source, int X, int Y, TDragState State,
bool &Accept)
{
TRect ARect;
Accept = (dynamic_cast<TDockableForm*>(Source->Control) != NULL);
if(Accept && (ComputeDockingRect(ARect, Point(X, Y)) != alNone))
Source->DockRect = ARect;
}
//---------------------------------------------------------------------------
void __fastcall TDockableForm::FormShow(TObject *Sender)
{
if(dynamic_cast<TConJoinDockHost*>(HostDockSite) != NULL)
(static_cast<TConJoinDockHost*>(HostDockSite))->UpdateCaption(NULL);
IsShow = true;
}
//---------------------------------------------------------------------------
TAlign TDockableForm::ComputeDockingRect(TRect & DockRect, const TPoint & MousePos)
{
Types::TRect DockTopRect,DockLeftRect,DockBottomRect,DockRightRect,DockCenterRect;
Types::TPoint TopLeft,BottomRight;
TAlign Result = alNone;
TopLeft = Types::TPoint(0, 0);
BottomRight = Types::TPoint(ClientWidth / 5, ClientHeight);
DockLeftRect = Types::TRect(TopLeft, BottomRight);
TopLeft = Types::TPoint(ClientWidth / 5, 0);
BottomRight = Types::TPoint(ClientWidth / 5 * 4, ClientHeight / 5);
DockTopRect = Types::TRect(TopLeft, BottomRight);
TopLeft = Types::TPoint(ClientWidth / 5 * 4, 0);
BottomRight = Types::TPoint(ClientWidth, ClientHeight);
DockRightRect = Types::TRect(TopLeft, BottomRight);
TopLeft = Types::TPoint(ClientWidth / 5, ClientHeight / 5 * 4);
BottomRight = Types::TPoint(ClientWidth / 5 * 4, ClientHeight);
DockBottomRect = Types::TRect(TopLeft, BottomRight);
TopLeft = Types::TPoint(ClientWidth / 5, ClientHeight / 5);
BottomRight = Types::TPoint(ClientWidth / 5 * 4, ClientHeight / 5 * 4);
DockCenterRect = Types::TRect(TopLeft, BottomRight);
if(PtInRect(&DockLeftRect, MousePos))
{
Result = alLeft;
DockRect = DockLeftRect;
DockRect.Right = ClientWidth / 2;
}
else if(PtInRect(&DockTopRect, MousePos))
{
Result = alTop;
DockRect = DockTopRect;
DockRect.Left = 0;
DockRect.Right = ClientWidth;
DockRect.Bottom = ClientHeight / 2;
}
else if (PtInRect(&DockRightRect, MousePos))
{
Result = alRight;
DockRect = DockRightRect;
DockRect.Left = ClientWidth / 2;
}
else if (PtInRect(&DockBottomRect, MousePos))
{
Result = alBottom;
DockRect = DockBottomRect;
DockRect.Left = 0;
DockRect.Right = ClientWidth;
DockRect.Top = ClientHeight / 2;
}
else if (PtInRect(&DockCenterRect, MousePos))
{
Result = alClient;
DockRect = DockCenterRect;
}
if(Result != alNone)
{
TopLeft = ClientToScreen(Types::TPoint(DockRect.Left, DockRect.Top));
BottomRight = ClientToScreen(Types::TPoint(DockRect.Right, DockRect.Bottom));
DockRect = TRect(TopLeft, BottomRight);
}
return Result;
}
//---------------------------------------------------------------------------
void __fastcall TDockableForm::CMDockClient(TCMDockClient& Message)
{
TRect ARect;
TAlign DockType;
TForm* Host;
Types::TPoint Pt;
if(dynamic_cast<TDockableForm*>(Message.DockSource->Control) != NULL)
{
Pt.x = Message.MousePos.x;
Pt.y = Message.MousePos.y;
DockType = ComputeDockingRect(ARect, Pt);
if(dynamic_cast<TPanel*>(HostDockSite) != NULL)
{
Message.DockSource->Control->ManualDock(HostDockSite, NULL, DockType);
return;
}
if(DockType == alClient)
{
Host = new TTabDockHost(Application);
Host->BoundsRect = this->BoundsRect;
TPageControl* PageControl = dynamic_cast<TTabDockHost*>(Host)->PageControl;
if(PageControl == NULL)
throw EInvalidCast("");
this->ManualDock(PageControl, NULL, alClient);
Message.DockSource->Control->ManualDock(PageControl, NULL, alClient);
Host->Visible = true;
}
else
{
Host = new TConJoinDockHost(Application);
Host->BoundsRect = this->BoundsRect;
this->ManualDock(Host, NULL, alNone);
this->DockSite = false;
Message.DockSource->Control->ManualDock(Host, NULL, DockType);
dynamic_cast<TDockableForm*>(Message.DockSource->Control)->DockSite = false;
Host->Visible = true;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TDockableForm::FormHide(TObject *Sender)
{
IsShow = false;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -