8

メイン フォームは Form1 で、オンデマンドでダイアログとして表示されるセカンダリ フォームは Form2 です。Form2 を呼び出すと、常に画面の左上隅に表示されます。最初は自分のフォームがまったくないと思っていましたが、画面上部の隅にぶら下がっているのが見えました。ユーザーがコンテキストメニューをクリックしてモーダルダイアログを表示する現在のマウス位置にフォームを表示したいと思います。私はすでにさまざまなことを試し、コードサンプルを検索しました。しかし、私がすでに知っているさまざまな方法で実際のマウス位置を取得する方法について、何千もの異なるコード以外に何も見つかりませんでした。ただし、この位置は常に、画面、メイン フォーム、コントロール、または現在のコンテキストが何であれ相対的です。ここで私のコード(私も試したデスクトップの配置は機能せず、フォームのみを画面の中央に配置します。

        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);
4

2 に答える 2

10

あなたの問題は、最初の call:frm2.ShowDialog(this);frm2.SetDesktopLocation、実際にはフォーム (frm2) が既に閉じられた後にのみ呼び出される call です。

ShowDialogはブロッキング呼び出しです。つまり、ShowDialog を呼び出しているフォームが閉じたときにのみ返されます。そのため、フォームの位置を設定するには別のアプローチが必要になります。

おそらく、これを実現する最も簡単な方法は、X 座標と Y 座標の 2 つのパラメーターを受け取る Form2 (配置したい) に 2 番目のコンストラクターを作成することです。

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.SetDesktopLocationLoad ハンドラで使用することもできます。

于 2012-07-19T01:18:54.903 に答える
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);
}

using ステートメンを使用することをお勧めします。幸運を ;)

于 2012-07-19T01:24:14.947 に答える