使用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)元件的屬性如下:
再新增一個表單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);
<大功告成^_^>
|