###実現したいこと
開発PCと実機PCの画面解像度が異なってもビジュアルコントロールの位置やサイズを調整しないようにしたい。
開発PCの画面解像度:1920×1080(ずっと固定したい)
実機PCの画面解像度:1920×1080や1366×768,1024×768など
###問題点
従来は,アプリを投入する実機PCの画面解像度の種類をメーカなどに確認後,実機PCと開発PCで共通の画面解像度があればその中で最も高解像度の画面解像度にする方法をとっていました。ですがそれだと,メーカに問い合わせたりして,時間がかかるため,先行でプログラムを開発していて後で画面解像度が変わったりすると,アプリのビジュアルコントロールの位置やサイズを調整をするコストが発生しています。
###困っていること
iOSの画面比率、解像度についてのように,アプリの処理で実機PCの画面解像度を意識しないようにする方法(全解像度対応方法)はあるのでしょうか?
EmbarcaderoのHPを調べて試したことを「試したこと」に記載します。
「質問事項」
1.フォームとコントロールを動的にサイズ変更するときの考慮事項の1番目に,「定数を用いて,開発用コンピュータの画面解像度の1つの次元(高さまたは幅)をピクセル単位で指定します。TScreen.HeightプロパティまたはTScreen.Widthプロパティを用いて,実行時にユーザーのコンピューターの同じ次元のサイズを取得します。開発用コンピュータの値をユーザーのコンピュータの除算して,2代のコンピュータの画面解像度の差分比率を算出します。」とあります。
また,4番目に,「ユーザーのコンピュータよりも高い画面解像度に構成されたコンピュータ上でアプリケーションを設計した場合は,ビジュアルコントロールのサイズ変更時にフォントサイズも縮小されます。設計時のフォントサイズが小さすぎると,実行時にサイズ変更したフォントが読めなくなる場合がります。たとえば,フォームのデフォルトフォントサイズは8です。開発用コンピュータの画面海王度が1024×768で,ユーザーのコンピュータが640×480の場合,ビジュアルコントロールのサイズは係数0.625(640/1024=0.625)をかけて縮小されます。元のフォントサイズ8は5(8×0.625=5)になります。アプリケーション内のテキストはフォントサイズが小さく表示されつぶれて読めなくなります。」と記載があります。
上記の記載に関して
1.1.差分比率の算出方法は,「開発PCの画面解像度を実機PCの画面解像度で除算するのか?」それとも「実機PCの画面解像度を開発PCの画面解像度で除算するのか?」が分からなくて困っています。1番目だと,前者と記載がありますし,4番目だと後者で計算しています。
1.2.1番目に「定数を用いて,開発用コンピュータの画面解像度の1つの次元(高さまたは幅)をピクセル単位で指定します。」とありますが,高さまたは横の差分比率が異なった場合,どちらを使うべきかわからなくて困っています。図2のように,開発PCは1920×1080で,実機PCは1024×768の場合,横幅の差分比率が「約0.53」,縦幅の差分比率が「約0.71」でどちらを使えばよいのでしょうか?
2.図1のボタンのフォントのデフォルトサイズは8です。縦幅の差分比率である1をボタン1のフォントサイズにかけても変わらないはずなのになぜ,変わるのでしょうか?ボタン2のフォントサイズと変わっているように見えます(わざとボタン2のフォントサイズは変更していません)
###試したこと
画面解像度と色深度の2番目を試してみようと思い,フォームとコントロールを動的にサイズ変更するときの考慮事項を参考にし,実行時に「開発PCの解像度と実機PCの解像度が比例するように,フォームと全てのビジュアルコントロールのサイズを画面解像度の違いの比率に合わせて調整する」手法を試してみました。
###ソースコード
Project1.cpp
C++
1//--------------------------------------------------------------------------- 2 3#include <vcl.h> 4#pragma hdrstop 5#include <tchar.h> 6//--------------------------------------------------------------------------- 7USEFORM("Unit1.cpp", Form1); 8//--------------------------------------------------------------------------- 9int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 10{ 11 try 12 { 13 Application->Initialize(); 14 Application->MainFormOnTaskBar = true; 15 Application->CreateForm(__classid(TForm1), &Form1); 16 Application->Run(); 17 } 18 catch (Exception &exception) 19 { 20 Application->ShowException(&exception); 21 } 22 catch (...) 23 { 24 try 25 { 26 throw Exception(""); 27 } 28 catch (Exception &exception) 29 { 30 Application->ShowException(&exception); 31 } 32 } 33 return 0; 34} 35//---------------------------------------------------------------------------
Unit1.cpp
C++
1//--------------------------------------------------------------------------- 2 3#include <vcl.h> 4#pragma hdrstop 5 6#include "Unit1.h" 7//--------------------------------------------------------------------------- 8#pragma package(smart_init) 9#pragma resource "*.dfm" 10TForm1 *Form1; 11//--------------------------------------------------------------------------- 12__fastcall TForm1::TForm1(TComponent* Owner) 13 : TForm(Owner) 14{ 15 // 実機の縦幅画面解像度 16 GA_JikkiWidth = Screen->Width; 17 // 実機の横幅画面解像度 18 GA_JikkiHeight = Screen->Height; 19 // 横幅の差分比率 20 GA_WidthRatio = (GA_JikkiWidth / DEVELOPWIDTH); 21 // 縦幅の差分比率 22 GA_HeightRatio = (GA_JikkiHeight / DEVELOPHEIGHT); 23} 24//--------------------------------------------------------------------------- 25void __fastcall TForm1::FormShow(TObject *Sender) 26{ 27 Form1->Width *= GA_WidthRatio; 28 Form1->Height *= GA_HeightRatio; 29 30 Button1->Left *= GA_WidthRatio; 31 Button1->Top *= GA_HeightRatio; 32 Button1->Width *= GA_WidthRatio; 33 Button1->Height *= GA_HeightRatio; 34 Button1->Font->Size *= GA_HeightRatio; 35 36 Button2->Left *= GA_WidthRatio; 37 Button2->Top *= GA_HeightRatio; 38 Button2->Width *= GA_WidthRatio; 39 Button2->Height *= GA_HeightRatio; 40// Button2->Font->Size *= GA_WidthRatio; 41 42 43 Label1->Caption = "開発PCの画面解像度(Width):" + FloatToStr(DEVELOPWIDTH); 44 Label2->Caption = "開発PCの画面解像度(Height):" + FloatToStr(DEVELOPHEIGHT); 45 Label3->Caption = "実機PCの画面解像度(Width):" + FloatToStr(GA_JikkiWidth); 46 Label4->Caption = "実機PCの画面解像度(Height):" + FloatToStr(GA_JikkiHeight); 47 Label5->Caption = "横幅の差分比率:" + FloatToStr(GA_JikkiWidth) + " / " + 48 FloatToStr(DEVELOPWIDTH) + " = " + FloatToStr(GA_WidthRatio); 49 Label6->Caption = "縦幅の差分比率:" + FloatToStr(GA_JikkiHeight) + " / " + 50 FloatToStr(DEVELOPHEIGHT) + " = " + FloatToStr(GA_HeightRatio); 51} 52//---------------------------------------------------------------------------
Unit1.h
C++
1//--------------------------------------------------------------------------- 2 3#ifndef Unit1H 4#define Unit1H 5//--------------------------------------------------------------------------- 6#include <System.Classes.hpp> 7#include <Vcl.Controls.hpp> 8#include <Vcl.StdCtrls.hpp> 9#include <Vcl.Forms.hpp> 10 11#define DEVELOPWIDTH 1920 // 開発PCの横幅画面解像度 12#define DEVELOPHEIGHT 1080 // 開発PCの縦幅画面解像度 13//--------------------------------------------------------------------------- 14class TForm1 : public TForm 15{ 16__published: // IDE で管理されるコンポーネント 17 TLabel *Label1; 18 TLabel *Label2; 19 TLabel *Label3; 20 TLabel *Label4; 21 TLabel *Label5; 22 TLabel *Label6; 23 TButton *Button1; 24 TButton *Button2; 25 void __fastcall FormShow(TObject *Sender); 26private: // ユーザー宣言 27public: // ユーザー宣言 28 __fastcall TForm1(TComponent* Owner); 29 30 float GA_JikkiWidth; // 実機PCの横幅画面解像度 31 float GA_JikkiHeight; // 実機PCの縦幅画面解像度 32 float GA_WidthRatio; // 横幅の差分比率 33 float GA_HeightRatio; // 縦幅の差分比率 34}; 35//--------------------------------------------------------------------------- 36extern PACKAGE TForm1 *Form1; 37//--------------------------------------------------------------------------- 38#endif
###開発環境
OS:Windows10 Pro 64bit
IDE:Embarcadero10.3.3
あなたの回答
tips
プレビュー