史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   使用BCB 2006的DockTabSet1元件,設計滑動效果 (http://forum.slime.com.tw/thread225666.html)

不知道 2008-02-25 12:39 PM

使用BCB 2006的DockTabSet1元件,設計滑動效果
 
小弟是以C++ Builder 2006寫的
這兩天才研究出來,所以粗略的跟大家分享心得
參考資料http://dn.codegear.com/article/33446

首先開一個新專案
放入TDockTabSet(DockTabSet1)和TPanel(Panel1)元件
TDockTabSet(DockTabSet1)元件的屬性如下:
語法:

    ShrinkToFit = True
    Style = tsModernPopout
    TabPosition = tpRight
    DestinationDockSite = Panel1

TPanel(Panel1)元件的屬性如下:
語法:

    Align = alLeft
    DockSite = True
    Width = 0

再加入TSplitter(Splitter1)和TMemo(Memo1)元件
TMemo(Memo1)元件的屬性如下:
語法:

    Align = alClient
再新增一個表單TForm2(Form2),屬性如下:
語法:

  BorderStyle = bsSizeToolWin
  DockSite = True
  DragKind = dkDock
  DragMode = dmAutomatic
  OldCreateOrder = False

接著將Unit2.h檔案Include到Unit1.cpp
加入Form1的Show事件,程式碼如下:
語法:

        TForm2 *FD;
        int iFormCount = Screen->FormCount;

        // Clear existing forms (if they exist)
        for (int i=0; i < iFormCount; i++) {
                FD = dynamic_cast<TForm2 *>(Screen->Forms[i]);
                if (FD != NULL) {
                        FD->Close();  // Forms are set to auto-free on close
                }
        }

        // Create New Forms

        // You can use either method; I just show both to show both.  ;-)
        // Static Method
        FD = TForm2::CreateDockForm(clBlue);
        FD->ManualDock(Panel1);

        // Constructor Method
        FD = new TForm2(this, clGreen);
        FD->Show();
        FD->ManualDock(Panel1, NULL, alTop);

        // Constructor Method
        FD = new TForm2(this, clRed);
        FD->ManualDock(Panel1, NULL, alRight);
        FD->Show();

        // Static Method
        FD = TForm2::CreateDockForm(clWhite);
        FD->ManualDock(DockTabSet1);

加入Panel1的DockDrop事件,程式碼如下:
語法:

        if (Panel1->Width == 0) {
                Panel1->Width = 150;
        }

        Splitter1->Visible = True;
        Splitter1->Left = Panel1->Width;

加入Panel1的UnDock事件,程式碼如下:
語法:

        if (Panel1->DockClientCount == 1) {
                Panel1->Width = 0;
                Splitter1->Visible = false;
        }

加入DockTabSet1的DockDrop事件,程式碼如下:
語法:

        DockTabSet1->Visible = true;
加入DockTabSet1的TabRemoved,程式碼如下:
語法:

        if (DockTabSet1->Tabs->Count > 0) {
                DockTabSet1->Visible = true;
        } else {
                DockTabSet1->Visible = false;
        }

加入DockTabSet1的DockOver事件,程式碼如下:
語法:

        TRect lRect;
        TPoint lPoint;
        TForm2 *TFD;

        TFD = dynamic_cast<TForm2 *>(Source->Control);

        if (TFD != NULL) {
                Accept = true;
                lPoint = Panel1->ClientToScreen(Point(0, 0));
                lRect.Top = lPoint.y;
                lRect.Left = lPoint.x;
                lPoint = Panel1->ClientToScreen(Point(150, Panel1->Height));
                lRect.Bottom = lPoint.y;
                lRect.Right = lPoint.x;
                Source->DockRect = lRect;
        }

再來修改Form2表單:
首先在Unit2.cpp檔案中TForm2 *Form2;下面加入
語法:

//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner, const TColor aColor)
        : TForm(Owner)
{
        Color = aColor;
        Caption = ColorToString(aColor);
}

然後再TForm2 *Form2;前面加入//(亦即將TForm2 *Form2;標記)
再將Form2設為動態載入(將Project1.cpp檔案這行Application->CreateForm(__classid(TForm2), &Form2);刪除)
加入Form2的Close事件,程式碼如下:
語法:

        ManualFloat(Rect(0,0,0,0));
        Action = caFree;

加入Form2的StartDock事件,程式碼如下:
語法:

        DragObject = new TDragDockObjectEx(this);
        DragObject->Brush->Color = clAqua;

最後面加入:
語法:

TForm2 *TForm2::CreateDockForm(const TColor aColor)
{
        TForm2 *TCF;
        TCF = new TForm2(Application);
        TCF->Color = aColor;
        TCF->Caption = ColorToString(aColor);
        TCF->Show();

        return (TCF);
}
//---------------------------------------------------------------------------

最後修改Unit.h檔案,在 __fastcall TForm2(TComponent* Owner);下面加入
語法:

        __fastcall TForm2(TComponent* Owner, const TColor aColor);
        static TForm2 *TForm2::CreateDockForm(const TColor aColor);

<大功告成^_^>


所有時間均為台北時間。現在的時間是 03:50 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1