>> 질문 : .으.라.차.차.(baepower)님 (
bcbdn C++Builder Q&A 14827번 )
"메인창이 뜰때 폼을 Docking상태로 뜨게 할 수 있을가요?"
처음 프로그램을 실행할때 2개 혹은 3개의 폼을 띄우고 싶습니다..
헌데 이 폼들은 메인폼에 Docking된 상태로 띄우고 싶거든요...
방법좀 알려주세요~~~ ^^
>> 답변 : 간단하게 해결할 수 있는 방법은 ManualDock 메쏘드를 사용하는 것입니다.
간단한 예제를 보여드리져.
폼하나에 패널을 두개 두고, 실행시 각 패널에 2개의 폼을 Docking 시키는 예입니다.
1. New Application을 하시구요. 기본으로 저장을 하시길.(Unit.cpp)
2. Form1 위에 Panel1, Panel2를 놓구요.
Panel1과 Panel2의 property 중 DockSite를 'true'로 합니다.
3. 이제 New Form을 두번하셔서, Form2, Form3를 생성합니다.
4. Form2, Form3의 property 중 DragKind = dkDrag, DragMode = dmManual 로 각각
설정합니다.
4. 마지막으로 Unit1.cpp 에 아래와 같이 코딩합니다.
#include "Unit1.h"
#include "Unit2.h" // 추가합니다.
#include "Unit3.h" // 추가합니다.
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
Form2->Show();
Form3->Show();
Form2->ManualDock(Form1->Panel1, NULL, alClient);
Form3->ManualDock(Form1->Panel2, NULL, alClient);
}
//---------------------------------------------------------------------------
대충 감이 오시져? 동적생성을 하셔도 되구 활용하기에 따라서 여러가지로 쓰일수
있습니다.
TControl::ManualDock
(원형) bool __fastcall ManualDock(TWinControl* NewDockSite, TControl* DropControl, TAlign ControlSide);
(상세) 수동적으로 dock 하기위해 ManualDock를 사용한다. ManualDock는 현재 도킹되어
있는 dock site로부터 control을 분리하고, 다른 dock site에 control을 도킹한다.
NewDockSite는 control의 새 dock site이다.
DropControl은 drop되는 새 dock site내의 컨트롤이다. 예를 들면 Page Control에 Docking
을 하면, DropControl은 Tab Sheet일 것이다. (Form이라도 Page Control에 Docking되면 Tab
Sheet가 되고 만다)
ControlSide는 dock될 control의 DropControl 또는 (DropControl이 NULL이라면)NewDockSite의
side를 결정한다. 이러한 값은 dock site의 GetDockEdge 메쏘드를 호출함으로써 알 수 있다.