2012-07-19 4 views
6

두 개의 Forms가 있습니다. 기본 폼은 Form1이고, 보조 대화 상자는 Form2로 표시됩니다. Form2를 호출하면 항상 화면의 왼쪽 위 모서리에 표시됩니다. 처음에는 내 양식이 전혀 없다고 생각했지만 처음에는 화면 상단에 매달려있는 것을 보았습니다. 사용자가 컨텍스트 메뉴를 클릭하여 모달 대화 상자를 표시하는 현재 마우스 위치에 내 양식을 표시하고 싶습니다. 나는 이미 다른 것들을 시도하고 코드 샘플을 검색했다. 그러나 나는 이미 알고있는 다른 방식으로 실제 마우스 위치를 얻는 방법에 대해 수천 개의 서로 다른 코드 외에 아무것도 발견하지 못했습니다. 그러나이 위치는 항상 화면, 주 폼, 컨트롤 또는 현재 컨텍스트가 무엇이든 항상 상대적입니다. 여기에 내 코드 (나는 또한 일을하고 중심 - 화면 센터 형태는, 그래서 Windows.Default.Position에 재산 남아 있지 않습니다 시도 바탕 화면 위치) :C# 화면의 특정 마우스 위치에 양식을 표시하는 방법은 무엇입니까?

 Form2 frm2 = new Form2(); 
     frm2.textBox1.Text = listView1.ToString(); 
     frm2.textBox1.Tag = RenameFile; 
     DialogResult dlgres=frm2.ShowDialog(this); 
     frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y); 

답변

9

귀하의 문제가 있다는 것입니다을 첫 번째 호출은 frm2.ShowDialog(this);이고 frm2.SetDesktopLocation을 호출합니다. 실제로 양식 (frm2)이 닫힌 후에 호출됩니다.

ShowDialog은 블로킹 콜입니다. 즉, ShowDialog를 호출 할 때 사용할 폼이 닫힐 때만 반환됩니다. 따라서 양식 위치를 설정하는 데는 다른 접근 방식이 필요합니다.

아마도 가장 쉬운 방법은 X 및 Y 좌표에 대해 두 개의 매개 변수를 사용하는 두 번째 생성자를 Form2에 생성하는 것입니다. 당신이 그것을 표시 할 양식을 만들 때

public class Form2 
{ 

    // add this code after the class' default constructor 

    private int desiredStartLocationX; 
    private int desiredStartLocationY; 

    public Form2(int x, int y) 
      : this() 
    { 
     // here store the value for x & y into instance variables 
     this.desiredStartLocationX = x; 
     this.desiredStartLocationY = y; 

     Load += new EventHandler(Form2_Load); 
    } 

    private void Form2_Load(object sender, System.EventArgs e) 
    { 
     this.SetDesktopLocation(desiredStartLocationX, desiredStartLocationY); 
    } 

그런 다음, 기본 한 대신이 생성자를 사용

Form2 frm2 = new Form2(Cursor.Position.X, Cursor.Position.Y); 
frm2.textBox1.Text = listView1.ToString(); 
frm2.textBox1.Tag = RenameFile; 
DialogResult dlgres=frm2.ShowDialog(this); 

또한로드 처리기에서 this.Move(...)' instead of 'this.SetDesktopLocation를 사용하여 시도 할 수 있습니다.

+0

내 제안을 시도해 보셨습니까? 수정 된 생성자를 구현했는데 작동하지 않았습니까? –

+0

@feedwall - 기분이 좋았습니다 (upvote & accept에 감사드립니다) –

+0

StartPosition을 Manual로 설정해야합니다. – ehh

2

당신은 지금처럼 ShowDialog를() 메소드 전에 SetDesktopLocation를 호출해야합니다

using(Form2 frm2 = new Form2()) 
{ 
    frm2.textBox1.Text = listView1.ToString(); 
    frm2.textBox1.Tag = RenameFile; 
    frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y); 

    DialogResult dlgres=frm2.ShowDialog(this); 
} 

가 사용 statemen를 사용하여, 그것은 recomanded입니다. 행운을 빌어 요;)