在使用SetWindowLongPtr的PInvoke从Sizable窗口中删除标题(WS_CAPTION)之后,我在Windows窗体中遇到了这个问题。之后,只要窗口最小化或最大化然后恢复到正常,它就会增长(通过CaptionHeight +边框)。
似乎Windows Forms的布局机制正在尝试补偿它认为仍然存在的标题栏。 (如果我从一个FormBorderStyle开始并添加我想要的东西,即相当大的边框,我最终遇到了相反的问题,窗口缩小了。)
我发现另外一个人击中了this problem on codeplex, 但没有发布任何解决方案。
尝试在其中一个调整大小事件的自定义处理程序中调整大小都太早,即Windows Forms在Layout,Resize和SizeChanged事件触发后进行调整,如果没有Caption栏,则不会触发ResizeEnd。在任何情况下,这都只是一种解决方法,我想要一种方法来告诉Windows Forms做正确的事情。 想法?
(我有一个有效的解决方法,我很快就会发布,但最终用户可以看到它。)
答案 0 :(得分:1)
如果以Windows Forms的方式执行此操作,它可以正常工作。将此代码粘贴到表单中:
protected override CreateParams CreateParams {
get {
CreateParams parms = base.CreateParams;
parms.Style &= ~0xC00000; // Turn off WS_CAPTION
return parms;
}
}
答案 1 :(得分:0)
link text我的解决方案,由贾斯汀罗杰斯引发的令人敬畏的Windows窗体消息泵技巧:
private delegate void VoidMethodInvoker();
public void ShrinkWindow()
{
int widthAdjust = 2 * SystemInformation.BorderSize.Height;
int heightAdjust = SystemInformation.CaptionHeight + 2 * SystemInformation.BorderSize.Height;
this.Size = new System.Drawing.Size(Size.Width - widthAdjust, Size.Height - heightAdjust);
}
// Then in the Resize event:
case FormWindowState.Normal:
{
this.BeginInvoke(new VoidMethodInvoker(this.ShrinkWindow));
break;
}
BeginInvoke将ShrinkWindow调用放在消息泵上;直接从Resize事件处理程序中调用它太早了 当标题栏不可见时,似乎不会触发ResizeEnd事件。最终用户确实看到了这种增长和缩小,但它确实如此 很快。