winform 界面全屏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform 界面全屏相关的知识,希望对你有一定的参考价值。
现在我的程序由3部分组成:一个主窗体MainForm,里面有多个Panel;还有1个自己写的用户控件和用户控件的控制代码文件。用户控件加载在MainForm的第一个Panel内,现在需要通过一个事件将用户控件放大到屏幕的全屏。所有的DOCK属性都已经设置好了。求解答
E-mail:wz5615◎gmail.com
对于你们的解答,我非常遗憾不能给你们分,因为你们都没有注意我的问题,你们提供的解决方案在一个Form内是可以实现,但是我运用了多层单元文件。所以不能实现FormBorderStyle和WindowsState属性,不信你们可以新建一个代码文件可以进行尝试。现在我的问题已经解决。在用户控件内定义一个委托,并提供方法使得在控制文件内触发委托,然后再Form内实现委托方法。这样就可以实现了。
Form frmUserControlHost=new Form();
frmUserControlHost.FormBorderStyle=FormBorderStyle.None;
frmUserControlHost.WindowState=FormWindowState.Maximized;
frmUserControlHost.Controls.Add(userControl1);
frmUserControlHost.ShowInTask=false;
frmUserControlHost.ShowDialog(this); 参考技术B this.FormBorderStyle. = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
如何让 WinForms 应用程序全屏显示
【中文标题】如何让 WinForms 应用程序全屏显示【英文标题】:How do I make a WinForms app go Full Screen 【发布时间】:2010-10-05 01:06:00 【问题描述】:我有一个 WinForms 应用程序,我正在尝试使其全屏显示(有点像 VS 在全屏模式下所做的)。
目前我将FormBorderStyle
设置为None
,将WindowState
设置为Maximized
,这给了我更多空间,但如果它可见,它不会覆盖任务栏。
我还需要做什么才能使用该空间?
对于奖励积分,我可以做些什么来让我的 MenuStrip
自动隐藏也放弃那个空间?
【问题讨论】:
【参考方案1】:对于基本问题,以下将解决问题(隐藏任务栏)
private void Form1_Load(object sender, EventArgs e)
this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
但是,有趣的是,如果您交换最后两行,任务栏仍然可见。我认为这些动作的顺序很难用属性窗口控制。
【讨论】:
订购问题是它以前对我不起作用的原因。我实际上是按该顺序设置属性,但是当表单已经最大化时,将边框设置为无不会扩展以覆盖任务栏。我通过“恢复”更改边框然后最大化的形式来解决问题。 我的顺序正确,但它不起作用。任务栏始终可见,应用程序不在其下方,它只是为任务栏留下了空闲空间。 (Win7) @Preza8 - 阅读 Grady 的评论,检查是否适用于您的情况。 对不起,我很久没在这里上网了,我忘记了我是怎么做到的,但我记得在尝试了这些命令的随机顺序后会有所帮助。 注意:出于某种原因,我不得不设置属性并将其放入代码中【参考方案2】:经过测试的简单解决方案
我一直在 SO 和其他一些网站上寻找这个问题的答案,但一个人给出的答案对我来说非常复杂,而其他一些答案根本无法正常工作,所以经过大量代码测试后我解决了这个谜题。
注意:我使用的是 Windows 8,我的任务栏未处于自动隐藏模式。
我发现在执行任何修改之前将 WindowState 设置为 Normal 将停止未覆盖任务栏的错误。
代码
我创建的这个类有两个方法,第一个进入“全屏模式”,第二个离开“全屏模式”。所以你只需要创建这个类的一个对象,并将你想要设置全屏的Form作为参数传递给EnterFullScreenMode方法或者LeaveFullScreenMode方法:
class FullScreen
public void EnterFullScreenMode(Form targetForm)
targetForm.WindowState = FormWindowState.Normal;
targetForm.FormBorderStyle = FormBorderStyle.None;
targetForm.WindowState = FormWindowState.Maximized;
public void LeaveFullScreenMode(Form targetForm)
targetForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
targetForm.WindowState = FormWindowState.Normal;
使用示例
private void fullScreenToolStripMenuItem_Click(object sender, EventArgs e)
FullScreen fullScreen = new FullScreen();
if (fullScreenMode == FullScreenMode.No) // FullScreenMode is an enum
fullScreen.EnterFullScreenMode(this);
fullScreenMode = FullScreenMode.Yes;
else
fullScreen.LeaveFullScreenMode(this);
fullScreenMode = FullScreenMode.No;
我在另一个我不确定是否与这个问题重复的问题上给出了相同的答案。 (链接到另一个问题:How to display a Windows Form in full screen on top of the taskbar?)
【讨论】:
出于好奇,为什么你有一个完整的枚举来描述一个真/假条件? 这是我很久以前写的,当时我只是抓着写代码,请注意我年轻的愚蠢。这确实毫无意义,我应该简单地使用布尔类型。 它对我有用,我也必须在开始全屏时设置targetForm.WindowState = FormWindowState.Normal;
。用于处理用户从最大化窗口进入全屏的情况。【参考方案3】:
对于menustrip-question,尝试设置
MenuStrip1.Parent = Nothing
当处于全屏模式时,它应该会消失。
并且在退出全屏模式时,再次将menustrip1.parent
重置为表单,菜单栏将再次正常。
【讨论】:
【参考方案4】:您可以使用以下代码来适应您的系统屏幕并且任务栏可见。
private void Form1_Load(object sender, EventArgs e)
// hide max,min and close button at top right of Window
this.FormBorderStyle = FormBorderStyle.None;
// fill the screen
this.Bounds = Screen.PrimaryScreen.Bounds;
无需使用:
this.TopMost = true;
该行干扰alt+tab
切换到其他应用程序。 (“TopMost”表示该窗口位于其他窗口的顶部,除非它们也被标记为“TopMost”。)
【讨论】:
【参考方案5】:我最近制作了一个 Mediaplayer 应用程序,我使用 API 调用确保在程序全屏运行时隐藏任务栏,然后在程序未全屏或没有焦点或退出时恢复任务栏。
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Integer, ByVal nCmdShow As Integer) As Integer
Sub HideTrayBar()
Try
Dim tWnd As Integer = 0
Dim bWnd As Integer = 0
tWnd = FindWindow("Shell_TrayWnd", vbNullString)
bWnd = FindWindowEx(tWnd, bWnd, "BUTTON", vbNullString)
ShowWindow(tWnd, 0)
ShowWindow(bWnd, 0)
Catch ex As Exception
'Error hiding the taskbar, do what you want here..'
End Try
End Sub
Sub ShowTraybar()
Try
Dim tWnd As Integer = 0
Dim bWnd As Integer = 0
tWnd = FindWindow("Shell_TrayWnd", vbNullString)
bWnd = FindWindowEx(tWnd, bWnd, "BUTTON", vbNullString)
ShowWindow(bWnd, 1)
ShowWindow(tWnd, 1)
Catch ex As Exception
'Error showing the taskbar, do what you want here..'
End Try
End Sub
【讨论】:
如果两个程序这样做会怎样?如果您的程序在有机会取消隐藏任务栏之前就崩溃了怎么办? @Tmdean:在我的情况下,这不是问题,该程序运行在专门用于仅在候诊室屏幕上运行我的程序的机器上。 @Tmdean:关于如果两个程序这样做是有效的,如果处理不当可能会搞砸。【参考方案6】:我研究了 Zingd 的想法,并使其更简单使用。
我还添加了标准 F11 键来切换全屏模式。
设置
现在一切都在 FullScreen 类中,因此您不必在表单中声明一堆变量。您只需在表单的构造函数中实例化一个 FullScreen 对象:
FullScreen fullScreen;
public Form1()
InitializeComponent();
fullScreen = new FullScreen(this);
请注意,这假设在您创建 FullScreen 对象时表单未最大化。
用法
您只需使用类的一项功能来切换全屏模式:
fullScreen.Toggle();
或者如果您需要明确处理:
fullScreen.Enter();
fullScreen.Leave();
代码
using System.Windows.Forms;
class FullScreen
Form TargetForm;
FormWindowState PreviousWindowState;
public FullScreen(Form targetForm)
TargetForm = targetForm;
TargetForm.KeyPreview = true;
TargetForm.KeyDown += TargetForm_KeyDown;
private void TargetForm_KeyDown(object sender, KeyEventArgs e)
if (e.KeyData == Keys.F11)
Toggle();
public void Toggle()
if (TargetForm.WindowState == FormWindowState.Maximized)
Leave();
else
Enter();
public void Enter()
if (TargetForm.WindowState != FormWindowState.Maximized)
PreviousWindowState = TargetForm.WindowState;
TargetForm.WindowState = FormWindowState.Normal;
TargetForm.FormBorderStyle = FormBorderStyle.None;
TargetForm.WindowState = FormWindowState.Maximized;
public void Leave()
TargetForm.FormBorderStyle = FormBorderStyle.Sizable;
TargetForm.WindowState = PreviousWindowState;
【讨论】:
【参考方案7】:您需要将窗口设置为最顶层。
【讨论】:
没有骰子。即使我将窗口设置为最顶部,它也不会覆盖任务栏。 尝试:Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspx 有更多细节,比如 multimon【参考方案8】:我不知道它是否适用于 .NET 2.0,但它适用于 .NET 4.5.2。代码如下:
using System;
using System.Drawing;
using System.Windows.Forms;
public partial class Your_Form_Name : Form
public Your_Form_Name()
InitializeComponent();
// CODE STARTS HERE
private System.Drawing.Size oldsize = new System.Drawing.Size(300, 300);
private System.Drawing.Point oldlocation = new System.Drawing.Point(0, 0);
private System.Windows.Forms.FormWindowState oldstate = System.Windows.Forms.FormWindowState.Normal;
private System.Windows.Forms.FormBorderStyle oldstyle = System.Windows.Forms.FormBorderStyle.Sizable;
private bool fullscreen = false;
/// <summary>
/// Goes to fullscreen or the old state.
/// </summary>
private void UpgradeFullscreen()
if (!fullscreen)
oldsize = this.Size;
oldstate = this.WindowState;
oldstyle = this.FormBorderStyle;
oldlocation = this.Location;
this.WindowState = System.Windows.Forms.FormWindowState.Normal;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Bounds = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
fullscreen = true;
else
this.Location = oldlocation;
this.WindowState = oldstate;
this.FormBorderStyle = oldstyle;
this.Size = oldsize;
fullscreen = false;
// CODE ENDS HERE
用法:
UpgradeFullscreen(); // Goes to fullscreen
UpgradeFullscreen(); // Goes back to normal state
// You don't need arguments.
注意: 您必须将它放在您的表单类中(例如:
partial class Form1 : Form /* Code goes here */
),否则它将不起作用,因为如果您不将它放在任何表单上,代码this
将创建一个异常。
【讨论】:
【参考方案9】:在表单移动事件上添加:
private void Frm_Move (object sender, EventArgs e)
Top = 0; Left = 0;
Size = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
【讨论】:
【参考方案10】:如果您想保留表单的边框并让它覆盖任务栏,请使用以下内容:
将FormBoarderStyle
设置为FixedSingle
或Fixed3D
将MaximizeBox
设置为False
将WindowState
设置为Maximized
【讨论】:
以上是关于winform 界面全屏的主要内容,如果未能解决你的问题,请参考以下文章