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);
}
//---------------------------------------------------------------------------

실행 예



초기 상태


확대 시


구성 요소가 겹치지 않습니다.

비율에서의 사이즈 변경 때문에, 확대시에 마진(절대치) 자체도 커진다.

좋은 웹페이지 즐겨찾기