手上有个程序是C#写的,他的实现是响应“Resize”事件,代码如下:        private void Form_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Normal)
            {
                this.ClientSize = new System.Drawing.Size(839,581);
            }
        }这样的话,发现几个问题:
在“if (this.WindowState == FormWindowState.Normal)”和“this.ClientSize = new System.Drawing.Size(839,581)”加断点。
1、在调试的时候,点击最大化,发现执行“if (this.WindowState == FormWindowState.Normal)”的时候,this.ClientSize已经有一个数值(全屏的大小),按F5继续执行;再点击还原,发现执行“if (this.WindowState == FormWindowState.Normal)”的时候,this.ClientSize也有一个数值,那么当执行“this.ClientSize = new System.Drawing.Size(839,581)”以后,应该会把窗口的大小固定,结果发现按F5后,再次进入了这个函数,而且this.ClientSize并不是设定的(839,581),连续按F5都会执行这句,看起来就像是不断调整窗口大小,直到能够把窗口的大小设定成(839,581)。2、我想知道双击标题栏实现最大化和还原功能的时候,实际上做了哪些操作?因为双击也会发生上面的情况。如果把上面代码去掉,发现双击还原的窗口大小和点击还原按钮还原的窗口的大小是不一样的。3、这个“Resize”事件的响应是不是在窗口改变大小之后才发生的?因为每次进入响应函数之前,发现this.ClientSize已经有数值了,在这个函数里面调整窗口大小,就像是出来窗口以后再调整。有没有什么事件能够在窗口调整大小之前就发生的响应,如果在里面改变是不是会好点呢?请大家帮帮忙,谢谢了

解决方案 »

  1.   

    是想实现一个固定大小的窗口?
    怎么不使用MaximumSize及MinimumSize属性呢?Resize只要有大小改变的事件发生就会引发这个事件。
      

  2.   

    1和2、
          发生这个的原因就是因为在你双击(或点击最大化、还原)时发生了Form_ReSize事件,而你设置窗体的Size也会引发这个事件,于是当你双击时,如果条件满足this.WindowState == FormWindowState.Normal,则进行this.ClientSize = new System.Drawing.Size(839,581);这个操作。      然后这个操作又引发Resize事件(开始那个Resize并未退出),于是又进来执行this.ClientSize = new System.Drawing.Size(839,581);     如此重复,发生了这两个问题。3、调整大小的相关事件有BeginResize、EndResize、SizeChanged、StyleChanged等等。
    修改方法如下:bool resizing = false;        private void Form1_Resize(object sender, EventArgs e)
            {
                if (resizing) return;
                if (this.WindowState == FormWindowState.Normal)
                {
                    this.ClientSize = new System.Drawing.Size(839, 581);
                    resizing = true;
                }
            }
      

  3.   

            bool resizing = false;        private void Form1_Resize(object sender, EventArgs e)
            {
                if (resizing) return;
                if (this.WindowState == FormWindowState.Normal)
                {
                    resizing = true;
                    this.ClientSize = new System.Drawing.Size(839, 581);
                }
                resizing = false;
            }
      

  4.   

    如果我在Resize里面的代码如下:        private void Form_Resize(object sender, EventArgs e)
            {  
                    Size Size_old = this.ClientSize ;
            }发现点击最大化后再点击还原,会发现这里的this.ClientSize不是等于最大化之前的数值。不是要实现一个固定大小的窗口,而是要实现一个最大化后能还原原来大小,或者说还原成一个固定大小的窗口。
    另外this.Width和this.Height是不是也要设定?
    我上面的代码直接运行是能够看起来是实现了还原功能的,但是最大化后,点击还原按钮,再一移动窗口,会发现好像窗口一下会变大,然后又变成我要的大小,就闪了一下,所以我才调试,发现了上面的问题
      

  5.   

    最大化后再还原为最大化前的窗口大小这个是默认的,.NET有记载最大化前的窗口大小,所以如果要实现这个可以不做任何事。如果还原为一个固定大小的窗口可以像我在3楼的代码。设置了Size之后就等于同时设定窗口的Width和Height了,那个闪动的现象改了Resize里边的代码就不会出现了
      

  6.   

    不是哦,我如果Resize里面什么代码都不添加,出现的窗口不是原来的大小,而是会出现一个宽一样,但是高不一样的窗口,而最小化后在还原,也会出现一个宽一样,高不一样(和最大化后还原的高野不一样)的窗口,所以才觉得很奇怪、、、、、、
      

  7.   

    嗯……这样调试你应该就能发现了Form_Resize(..)
    {
      ;//此处用一句空语句用以设置断点
    }断点设置在分号上。然后最大化,进入这里边后按F11单步调试,下一步应该是结束的大括号,然后显示主窗体。此时再触发一下窗体的Resize事件(通过双击改变大小)就可以发现最先执行哪里了
      

  8.   

    不错,免费.NET空间
      

  9.   

    应该只有Refresh()事件吧,这个可以重写。但是我觉得不是那个的问题,方便发这个窗体给我看下吗?
    QQ176368860
      

  10.   

    那你就在还原时固定一大小吧,那个闪一下的原因是默认的恢复成最大化前的窗体大小。设置固定大小的代码是这样的
            bool resizing = false;        private void Form1_Resize(object sender, EventArgs e)
            {
                if (resizing) return;
                if (this.WindowState == FormWindowState.Normal)
                {
                    resizing = true;
                    this.ClientSize = new System.Drawing.Size(839, 581);
                    resizing = false;
                }
            }
      

  11.   

    this.WindowState = FormWindowState.Normal; 
    就可以了吧