c# - toda - ¿Cómo hago para que una aplicación de WinForms pase a pantalla completa?
maximizar formulario c# (7)
Tengo una aplicación WinForms que intento hacer en pantalla completa (algo así como lo que VS hace en modo de pantalla completa).
Actualmente estoy configurando FormBorderStyle
en None
y WindowState
en Maximized
que me da un poco más de espacio, pero no cubre la barra de tareas si está visible.
¿Qué debo hacer para usar ese espacio también?
Para obtener puntos de bonificación, ¿hay algo que pueda hacer para que mi MenuStrip
oculte automáticamente y también renuncie a ese espacio?
Una solución probada y simple
He estado buscando una respuesta para esta pregunta en SO y en algunos otros sitios, pero uno me dio una respuesta que fue muy compleja y otras respuestas simplemente no funcionan correctamente, así que después de muchas pruebas de código resolví este rompecabezas.
Nota: estoy usando Windows 8 y mi barra de tareas no está en modo de ocultación automática.
Descubrí que establecer WindowState en Normal antes de realizar cualquier modificación detendrá el error con la barra de tareas no cubierta.
El código
Creé esta clase que tiene dos métodos, la primera entra en el "modo de pantalla completa" y la segunda deja el "modo de pantalla completa". Así que solo necesita crear un objeto de esta clase y pasar el Formulario que desea establecer a pantalla completa como argumento para el método EnterFullScreenMode o para el método 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;
}
}
Ejemplo de uso
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;
}
}
He colocado esta misma respuesta en otra pregunta que no estoy seguro si es un duplicado o no de este. (Enlace a la otra pregunta: ¿Cómo mostrar un formulario de Windows en pantalla completa en la parte superior de la barra de tareas? )
A la pregunta base, lo siguiente hará el truco (ocultando la barra de tareas)
private void Form1_Load(object sender, EventArgs e)
{
this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
}
Pero, curiosamente, si intercambia esas dos últimas líneas, la barra de tareas permanece visible. Creo que la secuencia de estas acciones será difícil de controlar con la ventana de propiedades.
Debes configurar tu ventana para que sea la más alta.
Hace poco hice una aplicación de MediaPlayer y usé API-calls para asegurarme de que la barra de tareas estaba oculta cuando el programa se ejecutaba a pantalla completa y luego restauré la barra de tareas cuando el programa no estaba en pantalla completa o no tenía foco o se salía.
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
No sé si funcionará en .NET 2.0, pero me funcionó en .NET 4.5.2. Aquí está el código:
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
}
Uso:
UpgradeFullscreen(); // Goes to fullscreen
UpgradeFullscreen(); // Goes back to normal state
// You don''t need arguments.
Aviso: DEBE colocarlo dentro de la clase de su Formulario (Ejemplo:
partial class Form1 : Form { /* Code goes here */ }
) o no funcionará porque si no lo coloca en ninguna forma, el código creará un excepción.
Puede usar el siguiente código para adaptarse a la pantalla de su sistema y la barra de tareas está visible.
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;
}
No es necesario usar:
this.TopMost = true;
Esa línea interfiere con alt+tab
para cambiar a otra aplicación. ("TopMost" significa que la ventana permanece encima de otras ventanas, a menos que también estén marcadas como "TopMost").
Y para la pregunta menustrip, intenta establecer
MenuStrip1.Parent = Nothing
cuando está en modo de pantalla completa, debería desaparecer.
Y al salir del modo de pantalla completa, restablezca el menustrip1.parent
al formulario nuevamente y el menú secundario volverá a ser normal.