2017-09-21 7 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

사진은 여기에 도움이 될 것이다. 실제 –

+0

대 예상이의 ContextMenu/지구가하는 일의 종류이다. 필요한 경우 메뉴가 화면에 완전히 유지되도록 코드가 이동되도록하는 코드가 있습니다. 또한 마우스 오른쪽 버튼으로 사용할 클래스의 종류. 양식에 해당 코드가 없으면 직접 추가해야합니다. 폼이 재조정 될 때 여전히 올바르게 작동하도록 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> 너비 또는 커서. 위치 .Y + tool.Height> 높이 다음 tool.Location = New Point (Cursor.Position.X - tool.Width, Cursor.Position.Y - tool.Height) tool.Location = New Point (Cursor.Position.X, Cursor.Position.Y) End If' 광산은 양식 크기를 기반으로합니다. 주 양식이 전체 화면이기 때문에 관련이 없습니다. – conquistador

+0

을 실행할 때 몇 가지 문제가 발생할 수 있습니다. 2 대의 모니터가있는 컴퓨터의 응용 프로그램. @Hans Passant가 말했듯이, 이미 모든 위협이 완료되었으므로 그러한 기능을 위해 ContextMenuStrip과 같은 것을 사용하는 것이 더 낫습니다. – AugustoQ

+1

맞습니다. 올바른 코드가 아닙니다. Screen.FromRectangle()을 사용하여 올바른 모니터를 찾으십시오. 그리고 양식의 실제 크기를 알 수 있도록 폼의 Load 이벤트와 함께이 일을 정말, 정말 중요합니다. 오늘 코드는 dpiAware가되어야합니다. –