C#WinForms相对于另一个表单定位一个表单

时间:2009-12-22 08:24:08

标签: c# winforms

在我的应用程序中,我有一个mainform。单击打开按钮时,我想显示加载文本的第二个(无边框)表单。到目前为止我已经完成了这项工作。

但我想要的是加载形式相对于主窗体居中。我该怎么做?

解决方案:

private void tsbOpen_Click(object sender, EventArgs e)
{
    if (_fileDialog.ShowOpenDialog() == DialogResult.OK)
    {
        _progress = new frmProgress(); // _progress is a member var
        backgroundWorker1.RunWorkerAsync("open");
        _progress.ShowDialog(this);

    }
}

4 个答案:

答案 0 :(得分:13)

您可以将 StartPosition 设置为 CenterParent ,并将主窗体作为所有者传递。

答案 1 :(得分:0)

Martijn试试这个

在方法的开头放了一些像这样的代码

public sub Bah()
{
    if (me.InvokeRequired)
    {
        me.Invoke(new action(Bah));
        return
    }

    myform.showdialog...
}

不知道此代码是否编译为100%,但您明白了

答案 2 :(得分:0)

我创建了一个名为ProcessingRequest的子表单,并在其上放置了一些文本和动画gif。

我的主要表单中有一个属性,用于计算子表单的位置。

private Point ProcessingLocation { get { return new Point(this.Location.X + this.Width / 2 - new ProcessingRequest().Width / 2, this.Location.Y + this.Height / 2 - new ProcessingRequest().Height / 2); } }

我有一个类,它创建一个新线程来显示子表单。

    public class ShowProgress
    {
        static private System.Drawing.Point point;
        static private ProcessingRequest p;
        static public void ShowProgressForm(System.Drawing.Point myPoint)
        {
            point = myPoint;
            Thread t = new Thread(new ThreadStart(ShowProgress.ShowForm));
            t.IsBackground = true;
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
        }
        static private void ShowForm()
        {
            p = new ProcessingRequest();
            p.StartPosition = FormStartPosition.Manual;
            p.Location = point;
            p.TopMost = true;
            Application.Run(p);
        }

        static public void CloseForm()
        {
            p.Invoke(new CloseDelegate(ShowProgress.CloseFormInternal));
        }

        static private void CloseFormInternal()
        {
            p.Close();
        }
    }
    public delegate void CloseDelegate();

然后在我的主要表格中我简单地说

ShowProgress.ShowProgressForm(ProcessingLocation);
//heavy processing code goes here or whatever
ShowProgress.CloseForm();

:)

答案 3 :(得分:-3)

获取主窗体坐标及其大小的位置,并获取子窗体的大小,并在其上放置一些简单的数学。