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

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

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

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

受付中

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

dem0nmichik0
dem0nmichik0

総合スコア0

C++Builder

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

0回答

0評価

0クリップ

42閲覧

投稿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++

//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <tchar.h> //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", Form1); //--------------------------------------------------------------------------- int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { try { Application->Initialize(); Application->MainFormOnTaskBar = true; Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //---------------------------------------------------------------------------

Unit1.cpp

C++

//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { // 実機の縦幅画面解像度 GA_JikkiWidth = Screen->Width; // 実機の横幅画面解像度 GA_JikkiHeight = Screen->Height; // 横幅の差分比率 GA_WidthRatio = (GA_JikkiWidth / DEVELOPWIDTH); // 縦幅の差分比率 GA_HeightRatio = (GA_JikkiHeight / DEVELOPHEIGHT); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormShow(TObject *Sender) { Form1->Width *= GA_WidthRatio; Form1->Height *= GA_HeightRatio; Button1->Left *= GA_WidthRatio; Button1->Top *= GA_HeightRatio; Button1->Width *= GA_WidthRatio; Button1->Height *= GA_HeightRatio; Button1->Font->Size *= GA_HeightRatio; Button2->Left *= GA_WidthRatio; Button2->Top *= GA_HeightRatio; Button2->Width *= GA_WidthRatio; Button2->Height *= GA_HeightRatio; // Button2->Font->Size *= GA_WidthRatio; Label1->Caption = "開発PCの画面解像度(Width):" + FloatToStr(DEVELOPWIDTH); Label2->Caption = "開発PCの画面解像度(Height):" + FloatToStr(DEVELOPHEIGHT); Label3->Caption = "実機PCの画面解像度(Width):" + FloatToStr(GA_JikkiWidth); Label4->Caption = "実機PCの画面解像度(Height):" + FloatToStr(GA_JikkiHeight); Label5->Caption = "横幅の差分比率:" + FloatToStr(GA_JikkiWidth) + " / " + FloatToStr(DEVELOPWIDTH) + " = " + FloatToStr(GA_WidthRatio); Label6->Caption = "縦幅の差分比率:" + FloatToStr(GA_JikkiHeight) + " / " + FloatToStr(DEVELOPHEIGHT) + " = " + FloatToStr(GA_HeightRatio); } //---------------------------------------------------------------------------

Unit1.h

C++

//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> #define DEVELOPWIDTH 1920 // 開発PCの横幅画面解像度 #define DEVELOPHEIGHT 1080 // 開発PCの縦幅画面解像度 //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE で管理されるコンポーネント TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4; TLabel *Label5; TLabel *Label6; TButton *Button1; TButton *Button2; void __fastcall FormShow(TObject *Sender); private: // ユーザー宣言 public: // ユーザー宣言 __fastcall TForm1(TComponent* Owner); float GA_JikkiWidth; // 実機PCの横幅画面解像度 float GA_JikkiHeight; // 実機PCの縦幅画面解像度 float GA_WidthRatio; // 横幅の差分比率 float GA_HeightRatio; // 縦幅の差分比率 }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif

###開発環境
OS:Windows10 Pro 64bit
IDE:Embarcadero10.3.3

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++Builder

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