Help us understand the problem. What is going on with this article?

C++ Builder XE4 > geometry > 右配置のTEditのフォントサイズを拡大時、左配置のTChartを残りスペースで描画するサイズに落とす > ScaleBy()での処理

More than 1 year has passed since last update.
動作環境
C++ Builder XE4

関連

上記の処理は自動計算部分が煩雑であり、コンポーネントが多数ある場合には向かない処理である。

下記で別方法を掲示する。

処理概要

  • ボタン押下時、TChart以外を拡大する
    • SVGA, 4K UHD対応を視野に入れて
  • ScaleBy()を使い、パネルのサイズを変更する
    • それに伴い、パネル上のコンポーネントは自動的に拡大される

v0.1 > 拡大ボタンでの処理

フォームデザイン

Anchorsを下記のようにして、フォームサイズの変更に対応できるようにしている。
(フォームサイズを拡大縮小時、グラフサイズが拡大縮小するようにしている)

  • PNL_topLeft
    • akLeft, akTop, akRight
  • Chart1
    • akLeft, akTop, akRight, akBottom
  • B_large
    • askTop, askRight
  • akTop, akRight, akBottom

実装

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

static float s_curFactor = 1.0; // 拡大率

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_largeClick(TObject *Sender)
{
    int preH = this->Height;
    int preW = this->Width;

    this->ScaleBy(100 / s_curFactor, 100); // 拡大率を使って拡大するため、一旦1.0の倍率に戻す

    s_curFactor *= 1.10;

    this->ScaleBy(100 * s_curFactor, 100);

    // 元の高さ、幅に戻すことで、パネルのコンポーネントのサイズだけを拡大できる
    // (結果として、TChartは小さくなる)
    this->Height = preH;
    this->Width = preW;
}
//---------------------------------------------------------------------------

結果

起動直後

2018-10-22_13h03_52.png

B_largeボタンを3回クリック後
2018-10-22_13h04_38.png

さらにB_largeボタンを3回クリック後
2018-10-22_13h05_14.png

備考

  • ScaleBy()での処理なので、フォントが汚くなる
    • フォントが汚いのを避けたい場合は、他の方法を考案すること

v0.2 > TComboBoxでのサイズ指定

実装

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

static float s_curFactor = 1.0; // 拡大率

enum {
    FONT_SMALL = 0,
    FONT_MEDIUM,
    FONT_LARGE,
    FONT_EXTRA_LARGE,
    FONT_HUGE,
};

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CMB_fontSizeChange(TObject *Sender)
{

    int preH = this->Height;
    int preW = this->Width;

    this->ScaleBy(100 / s_curFactor, 100); // 拡大率を使って拡大するため、一旦1.0の倍率に戻す

    switch(CMB_fontSize->ItemIndex){
    case FONT_SMALL:
        s_curFactor = 1.00; // 結果を見て調整する
        break;
    case FONT_MEDIUM:
        s_curFactor = 1.20; // 結果を見て調整する
        break;
    case FONT_LARGE:
        s_curFactor = 1.40; // 結果を見て調整する
        break;
    case FONT_EXTRA_LARGE:
        s_curFactor = 1.60; // 結果を見て調整する
        break;
    case FONT_HUGE:
        s_curFactor = 1.80; // 結果を見て調整する
        break;
    }

    this->ScaleBy(100 * s_curFactor, 100);

    // 元の高さ、幅に戻すことで、パネルのコンポーネントのサイズだけを拡大できる
    // (結果として、TChartは小さくなる)
    this->Height = preH;
    this->Width = preW;

}
//---------------------------------------------------------------------------

結果

Small選択時 (起動直後)

2018-10-22_13h40_34.png

Large選択時
2018-10-22_13h41_19.png

Huge選択時
2018-10-22_13h41_53.png

備考

  • 全画面表示で実行すると位置計算を失敗する
    • FontSizeのTComboBoxが行方不明になる
  • 拡大縮小を繰返すうちに、ボタンのサイズが意図より小さくなる
    • 誤差が蓄積するのかもしれない

v0.3 > 拡大、縮小を繰返した場合の誤差の抑止

v0.2のコードでは拡大・縮小を繰返した場合、ボタンの横幅が小さくなるなどの誤差が顕著に見られる。

その対策として以下の変更をすると誤差が小さくなるようだ。

//  this->ScaleBy(100 / s_curFactor, 100); // 拡大率を使って拡大するため、一旦1.0の倍率に戻す
    this->ScaleBy(100, 100 *s_curFactor); // 拡大率を使って拡大するため、一旦1.0の倍率に戻す
7of9
セブンオブナインです。Unimatrix 01の第三付属物 9の7という識別番号です。Star trek Voyagerの好きなキャラクターです。まとめ記事は後日タイトルから内容がわからなくなるため、title検索で見つかるよう個々の記事にしてます。いわゆるBorg集合体の有名なセリフから「お前たち(の知識)を吸収する。抵抗は無意味だ」。Thanks in advance.
qiitadon
Qiitadon(β)から生まれた Qiita ユーザー・コミュニティです。
https://qiitadon.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした