C++ Builder XE4 > Form > 폼의 구성 요소 배치 비율로
16257 단어 geometrycppBuilder
C++ Builder XE4
구성 요소의 자동 배치
구성 요소의 자동 배치로 Anchors 속성이 있습니다.
Anchors 속성의 akLeft, akTop, akRight, akBottom을 모두 True로 하면, 폼 확대시에 폼 사이즈에 맞추어 컴퍼넌트 사이즈가 변경된다.
그러나, 이것은 "절대값"에서의 변경이며, 복수의 컴포넌트가 존재하는 경우에 희망하는 동작이 되지 않는다.
초기 상태
확대 시
배치를 비율로 수행
배치를 「절대치」가 아니라 「비율」로 실시해 보자.
code
Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE で管理されるコンポーネント
TStringGrid *StringGrid1;
TStringGrid *StringGrid2;
TStringGrid *StringGrid3;
void __fastcall FormResize(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall FormShow(TObject *Sender);
private: // ユーザー宣言
void __fastcall registerComponents(TForm *formPtr, TControl *ctlPtr);
void __fastcall releaseComponents(void);
void __fastcall resizeWithRatio(void);
TList *m_ctlList; // 位置情報の構造体リスト
struct POSI_RATIO { // 位置情報の構造体
TControl *ctlPtr;
double left;
double top;
double width;
double height;
};
public: // ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
m_ctlList = new TList();
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
releaseComponents();
m_ctlList->Clear();
delete m_ctlList;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::registerComponents(TForm *formPtr, TControl *ctlPtr)
{
POSI_RATIO *posRat;
posRat = new POSI_RATIO;
posRat->ctlPtr = ctlPtr;
posRat->left = (double)ctlPtr->Left / formPtr->Width;
posRat->top = (double)ctlPtr->Top / formPtr->Height;
posRat->width = (double)ctlPtr->Width / formPtr->Width;
posRat->height = (double)ctlPtr->Height / formPtr->Height;
m_ctlList->Add(posRat);
}
void __fastcall TForm1::releaseComponents(void)
{
POSI_RATIO *posRat;
if (m_ctlList == NULL) {
return;
}
for(int idx=0; idx < m_ctlList->Count; idx++) {
posRat = (POSI_RATIO *)m_ctlList->Items[idx];
delete posRat;
}
}
void __fastcall TForm1::resizeWithRatio(void)
{
POSI_RATIO *posRat;
for(int idx=0; idx < m_ctlList->Count; idx++) {
posRat = (POSI_RATIO *)m_ctlList->Items[idx];
posRat->ctlPtr->Left = posRat->left * this->Width;
posRat->ctlPtr->Top = posRat->top * this->Height;
posRat->ctlPtr->Width = posRat->width * this->Width;
posRat->ctlPtr->Height = posRat->height * this->Height;
}
}
void __fastcall TForm1::FormResize(TObject *Sender)
{
resizeWithRatio();
}
void __fastcall TForm1::FormShow(TObject *Sender)
{
registerComponents(this, this->StringGrid1);
registerComponents(this, this->StringGrid2);
registerComponents(this, this->StringGrid3);
}
//---------------------------------------------------------------------------
실행 예
초기 상태
확대 시
구성 요소가 겹치지 않습니다.
비율에서의 사이즈 변경 때문에, 확대시에 마진(절대치) 자체도 커진다.
Reference
이 문제에 관하여(C++ Builder XE4 > Form > 폼의 구성 요소 배치 비율로), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/304d39fbfcf9e4274777텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)