2012-07-19 7 views
6

私は2つのフォームを持っています。私のメインフォームは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座標の2つのパラメータを取る2番目のコンストラクタを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を使用して試すことができます。あなたがそうのように、ShowDialogの()メソッドの前にSetDesktopLocationを呼び出す必要が

+0

あなたの試したことはありますか?変更されたコンストラクタを実装しましたが、うまくいかなかったのですか? –

+0

@feedwall - 私はあなたのために働いてうれしいです(そしてupvote&acceptに感謝します) –

+0

StartPositionをManualに設定する必要があります – ehh

2

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ています。幸運;)

関連する問題