手上有个程序是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已经有数值了,在这个函数里面调整窗口大小,就像是出来窗口以后再调整。有没有什么事件能够在窗口调整大小之前就发生的响应,如果在里面改变是不是会好点呢?请大家帮帮忙,谢谢了
{
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已经有数值了,在这个函数里面调整窗口大小,就像是出来窗口以后再调整。有没有什么事件能够在窗口调整大小之前就发生的响应,如果在里面改变是不是会好点呢?请大家帮帮忙,谢谢了
解决方案 »
- 类似农场采摘时光标变小手的图片
- gdi+做触摸屏问题
- 怎样判断两个图片是否相等?即同一张图片
- C#问题:检索COM类工厂中CLSID为{E436EBB3-524F-11CE-9F53-0020AF0BA770}的组件时失败,原因是出现以下错误:8007007e。
- 我想文本框里输入的只能是数字!请问如何用验证控件实现?
- Winform 如何把窗体内的内容导入WORD或者EXCEL
- 新手上路!关于DataGrid的问题!
- C#下,两个string比较
- 是不是try块内包括的语句越少越好?越多效率越低?为什么?
- 鼠标和光标的问题(在线立解立结)
- WinForm远程连接服务器Access数据库,如何获取服务器系统当时间。
- 在窗口开发方面,现在是c#还是mfc比较有优势啊
怎么不使用MaximumSize及MinimumSize属性呢?Resize只要有大小改变的事件发生就会引发这个事件。
发生这个的原因就是因为在你双击(或点击最大化、还原)时发生了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;
}
}
{
if (resizing) return;
if (this.WindowState == FormWindowState.Normal)
{
resizing = true;
this.ClientSize = new System.Drawing.Size(839, 581);
}
resizing = false;
}
{
Size Size_old = this.ClientSize ;
}发现点击最大化后再点击还原,会发现这里的this.ClientSize不是等于最大化之前的数值。不是要实现一个固定大小的窗口,而是要实现一个最大化后能还原原来大小,或者说还原成一个固定大小的窗口。
另外this.Width和this.Height是不是也要设定?
我上面的代码直接运行是能够看起来是实现了还原功能的,但是最大化后,点击还原按钮,再一移动窗口,会发现好像窗口一下会变大,然后又变成我要的大小,就闪了一下,所以我才调试,发现了上面的问题
{
;//此处用一句空语句用以设置断点
}断点设置在分号上。然后最大化,进入这里边后按F11单步调试,下一步应该是结束的大括号,然后显示主窗体。此时再触发一下窗体的Resize事件(通过双击改变大小)就可以发现最先执行哪里了
QQ176368860
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;
}
}
就可以了吧