3

Windows フォームを開いたときに、画面の左上ではなく右下に配置するにはどうすればよいですか?

状況:実際にはフォームとして何もしないForm1があります。コンテキスト メニューに使用しただけです (私のアプリはトレイからのみ動作します)。そのため、主な実行コードのほとんどは Form1 クラスに入ります。コンテキスト メニューがクリックされると、何らかの処理が行われ、最終的にForm2が表示されます。したがって、Form2はForm1のコンテキスト メニュー項目によって開かれる/呼び出されます。この場合、Form2 の位置を変更するにはどうすればよいですか?

Form1.cs ( Form2がトリガーされる部分)

private void menu_upload_file_Click(object sender, EventArgs e)
{
    DialogResult dialogOpened = openFileDialog1.ShowDialog();
    if (dialogOpened == DialogResult.OK)
    {
        string filename = openFileDialog1.FileName;

        using (var client = new WebClient())
        {
            var response = client.UploadFile("http://localhost/imgitv3/upload.php?submit=true&action=upload&request=app", "POST", filename);
            // string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + Path.DirectorySeparatorChar + "response.txt";

            if (response != null)
            {
                string responseContent = System.Text.Encoding.ASCII.GetString(response);
                Form2 linkWindow = new Form2();

                if (isURL(responseContent))
                {
                    linkWindow.toTextBox(responseContent);
                    linkWindow.Show();
                }
            }
        }
    }
}

Form2.Designer.cs

// 
            // Form2
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.CausesValidation = false;
            this.ClientSize = new System.Drawing.Size(419, 163);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.MaximizeBox = false;
            this.MaximumSize = new System.Drawing.Size(435, 202);
            this.MinimizeBox = false;
            this.MinimumSize = new System.Drawing.Size(435, 202);
            this.Name = "Form2";
            this.ShowInTaskbar = false;
            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
            this.Text = "IMGit Image Uploader";
            this.TopMost = true;
            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
            this.Load += new System.EventHandler(this.Form2_Load);
            this.ResumeLayout(false);
            this.PerformLayout();
4

4 に答える 4

5

知っておくべきことが 2 つあります。1 つ目は、フォームを表示する画面の作業領域です。作業領域は、画面のサイズからその画面に表示されるタスク バーを引いたものです。そのために Screen.WorkingArea プロパティを使用できます。

2 番目は、ウィンドウの実際のサイズです。これは通常、フォームのデザイン サイズではありません。ユーザーがウィンドウのタイトルバーのテキストのサイズを変更したか、別の DPI 設定でビデオ アダプターを実行している可能性があります。そのサイズを知る前に、フォームの Load イベントが発生するまで待つ必要があります。

したがって、プライマリ モニターにフォームを表示すると仮定すると、コードは次のようになります。

        var frm = new Form2();
        frm.Load += (s, ea) => {
            var wa = Screen.PrimaryScreen.WorkingArea;
            frm.Location = new Point(wa.Right - frm.Width, wa.Bottom - frm.Height);
        };
        frm.Show();

ウィンドウが表示される直前にウィンドウを再配置します。フォームの StartPosition プロパティは重要ではありません。

于 2013-02-07T18:22:30.133 に答える
2

Form2 から FormLoad イベントをフックします。

Form2 linkWindow = new Form2();
linkWindow.FormLoad += Form2_Load;

次に、このメソッドをどこかに追加します。

    private void Form2_Load(object sender, EventArgs e)
    {
        this.StartPosition = FormStartPosition.Manual;
        this.Location = new Point(400, 400);  //set x,y to where you want it to appear
    }

X、y の値を、ウィンドウを配置したいものに変更します。

于 2013-02-07T17:55:09.863 に答える
2

this.StartPosition = FormStartPosition.Manual および場所などに関する回答に加えて、フォームを配置する場所を計算するには、Screen クラスとその WorkingArea プロパティを使用できます。 http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.aspx

于 2013-02-07T18:20:59.857 に答える
2

フォーム プロパティStartPosition=Manualを設定form.leftし、form.topプロパティを目的の値に設定できます。

ダイアログが表示される前に設定する必要があります。

Form2 linkWindow = new Form2();
linkWindow.StartPosition = FormStartPosition.Manual;
linkWindow.Left = 200;
linkWindow.Top = 200;

if (isURL(responseContent))
{
  linkWindow.toTextBox(responseContent);
  linkWindow.Show();
}

左と上の値で遊ぶ

于 2013-02-07T17:39:16.903 に答える