在C#的Winform中实现窗口全屏显示的代码非常简单,如下:
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.TopMost = true; //这句无关紧要,可以不加
本来没什么可说的,但是——
今天碰巧要实现一个用键盘快捷键来切换“全屏/窗口”的功能,发现只有第一次按的时候正常实现全屏。
在点击按键切换成非全屏后,再切回来时任务栏不消失。代码如下:
if (this.FormBorderStyle == FormBorderStyle.None)
{
this.FormBorderStyle = FormBorderStyle.FixedSingle;
}
else
{
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
}
第一次按的时候正常说明代码没有大的问题……
第一次和后来的N次操作有什么区别呢?
突然想到第一次按的时候程序是以正常大小的窗口显示的,而后续按键操作时因程序语句的关系窗口一直是最大化的(无论全屏与否)。
当即改成如下代码:
if (this.FormBorderStyle == FormBorderStyle.None)
{
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.WindowState = FormWindowState.Normal;
}
else
{
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
}
OK,一切正常了。
但是为什么会出现这个问题呢?想了一下,觉得应该是这样:
在最初的代码中,从全屏切换成窗口时,此时窗口的WindowState保留了最大化的状态。
又因为此时不是全屏,任务栏是要显示的,所以此时显示的程序窗口大小不是1024*768,而是1024*(768-30)=1024*738
当再从最大化的窗口切回全屏时,程序将FormBorderStyle设置成None后,执行到“this.WindowState = FormWindowState.Maximized”这句时,因为窗口状态已经是Maximized,所以系统自动接受了此时窗口的大小,而问题是此时的窗口大小并不是1024*768,所以就出现上面问题了。
这是我个人的推断,没有经过验证,如果哪们高手知道真实原委并肯指点一二,那真是感激不尽了。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
本来没什么可说的,但是——
今天碰巧要实现一个用键盘快捷键来切换“全屏/窗口”的功能,发现只有第一次按的时候正常实现全屏。
在点击按键切换成非全屏后,再切回来时任务栏不消失。代码如下:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
第一次按的时候正常说明代码没有大的问题……
第一次和后来的N次操作有什么区别呢?
突然想到第一次按的时候程序是以正常大小的窗口显示的,而后续按键操作时因程序语句的关系窗口一直是最大化的(无论全屏与否)。
当即改成如下代码:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
OK,一切正常了。
但是为什么会出现这个问题呢?想了一下,觉得应该是这样:
在最初的代码中,从全屏切换成窗口时,此时窗口的WindowState保留了最大化的状态。
又因为此时不是全屏,任务栏是要显示的,所以此时显示的程序窗口大小不是1024*768,而是1024*(768-30)=1024*738
当再从最大化的窗口切回全屏时,程序将FormBorderStyle设置成None后,执行到“this.WindowState = FormWindowState.Maximized”这句时,因为窗口状态已经是Maximized,所以系统自动接受了此时窗口的大小,而问题是此时的窗口大小并不是1024*768,所以就出现上面问题了。
这是我个人的推断,没有经过验证,如果哪们高手知道真实原委并肯指点一二,那真是感激不尽了。
却原来、姹紫嫣红开遍,似这般、都付与断井颓痕 ——《昆曲·游园惊梦》