我有一个带有居中背景图像的 MDI 表单。
每次用户更改表单的大小或状态时,图像都不会更新。它保留在旧位置(不再居中),当表格太小时甚至会丢失。
如何正确处理这种情况?
我真的必须在与表单大小和状态相关的所有事件处理程序中调用“this.Refresh()”吗?
应用程序在 .net 3.5SP1 C# 和 Windows.Forms 中实现。
我有一个带有居中背景图像的 MDI 表单。
每次用户更改表单的大小或状态时,图像都不会更新。它保留在旧位置(不再居中),当表格太小时甚至会丢失。
如何正确处理这种情况?
我真的必须在与表单大小和状态相关的所有事件处理程序中调用“this.Refresh()”吗?
应用程序在 .net 3.5SP1 C# 和 Windows.Forms 中实现。
不幸的是,似乎没有一种超级快速的方法可以做到这一点,但以下是我的解决方案,至少似乎不依赖巧合。
在 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;
你可以做所有这些,或者你可以me.refresh
在 MDI 的resize
事件中添加一个。
在 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 ) ;
}
Private Sub YourMDIFormName_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Resize
Me.BackgroundImage = My.Resources.YourBackgroundImageName
Me.Refresh()
End Sub