Untitled Document
저두 예전에 필요해서 Resize에 구현했습니다.
아마 이정도면 컴포넌트로 구현가능 하겠네요.
1. Form Create에서 각 컨트롤의 위치, 사이즈를 구조체에 기록해서 Tag에 넣고, Form 사이즈도 전역변수에 넣어둡니다.
2. Form Resize에서 초기 사이즈와 변경된 사이즈의 비율을 계산해서 곱해줍니다.
3. Form Destroy에서 Tag에 연결된 구조체를 날려줍니다.
4. 컴포넌트의 Tag를 쓰셔야 한다면 TList나 구조체배열 쓰시면 됩니다.
예제 소스입니다.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
struct SDefaultContorl{
int Width;
int Height;
int Left;
int Top;
};
int DefaultWidth;
int DefaultHeight;
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
TWinControl *winCtrl;
SDefaultContorl *defCtrl;
int i;
i = 0;
while(i < ComponentCount){
winCtrl = (TWinControl *)Components[i];
defCtrl = new SDefaultContorl;
defCtrl->Width = winCtrl->Width;
defCtrl->Height = winCtrl->Height;
defCtrl->Left = winCtrl->Left;
defCtrl->Top = winCtrl->Top;
winCtrl->Tag = (int)defCtrl;
i++;
}
DefaultWidth = Width;
DefaultHeight = Height;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormResize(TObject *Sender)
{
TWinControl *winCtrl;
SDefaultContorl *defCtrl;
int i;
int iW, iH, iL, iT;
float fZoomX, fZoomY;
i = 0;
fZoomX = float(Width) / float(DefaultWidth);
fZoomY = float(Height) / float(DefaultHeight);
while(i < ComponentCount){
winCtrl = (TWinControl *)Components[i];
defCtrl = (SDefaultContorl *)winCtrl->Tag;
iW = defCtrl->Width * fZoomX;
iH = defCtrl->Height * fZoomY;
iL = defCtrl->Left * fZoomX;
iT = defCtrl->Top * fZoomY;
if(iW < 1) iW = 1;
if(iH < 1) iH = 1;
if(iL < 1) iL = 1;
if(iT < 1) iT = 1;
winCtrl->Width = iW;
winCtrl->Height = iH;
winCtrl->Left = iL;
winCtrl->Top = iT;
i++;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormDestroy(TObject *Sender)
{
TWinControl *winCtrl;
SDefaultContorl *defCtrl;
int i;
i = 0;
while(i < ComponentCount){
winCtrl = (TWinControl *)Components[i];
defCtrl = (SDefaultContorl *)winCtrl->Tag;
delete defCtrl;
winCtrl->Tag = NULL;
i++;
}
}
//---------------------------------------------------------------------------