【问题标题】:Setting Form to CenterParent when main form is minimized将主窗体最小化时将窗体设置为 CenterParent
【发布时间】:2018-02-09 16:25:13
【问题描述】:

我有一个表单,我想以它的父级为中心显示,使用类似的东西。

  Form f = new Form();     
  f.StartPosition = FormStartPosition.CenterParent;
  f.ShowDialog(this);

如果在应用程序处于最小化状态并且应用程序恢复时触发此代码,则会出现问题,我的表单显示在屏幕的右上角,而不是位于其父级的中心。

有人知道如何解决这个问题吗?

标准 Windows 消息框对话框行为正确,当应用程序从最小化状态恢复时,对话框处于正确位置。

【问题讨论】:

  • 你是从其他线程调用f吗?
  • @jonathana No..

标签: c# winforms


【解决方案1】:

我的建议是在父表单位置被最小化时“缓存”它
(覆盖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 Enum):

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();
    }
}

【讨论】:

  • FormsLocation 函数看起来没有必要。参数不是倒过来的吗? X 通常在左侧,Y 通常在顶部。
  • @LarsTech WndProc() 正在调用FormsLocation,关于颠倒的参数我不明白你的意思是什么(?),OP 想要在父窗体的中心定位子窗体。
  • 是的,但也可以只是CachedLocation = this.Location; 关于颠倒的参数,X 为水平位置,Y 为垂直位置。出于某种原因,您反其道而行之。
  • 我同意你的观点,CachedLocation = this.Location 可以替换FormsLocation(但给出了解决方案的基本思想),现在我明白你对参数的意思了......是的,你是对的没有测试我,现在我看到了错误,几分钟后我会解决这个问题(部分是我从我的智能手机完成的))。谢谢!!
  • 这几乎可以工作,但看起来我还需要保留原始大小和位置的副本。
猜你喜欢
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多