我有一个我想显示的表格,以此为中心,使用类似的形式。
Form f = new Form();
f.StartPosition = FormStartPosition.CenterParent;
f.ShowDialog(this);
如果在应用程序处于最小化状态时触发此代码,并且当应用程序恢复时,我的表单显示在屏幕右上方,而不是以其父为中心。
,则会发生问题。有人知道如何解决此问题吗?
标准的Windows消息框对话框的行为正确,当应用程序从最小化状态恢复时,对话框处于正确的位置。
我的建议是在最小化
时"缓存"父级的位置(覆盖WndProc()
方法将使在能力>最小化(。
private Point CachedLocation;
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0112) // WM_SYSCOMMAND
{
if (m.WParam == new IntPtr(0xF020)) // SC_MINIMIZE
{
// save the form location beofore it is minimized
CachedLocation= this.Location;
}
m.Result = new IntPtr(0);
}
base.WndProc(ref m);
}
现在,如果在调用子表格时将父表格最小化,请使用缓存的位置点(通过检查FormWindowState
枚举(:
private void button1_Click(object sender, EventArgs e)
{
Form f = new Form();
if (this.WindowState == FormWindowState.Minimized)
{
f.Top = (CachedLocation.Y + (this.Height / 2)) - f.Height / 2;
f.Left = (CachedLocation.X + (this.Width / 2)) - f.Width / 2;
f.StartPosition = FormStartPosition.Manual;
f.ShowDialog();
}
else
{
f.StartPosition = FormStartPosition.CenterParent;
f.ShowDialog();
}
}