2012-04-19 2 views
6

Form의 ClientRectangle's "0,0"이 아니라 Control의 위치를 ​​폼의 위치와 관련하여 제공하는 속성을 찾고 있습니다.컨트롤의 위치를 ​​폼의 위치를 ​​기준으로 가져 오는 방법은 무엇입니까?

물론 모든 것을 화면 좌표로 변환 할 수 있지만 더 직접적인 방법이 있는지 궁금합니다.

+0

_control 's location_이 (가) 원하는 커서의 위치는 무엇입니까? – uday

+0

@uDaY 의미 : 화면 좌표입니다. 폼이 100,100이고 컨트롤이 150,350 인 경우 50,250을 얻고 싶습니다. – ispiro

+0

조심해 : http://stackoverflow.com/questions/8838621/how-to-determine-actual-windows-form-size-with-all-nonclient-elements-when-run –

답변

2

대답은 직접적인 방법이 없다는 것입니다. 기술적으로는 질문의 세부 사항을 주어 올바른 (내가 화면 좌표를 사용하는 것보다 방법 다른 찾고 있어요 질문에 명시된 바와 같이.)

9

화면 좌표로 변환 한 다음 수학을 수행해야합니다.

Point controlLoc = form.PointToScreen(myControl.Location); 

폼의 위치를 ​​화면 좌표 이미. 이제

: 당신 폼의 클라이언트 영역에 위치 폼의 왼쪽 위 모서리를 기준으로하기보다는 상대를 줄 것이다

Point relativeLoc = new Point(controlLoc.X - form.Location.X, controlLoc.Y - form.Location.Y); 

.

+0

답장을 보내 주셔서 감사합니다. 그러나 질문에 썼 듯이 화면 좌표를 확인하는 것보다 직접적인 방법을 찾고 있습니다. – ispiro

+1

@ispiro : 직접적인 방법은 내장되어 있지 않습니다. 당신은 쉽게 그 논리를 당신이 부를 수있는 작은 기능으로 포장 할 수 있습니다. 또는 폼이 처음 표시 될 때'form.PointToScreen (new Point (0, 0))'을 호출하고 결과를 저장 한 다음 원하는 경우 X 및 Y 값을 컨트롤의 Location에 추가하면됩니다. 창 상대 좌표를 얻으십시오. –

+0

마지막 코멘트에 관해서. 나는 폼의 클라이언트 영역 위치를 얻기 위해'PointToScreen'을 호출하고, 위치의 X와 Y 값을 빼서 오프셋을 얻는다는 의미였습니다. 미안합니다. 입력의 경우 –

3

귀하의 질문에 대한 답변입니다. "this"는 형식입니다.

Rectangle screenCoordinates = control.Parent.ClientToScreen(control.ClientRectangle); 
Rectangle formCoordinates = this.ScreenToClient(screenCoordinates); 
+0

답장을 보내 주셔서 감사합니다. 그러나 질문에 썼 듯이 화면 좌표를 확인하는 것보다 직접적인 방법을 찾고 있습니다. 입력에 대해 – ispiro

+0

+1. – ispiro

1

선택한 답변입니다 : 같은 속성이하는 .NET 프레임 워크에 존재하지 않습니다.

그런 속성을 원한다면 트릭을 수행 할 컨트롤 확장이 있습니다. 예, 화면 좌표를 사용하지만 게시물 제목의 일반 특성을 고려할 때이 페이지에있는 일부 사용자는 유용 할 것입니다.

덧붙여서, 모든 제어 부모를 반복하여 화면 좌표없이이 작업을 수행하는 데 몇 시간을 보냈습니다. 나는 화해시킬 두 가지 방법을 절대로 가질 수 없었다. 이것은 Aero가 창 크기에 대해 어떻게 놓여 있는지에 대한 OP에 대한 Hans Passant의 의견 때문일 수 있습니다.

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace Cambia 
{ 
    public static class ControlExtensions 
    { 
     public static Point FormRelativeLocation(this Control control, Form form = null) 
     { 
      if (form == null) 
      { 
       form = control.FindForm(); 
       if (form == null) 
       { 
        throw new Exception("Form not found."); 
       } 
      } 

      Point cScreen = control.PointToScreen(control.Location); 
      Point fScreen = form.Location; 
      Point cFormRel = new Point(cScreen.X - fScreen.X, cScreen.Y - fScreen.Y); 

      return cFormRel; 

     } 

    } 
} 
+1

이것은 훌륭한 해결책입니다. 하지만, 당신이'cFormRel'을 돌려 주려한다고 생각합니다. – dshrout

관련 문제