2017-09-21 5 views
0

外部のダイアログボックスをクリッピングしないで、マウスポイントでダイアログを表示するにはどうすればよいですか?フォーム外でクリッピングを行わないダイアログを表示

たとえば、画面の右端付近にあるコントロールを右クリックすると、ダイアログが左側に表示され、コントロールが画面の下にある場合は、ダイアログの上にカーソルが表示されます。

これは私のコードです:

If e.Button = MouseButtons.Right Then 
     Dim tool = New Form2 With { 
      .Location = New Point(Cursor.Position.X, Cursor.Position.Y), 
      .WhoSend = sender 'some property 
     } 
     tool.ShowDialog() 
End If 

これは常にダイアログがウィンドウの外にクリッピングされている場合でも、カーソルの右下にダイアログが表示されます。

+0

ここで写真が役立ちます。 Expected vs actual –

+0

これは、ContextMenu/Stripが行うものです。必要に応じてメニューが画面上に完全に保持されるように移動するようにするコードがあります。また、右クリックで使用するクラスの種類。フォームにそのコードがない場合は、自分で追加する必要があります。フォームの再スケール時に正しく動作するようにLoadイベントをサブスクライブしてください。 Screenクラスはあなたに境界を与えます。 –

+0

@HansPassant私は 'ContextMenuStrip'を試しました。 'ContextMenuStrip'内の項目をクリックした後でコントロールをどのように得ることができるのですか – conquistador

答えて

0

My.Computer.Screen.Boundsを使用すると、画面の領域を取得し、それに応じて場所を設定し、フォームの位置を変更できます。

If e.Button = MouseButtons.Right Then 
    Dim ScreenBounds = My.Computer.Screen.Bounds 

    Dim tool = New Form2 With { 
     .Location = New Point(if(Cursor.Position.X + .Width > ScreenBounds.Width,ScreenBounds.Width - .Width ,Cursor.Position.X), 
          if(Cursor.Position.Y + .Height > ScreenBounds.Width,ScreenBounds.Height - .Height ,Cursor.Position.Y), 
     .WhoSend = sender 'some property 
    } 
    tool.ShowDialog() 
End If 
+0

これは私の考えでもありますが、ちょっと違います。 ' If Cursor.Position.X + tool.Width> widthまたはCursor.Position.Y + tool.Height> Height Then tool.Location = New Point(Cursor.Position.X - tool.Width、Cursor.Position.Y - tool.Height) Else tool.Location = Newポイント(Cursor.Position.X、Cursor.Position.Y) エンドIf' 鉱山メインフォームを実行するときにいくつかの問題に直面する可能性がある点に注意してくださいフルスクリーン – conquistador

+0

であるため、無関係であるフォームのサイズに基づいており、 2つのモニタを備えたコンピュータ上のアプリケーション。 @Hans Passantが述べているように、このような機能のために 'ContextMenuStrip'のようなものを使用する方が良いでしょう。すでにすべての脅威が行われているからです。 – AugustoQ

+1

正しいコードではありません。 Screen.FromRectangle()を使用して、正しいモニターを見つけます。フォームの実際のサイズを知るには、フォームのLoadイベントでこれを行うことが本当に重要です。今日のコードはdpiAwareである必要があります。 –

関連する問題