惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

小众软件
小众软件
博客园 - Franky
罗磊的独立博客
G
Google Developers Blog
The GitHub Blog
The GitHub Blog
P
Proofpoint News Feed
Recent Announcements
Recent Announcements
V
V2EX
F
Fortinet All Blogs
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
月光博客
月光博客
U
Unit 42
GbyAI
GbyAI
A
About on SuperTechFans
WordPress大学
WordPress大学
Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
Martin Fowler
Martin Fowler
D
DataBreaches.Net
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MongoDB | Blog
MongoDB | Blog

博客园 - 青弦

WinForm打印之页边距 [转载]交换的概念和原理 [转载]交换机概述 [转载]笑傲江湖之三层交换篇 [转载]Window.Open()网页弹出窗口大全 [转载]详解HTML中的META标签 [转载]网页滚动条特效 VS2005中TableAdapter中实现动态查询并使用LIKE的方法整理 [转载]如何在MDI中使子窗体只保留一个实例(反射方法) 去除MDI子窗体最大化后在MainMenuStrip上自动产生的最大化等按钮 第一次认真画用例图,错误很多,请大家来指点 代码段,你用了吗? DIV的水平、垂直居中的最佳实现 Excel数字、文本混合列导入SQL Server出现的问题&解决办法 SQL Server 2000导入数据时遇到的问题 不逐流俗,独辟蹊径——另类又好用的软件推荐[不断更新……] [资源]在线工具测试网页载入速度 博客园blog模板CSS自定义美化 达摩克利斯之刃——.NET破解技术初探
Winform中全屏显示问题
青弦 · 2008-01-29 · via 博客园 - 青弦

在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,所以就出现上面问题了。

这是我个人的推断,没有经过验证,如果哪们高手知道真实原委并肯指点一二,那真是感激不尽了。