游民家园

leafyoung v.s. dotnet

无法修改Form尺寸的解决方法

最近在做一个小程序,需要创建一个很小的无边框窗口,窗口的高度大概是25个像素,于是新建一个普通Form,并如下编码:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace ClickThroughTest
{
    
public partial class ClickThroughForm : Form
    {
        
public ClickThroughForm()
        {
            InitializeComponent();

            
this.FormBorderStyle = FormBorderStyle.FixedSingle;
            
this.StartPosition = FormStartPosition.Manual;
            
this.Text = String.Empty;
            
this.ShowInTaskbar = false;
            
this.ControlBox = false;
        }

        
public void AdjustSize()
        {
            Size newSize 
= new Size(8025);
            
this.Size = newSize;
        }
    }
}

奇怪的事情发生了,窗口的大小比我指定的大了不少,用Spy4win看了看,好像是124*36,而不是我指定的80*25,如下图所示:

 

抓耳挠腮许久,又反复检查代码,肯定自己没有在什么地方犯错误,由反复修改尺寸值测试,发现只要大小大于124*36就能正确设置Size,否则的话就无法正确显示。

无奈之下只好google之,发现好像是winform的一个bug,寻找解决方案,无果。

大概一个小时之后,正郁闷的时候,突然发现MaximunSize和MinimumSize两个属性,死马当做活马医,反复测试之后修改代码如下:

        public void AdjustSize()
        {
            Size newSize 
= new Size(8025);
            
this.MaximumSize = this.MinimumSize = newSize;
            
this.Size = newSize;
        }

很惊奇的发现居然好了,效果如下:

 

 

 注意:必须同时设置MaximumSize和MinimumSize才能解决这个问题,否则还是显示错误,MinimumSize可以随意设置,比如new Size(1, 1)。

虽然是个小问题,不过有时候可能用得到,分享一下,呵呵 O(∩_∩)O~

 

 [Update] 终于实现快速工具栏了,记录一下,呵呵。红框中就是纠正尺寸大小问题的小工具栏。

 

posted on 2010-01-23 15:50 游民一族 阅读(1491) 评论(7) 编辑 收藏

评论

#1楼 2010-01-23 21:19 cokkiy      

这个不是bug吧?MinimumSize已经限制了最小值,只需要修改这个就可以了,默认设计的时候显示的0,0意味着在内部设置了一个默认的最小值,所以当你的窗口小于这个默认值时,你必须修改那个MinimumSize设置,可以简单的设置为1,1就可以了。如果你有WPF开发经验,会发现Minimum,Maximum,Value这种关系基本上每个属性都有。  回复 引用 查看   

#2楼[楼主] 2010-01-23 21:24 游民一族      

@cokkiy
按照你的说法,我MinimumSize设置为(1,1)就可以了是吧?!实际上是不行的,我试过了。
这个可以确定是winform的一个bug,不过我没装SP1,不知道sp1这个问题好了没,呵呵
 回复 引用 查看   

#3楼[楼主] 2010-01-23 21:28 游民一族      

@cokkiy
另外,你说0,0意味着内部设置了一个默认值,不知道这种说法源自何处,我查询MSDN,它说0,0意味没有限制:

This property enables you to limit the size of a form to a specified minimum size. You can use this feature to prevent a user from sizing a window to an undesirable size. If this property is set to a Size object that is 0 in height and 0 in width, the form will have no minimum size beyond the limits set by Windows.
 回复 引用 查看   

#4楼 2010-01-24 03:44 挨踢人      

@游民一族
比0,0小的窗体不存在吧?? 所以设置为0,0的时候不就是"没有任何限制"咯
 回复 引用 查看   

#5楼 2010-01-24 13:30 cokkiy      

@挨踢人
@游民一族
你通过在设计器哪儿设置1,1是没有任何问题的,这个问题我早就测试过了的。
If this property is set to a Size object that is 0 in height and 0 in width, the form will have no minimum size beyond the limits set by Windows.
你大概没理解这句话的意思吧
 回复 引用 查看   

#6楼[楼主] 2010-01-24 13:34 游民一族      

@cokkiy
呵呵,我已经反复测试过了,如果只设置MinimumSize而不同时设置MaximumSize是有问题的。
另外,我相信我的英文水平还没这么烂O(∩_∩)O~

不知道和系统环境有没有关系,我在Vista和Windows 7上都试过了,另外,我用的还是Visual Studio 2008(没有sp1)。
 回复 引用 查看   

#7楼 2010-01-24 13:48 cokkiy      

@游民一族
你打个SP1试一下吧,这儿不能上传代码,要不我把代码上传上来让你看看到底可以不
 回复 引用 查看