質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

Q&A

0回答

1071閲覧

開発PCの画面解像度は固定で実機PCの全画面解像度に対応するアプリを作りたい,処理の作り方を知りたい

dem0nmichik0

総合スコア37

C++Builder

C++Builderは、C/C++を用いてアプリ開発できる統合開発環境 (IDE) 。DelphiのC++版です。コンポーネントによるビジュアル開発、高機能なコードエディターなどで生産性の高い開発ができます。

0グッド

0クリップ

投稿2020/01/11 03:13

###実現したいこと
開発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の解像度が比例するように,フォームと全てのビジュアルコントロールのサイズを画面解像度の違いの比率に合わせて調整する」手法を試してみました。

イメージ説明
図1 実機の解像度 1920×1080

イメージ説明
図2 実機の解像度 1366×768

イメージ説明
図3 実機の解像度 1024×768

###ソースコード
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問