2017-08-30 12 views
-2

私は、モニタの設定にもかかわらず、特定のマウス位置でフォームを開くように配置する方法を理解しようとしています。フォームのOnCreate場合にDelphiのカーソル位置にフォームを開く

、私はこの持っている:私は2台のモニタを有する場合

procedure TSplashScreen.FormCreate(Sender: TObject); 
Var 
    oMousePos: TPoint; 
    nLeft, nTop: Integer; 
begin 
    Scaled := false; 
    PixelsPerInch := Screen.PixelsPerInch; 
    Scaled := true; 
    //Position:=poScreenCenter; 

    //center form for 2nd monitor //zzz 
    if (Screen.MonitorCount > 1) then        //zzz 
    begin 
     GetCursorPos(oMousePos); 
     if (oMousePos.X > Screen.Width) or (oMousePos.X < 0) then 
     begin 
     Self.Position := poDesigned; 
     nLeft := Screen.Monitors[1].Left + Round(Screen.Monitors[1].Width/2) - Round(Self.Width/2); 
     nTop := Screen.Monitors[1].Top + Round(Screen.Monitors[1].Height/2) - Round(Self.Height/2); 
     Self.Left := nLeft; 
     Self.Top := nTop; 
     end; 
    end; 
end; 

を、そして1モニタがプライマリモニタとして設定され、フォームは、マウスカーソルで開きます。

しかし、私は主に2を監視している場合、フォームモニターには常にオープン2.

+1

'Mouse.CursorPos'はすでにあなたがどんな計算をせずに必要な正確な位置を保持する必要がありますが...また、フォームの' Position'ものですに設定? –

+1

ここには奇妙なものがあります。 ScaledとPixelsPerInchを使いこなすのは本当に奇妙です。ディスプレイが拡張されたときにカーソル位置を見るだけが奇数である。 Screen.Widthと0に対するテストは奇数です。モニタ番号1が何らかの形で特別であると仮定すると、奇数です。整数演算ではなく浮動小数点演算を使うことは奇妙です。実際に何をしようとしていますか?非常に多くの問題を抱えているこのコードでは、なぜそれをデバッグしないようにしましたか?私はデバッグのスキルがどれほど重要かを強調することはできません。それを学んでください。期待どおりに動作しないときは、コードをあきらめないでください。デバッグ。 –

+0

"これはメインフォームの初期化セクションで呼び出されます。"私は確かに望んでいない。 'initialization'セクションにはまだフォームのコンテキストがありません。このセクションは、フォームが作成される前に実行されます。 –

答えて

5

あなただけのWin32を使用して、マウスカーソルがに現在ある同じモニター上のフォームを配置する場合(VCLのTScreen.MonitorFromPoint()方法でラップされている)API MonitorFromPoint()機能、例えば:

procedure TSplashScreen.FormCreate(Sender: TObject); 
var 
    r: TRect; 
begin 
    if (Screen.MonitorCount > 1) then 
    begin 
    r := Screen.MonitorFromPoint(Mouse.CursorPos).WorkareaRect; 
    Self.Position := poDesigned; 
    Self.Left := r.Left + ((r.Width - Width) div 2); 
    Self.Top := r.Top + ((r.Height - Height) div 2); 
    { alternatively: 
    Self.SetBounds(
     r.Left + ((r.Width - Width) div 2), 
     r.Top + ((r.Height - Height) div 2), 
     Width, Height); 
    } 
    end else begin 
    Self.Position := poScreenCenter; 
    end; 
end; 
+0

完璧!そして私が継承した恐ろしいコードで私を叩いてくれてありがとう! –

関連する問題