0

我有一个带有居中背景图像的 MDI 表单。
每次用户更改表单的大小或状态时,图像都不会更新。它保留在旧位置(不再居中),当表格太小时甚至会丢失。

如何正确处理这种情况?
我真的必须在与表单大小和状态相关的所有事件处理程序中调用“this.Refresh()”吗?

应用程序在 .net 3.5SP1 C# 和 Windows.Forms 中实现。

4

4 回答 4

2

不幸的是,似乎没有一种超级快速的方法可以做到这一点,但以下是我的解决方案,至少似乎不依赖巧合。

在 mdi 构造函数中,处理大小调整:

this.ResizeEnd += delegate { this.Refresh(); };

然后这个覆盖来处理最大化/恢复事件

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == Win32.WM_SYSCOMMAND)
        {
            int test = m.WParam.ToInt32() & 0xFFF0;
            switch (test)
            {
                case Win32.SC_MAXIMIZE:
                case Win32.SC_RESTORE:
                    this.Invalidate();  // used to keep background image centered
                    break;
            }
        }
        base.WndProc(ref m);
    }

常量值定义为:

    public const int WM_SYSCOMMAND =                    0x0112;
    //wparam for WM_SYSCOMMAND should be one of these after masking with 0xFFF0:
    public const int SC_RESTORE =                       0xF120;
    public const int SC_MINIMIZE =                      0xF020;
    public const int SC_MAXIMIZE =                      0xF030;
于 2009-12-23T15:09:55.987 回答
2

你可以做所有这些,或者你可以me.refresh在 MDI 的resize事件中添加一个。

于 2010-01-14T14:30:31.157 回答
0

在 MDI 表单的 Resize 事件中调用 PositionContainersToParentMiddle 方法。我没有测试过它,但它应该可以工作。您可能必须在 Resize 事件中设置条件以在每次调整大小时停止图像位置更改。

   private void YourMDI_Resize(object sender, EventArgs e)
    {
        PositionContainersToParentMiddle();
    }

    private void PositionContainersToParentMiddle()
    {
        int iInitX = (ParentOfImage.Size.Width - YourImage.Size.Width) / 2;
        int iInitY = ( ParentOfImage.Location.Y + YourImage.Size.Height ) / 2;
        YourImage.Location = new Point( iInitX, iInitY ) ;

    }
于 2009-09-14T11:52:12.543 回答
0
Private Sub YourMDIFormName_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Resize
    Me.BackgroundImage = My.Resources.YourBackgroundImageName
    Me.Refresh()
 End Sub
于 2013-07-19T07:35:06.267 回答