20

アプリケーションがDelphiまたはC++Builderで表示されるモニターを指定する方法はありますか?

私は、ホスピタリティシステムによって生成されたキッチンの注文をセカンダリモニターに表示する、顧客向けの簡単なプログラムを開発しています。現在、ウィンドウが起動した後、手動でウィンドウを2番目のモニターにドラッグする必要があります。

4

7 に答える 7

28

グローバルな Screen オブジェクト (フォームの一部) には、モニターの概念があります。これは Delphi 6 または 7 の頃に追加されたと思います。次のコードが機能します。

// Put the form in the upper left corner of the 2nd monitor
//   if more then one monitor is present.
if Screen.MonitorCount > 1 then
begin
  Left := Screen.Monitors[1].Left;
  Top := Screen.Monitors[1].Top;
end;

その位置からの正のオフセットを使用して、そのモニターの任意の場所に配置できます。そこから幅と高さを取得して、寸法を知ることもできます。

于 2008-10-15T21:55:17.657 に答える
23

プログラムのシャットダウン前にウィンドウの位置を保存し、起動時に復元します。マルチモニター ディスプレイは、デスクトップのサイズを大きくするだけです。他のモニター サーフェスには、同じ X/Y 平面の別のセクションがあり、その原点はプライマリ モニターの左上にあります。

これは、いくつかのコンポーネントのいずれかによって自動的に行われます。

ところで、Forms ユニットの Screen 変数には、MonitorCount というプロパティと、別のインデックス可能なプロパティ Monitors[Index: Integer]: TMonitor があります。TMonitor には、左、上、幅、高さなどを示すプロパティがあるため、必要な情報はすべてそこにあります。

于 2008-10-15T21:11:56.977 に答える
2
procedure TMDIChild.btnShowMonClick(Sender: TObject);
begin
    if Screen.MonitorCount > 1 then
    begin
      FormShow.Left:=Screen.Monitors[1].Left;
      FormShow.Top:=Screen.Monitors[1].Top;
      FormShow.Width:=Screen.Monitors[1].Width;
      FormShow.Height:=Screen.Monitors[1].Height;
    end
    else
    begin
        FormShow.Show;
    end;
end;
于 2011-02-15T07:51:19.447 に答える
1

あなたの質問が意味する答えではありませんが、アプリケーションが閉じられるたびにウィンドウ設定 (サイズ、位置、最大化された状態) を保存し、起動時に適用することはできませんか?

于 2008-10-15T20:52:01.900 に答える
-2

Delphi 5で少し前に同様のことをしました:

procedure TForm18.FormCreate(Sender: TObject);
var
  Mon: TMonitor;
  MonitorIdx: Integer;
begin
  MonitorIdx := 1; // better read from configuration
  if (MonitorIdx <> Monitor.MonitorNum) and (MonitorIdx < Screen.MonitorCount) then begin
    Mon := Screen.Monitors[MonitorIdx];
    Left := Left + Mon.Left - Monitor.Left;
    Top := Top + Mon.Top - Monitor.Top;
  end;
end;
于 2008-10-16T15:46:38.210 に答える
-3

Windows では、CreateWindow API 呼び出しでウィンドウの座標を指定できます。プロセスのその部分にアクセスできるかどうかを知るには、Delphi や C++Builder について十分な知識がありません。

WM_CREATE ハンドラーでウィンドウを移動できる場合もあります。

EnumDisplayMonitors は、システム内の各モニターの座標を提供します。


明らかに、Delphi と C++ Builder には、この回答をやや無関係にする機能があります。誰かがこの質問に遭遇したが、別の環境で回答が必要な場合に備えて、ここに残しておきます。

于 2008-10-15T20:51:43.260 に答える
-6

私は Windows システムをあまり扱っていないので、このようなハックをお勧めします。

表示可能なデスクトップの幅 (両方のモニターを合わせたもの) を取得し、それを半分に分割して、それを開始位置にします。

また、api が monitor2 のディメンションを通知する内容を調べることもできます。

于 2008-10-15T20:50:03.700 に答える