⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dockform.cpp

📁 嵌入式IDE
💻 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 + -