如果您使用的是 Windows 窗体,则可能与 Windows 64 位上的嵌套限制问题有关。
详情在这里:http ://www.feedghost.com/Blogs/BlogEntry.aspx?EntryId=17829
总之...
来自 MS 源,在 Control.SetBoundsCore 中:
SafeNativeMethods.SetWindowPos(new HandleRef(window, Handle), NativeMethods.NullHandleRef, x, y, width, height, flags);
// NOTE: SetWindowPos causes a WM_WINDOWPOSCHANGED which is processed
// synchonously so we effectively end up in UpdateBounds immediately following
// SetWindowPos.
//
//UpdateBounds(x, y, width, height);
并来自 MSDN:
http://social.msdn.microsoft.com/forums/en-US/windowsuidevelopment/thread/25181bd5-394d-4b94-a6ef-06e3e4287527/
“一项小调查表明,当 Windows 达到某个嵌套级别时,它会停止发送 WM_SIZE。换句话说,如果您在父窗口中处理 WM_SIZE 时尝试调整它们的大小,它不会将 WM_SIZE 发送到您的子窗口。取决于USER stuff/updates/service 打包了它停止传播 WM_SIZE 的最大嵌套级别,在最新的 XP 32bit/sp2 下可能从 15 到 31 不等,甚至更高(实际上无法访问)。
但是在 XP x64 下它仍然太少,并且在某些 Vista 版本下,其他消息仍然会发生一些类似的丑陋事情。
所以这肯定是一个 Windows 错误。”
您有两种选择:要么减少控件层次结构的深度(更理想的解决方案),要么从您使用的每个系统控件中派生“固定”控件,如下所示:
public class FixedPanel : Panel
{
protected override void SetBoundsCore( int x, int y, int width, int height, BoundsSpecified specified )
{
base.SetBoundsCore( x, y, width, height, specified );
if( specified != BoundsSpecified.None )
{
if( ( specified & BoundsSpecified.X ) == BoundsSpecified.None )
{
x = Left;
}
if( ( specified & BoundsSpecified.Y ) == BoundsSpecified.None )
{
y = Top;
}
if( ( specified & BoundsSpecified.Width ) == BoundsSpecified.None )
{
width = Width;
}
if( ( specified & BoundsSpecified.Height ) == BoundsSpecified.None )
{
height = Height;
}
}
if( x != Left || y != Top || width != Width || height != Height )
{
UpdateBounds( x, y, width, height );
}
}
}