Windowsは複数のモニターを仮想デスクトップにマッピングでき、これを使用して作業しやすいアプリケーションを設計できるようにします。たとえば、PowerPointはデュアルモニターの利点を完全に利用しています(ほとんどのラップトップはそれをサポートしています)。 。では、そのようなアプリケーションをどのように開発するのでしょうか?この記事では、Delphiを使用して複数のモニターを使用してアプリケーションを実装するかどうかを示します。
Windowsはクローニングディスプレイメソッドもサポートし、各モニターは同じコンテンツを出力します。これは、一部のアプリケーションにとって理にかなっています。一部のグラフィックカードは2つのモニターもサポートしていますが、真にマルチディスプレイではありませんが、仮想高解像度のディスプレイモード(2048×768または1024×1536など)は、グラフィックスターを介して2つのモニターに表示されます。これらの2つのディスプレイモードはどちらもこの記事で紹介されているZhongdianではなく、それらも非常にシンプルであるため、再び繰り返しません。
Windowsは最大10個のモニターをサポートし、Windowsはすべてのモニターを大きな仮想デスクトップにマッピングします。ディスプレイは、デスクトップの部分的なビューとして理解できます。これらのディスプレイは、ディスプレイの物理的な位置に応じて、ディスプレイプロパティに任意に配置できます。モニターが不規則に配置されている場合、仮想デスクトップの一部はどちらのモニターにも表示されない場合があります。 2つのモニターの間にフォームを表示しないようにするために、Windowsはメインモニターとしてディスプレイを使用します。コンピューターが起動すると、メインモニターに[ログイン]ダイアログボックスが表示されます。ほとんどのプログラムスタートアップディスプレイは、メインモニターに表示されます。
上記の紹介によると、デスクトップ、モニター、メインモニターなど、いくつかの重要な概念を見つけることは難しくありません。まず、これらの概念と以前の関係を最初に把握する必要があります。これは、マルチディスプレイアプリケーションの開発方法を習得するための鍵です。これらの概念を理解すると、他の部分は非常に簡単に理解できます。
デスクトップとは、実際にWindowsが表示できる論理領域を指します。実際、フォームをデスクトップの外側に表示できます。ただし、これは、デスクトップのすべての部分が特定のモニターに表示されることを意味するものではありませんが、逆に、モニターによって表示されるコンテンツはデスクトップの一部でなければなりません。
デスクトップは、頂点座標(上、左)と幅と高さによってデスクトップのサイズを記述する長方形の領域です。なぜまだ頂点座標が必要なのですか?頂点座標は当たり前の(0,0)と見なされていないためです。では、(0,0)はどこですか?それは長い話ですので、最初に今言及された概念、つまりメインモニターをレビューしましょう。 Windowsは、一般的なプログラムが最初にメインモニターに表示されることを望んでいます。これは、人々が最も近いモニターに注意を払うことに慣れているためです。 Windowsは、ユーザーにメインモニターとして左端のモニターを使用するように強制することができないため、アプリケーションはメインモニターに表示するために計算を心配する必要があります。ただし、ほとんどのユーザーは1つのモニターしか持っておらず(2つのモニターがスペースを占有しすぎています)、通常のアプリケーションは、メインモニターがどこにあり、どこに表示されるかを計算するために多くの努力を費やしたくありません。そのため、Windowsは合理的なソリューションを提案します。メインディスプレイの頂点座標を座標系の原点として使用します。このようにして、通常のプログラムは、単一のモニター環境で問題を考慮する必要があります。
モニターは、デスクトップの部分的なビューです。窓から窓の外の景色を見て、さまざまな窓の前に立って、さまざまな写真を見ることができます。同様に、ディスプレイは長方形の領域でもあり、その寸法は頂点座標(上、左)と幅と高さによっても説明できます。頂点座標は、デスクトップ座標系の起源、つまりメインディスプレイの頂点に関連しています。
ワークスペースの概念は、タスクバーやデスクトップにドッキングされた他のフォームを除いて、モニター内の長方形の領域を指します。
Windowsは、マルチディスプレイアプリケーションの開発のための一連のAPIを提供します。 VCLはこれらのAPIをカプセル化し、フレームワーク全体に非常に自然に統合するため、マルチディスプレイアプリケーションを非常に簡単に開発できます。以下は関連コンテンツです。
最も馴染みのあるVCLは、おそらくすべてのフォームのベースクラスであるTCustomFormです。 Tcustomformの位置プロパティは、オプションの値の2つの位置を設定するために使用されます。メインディスプレイのポデストップセントターは、ポデスクトップセンターに設定されています。このプロパティがPodeskTopcenterに設定され、プログラムが複数のモニターを備えたシステムで実行される場合、このウィンドウは2つのモニターの間に表示され、ユーザーに不必要なトラブルを引き起こします。したがって、私たちのプログラムがマルチディスプレイ用に設計されていなくても、この値は慎重に処理する必要があります。別のプロパティはdefaultMonitorであり、位置と同様の関数があり、最初に表示されるウィンドウを監視する監視を決定します。 Dmdesktop、dmprimary、dmmainform、およびdmactiveformの4つの代替値があります。それらの意味は次のとおりです。
価値 | 意味 |
dmdesktop | 特別な治療はありません |
dmprimary | 最初のモニターにフォームを表示します。これは別のトラップであり、文字通りメインモニターであり、実際にはScreen.Monitor [0]モニターを指します。 |
dmmainform | メインフォームが配置されている場所にフォームをモニターに表示します |
dmactiveform | アクティブフォームがデスクトップにある場所にフォームをモニターに表示します |
Tcustomformには、読み取り専用の共通プロパティ(公開なし)モニターもあります。これは、フォームが配置されているディスプレイインスタンスにアクセスするための参照を提供します。
では、異なるディスプレイ間でフォームをどのように移動しますか?これは難しくありません、おそらくあなたもそれについて考えました。ここに2つの方法があります。
まず、TCustomFormの上部と左を設定して、デスクトップのどこにでもフォームを表示できます。前述のように、デスクトップはすべてのモニターで構成されています。それらには共通の座標系があるため、ディスプレイの論理的位置に基づいてフォームの位置を決定できます。現在の問題は、各モニターの論理的位置とサイズをどのように取得するかです。これは後で紹介されます。
第二に、TCustomFormの過度に魅力的な方法を呼び出して、指定されたディスプレイにフォームを完全に表示できます。この方法は、ウィンドウが2つのモニターのそれぞれの一部を表示しないようにするために使用できます。
質問をしました:各モニターの論理的位置とサイズを取得する方法。この質問に答えるには、別のカテゴリを紹介する必要があります:tscreenとtmonitor。
Tscreenは、ディスプレイデバイスに関連するいくつかの情報を説明しており、主にディスプレイの論理的位置とサイズに関連する情報に関係しています。他の側面は、Delphiの文書に記載されています。プログラムが実行されているとき、VCLはグローバル変数であるTscreenのインスタンスを自動的に作成するため、通常、プログラムはTscreenをインスタンス化する必要はありません。
Tscreenには、デスクトップ*のような形状のプロパティのセットがあり、デスクトップ全体のサイズと各頂点の座標を記述しています。また、マルチモニターアプリケーションの開発に非常に重要な多くのプロパティがあります:MonitorCountおよびMonitors。これらの2つのプロパティを通じて、システム内のモニター(Tmonitors)のすべてのインスタンスを列挙できます。
Tscreenの多くの特性の中には、高さと幅という2つのプロパティがあります。デスクトップ全体のサイズではなく、メインディスプレイの高さと幅に言及することに特に注意してください。これは、デスクトップ全体のサイズを考えることができないという幻想的に感じることができる非常に簡単です。同様に、メインディスプレイの作業領域のサイズと各頂点の座標を説明するような形状のプロパティのセットがあります。何かが欠けていると思いますか?メインモニターの相対位置のプロパティが取得されないのはなぜですか?その理由は前述のとおりです。Windowsは、メインモニターの左上隅を座標系の原点として使用するため、メインモニターの相対位置は(0、0)でなければなりません。
これらのプロパティに加えて、Tscreenの3つのメンバー関数、MonitorFrompoint、MonitorFromRect、MonitorfromWindowも紹介します。名前が示すように、それらは、座標、特定の領域、および特定のウィンドウが配置されているディスプレイのインスタンスです。また、実際の開発にも使用される場合があります。
最高、Tmonitorクラスを見てみましょう。物理ディスプレイの関連するプロパティ、つまりすべて読み取り専用です。次の表は、これらのプロパティの意味を簡単に説明しています。これは、マルチディスプレイアプリケーションを作成するのに非常に役立ちます。
財産 | 説明します |
ハンドル | このモニターのWindowsハンドルを取得します |
モニトルナム | モニター番号を取得します |
主要な | モニターがメインモニターであるかどうかを取得します。そして、1つのモニターのみを備えたプライマリは真です。 |
トップ | モニターの上限を取得します |
左 | モニターの左の境界を取得します |
身長 | モニターの高さを取得します |
幅 | モニターの幅を取得します |
BoundsRect | モニターの対応するデスクトップ領域を取得します。これは上記の4つのプロパティに相当します |
workarearect | モニターのワークスペースのデスクトップに対応する領域を取得します。 |
TscreenとTmonitorを明確に理解した後、以前の問題は自然に解決されます。この時点までに、この記事は、マルチディスプレイアプリケーションを開発するために必要なすべての知識をカバーしています。この知識を使用して、非常に実用的なソフトウェア製品を開発できると思います。
付録:デモをダウンロードして、この記事を理解するのに役立ちます。