在我的应用程序中,我有一个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);
}
}
答案 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)
获取主窗体坐标及其大小的位置,并获取子窗体的大小,并在其上放置一些简单的数学。