ฉันจะทำให้แอป WinForms เป็นแบบเต็มหน้าจอได้อย่างไร


109

ฉันมีแอป WinForms ที่ฉันพยายามทำให้เต็มหน้าจอ (ค่อนข้างเหมือนกับสิ่งที่ VS ทำในโหมดเต็มหน้าจอ)

ขณะนี้ฉันกำลังตั้งค่าFormBorderStyleไปNoneและWindowStateการMaximizedที่ให้ฉันเป็นพื้นที่เล็ก ๆ น้อย ๆ แต่ก็ไม่ได้ครอบคลุมมากกว่าแถบงานถ้ามันจะมองเห็นได้

ฉันต้องทำอะไรบ้างเพื่อใช้พื้นที่นั้นด้วย

สำหรับคะแนนโบนัสมีอะไรบ้างที่ฉันสามารถทำให้MenuStripซ่อนอัตโนมัติเพื่อสละพื้นที่นั้นได้ด้วย

คำตอบ:


150

สำหรับคำถามพื้นฐานต่อไปนี้จะทำเคล็ดลับ (การซ่อนแถบงาน)

private void Form1_Load(object sender, EventArgs e)
{
    this.TopMost = true;
    this.FormBorderStyle = FormBorderStyle.None;
    this.WindowState = FormWindowState.Maximized;
}

แต่ที่น่าสนใจคือถ้าคุณสลับสองบรรทัดสุดท้ายแถบงานจะยังคงมองเห็นได้ ฉันคิดว่าลำดับของการกระทำเหล่านี้จะควบคุมได้ยากด้วยหน้าต่างคุณสมบัติ


4
ปัญหาการสั่งซื้อคือสาเหตุที่ทำให้ฉันไม่ได้ผล ฉันกำลังตั้งค่าคุณสมบัติตามลำดับนั้นจริง ๆ แต่เมื่อขยายแบบฟอร์มแล้วการตั้งค่าเส้นขอบเป็นไม่มีจะไม่ขยายจนครอบคลุมแถบงาน ฉันแก้ไขโดย "กู้คืน" แบบฟอร์มที่เปลี่ยนเส้นขอบแล้วขยายใหญ่สุด

3
ฉันมีมันตามลำดับที่ถูกต้องและมันไม่ได้ผล แถบงานสามารถมองเห็นได้ตลอดเวลาและแอปไม่ได้อยู่ด้านล่างเพียงแค่ปล่อยให้ทาสก์บาร์ว่างไว้ที่นั่น (Win7)
Preza8

@ Preza8 - อ่านความคิดเห็นของ Grady ตรวจสอบว่าตรงกับสถานการณ์ของคุณหรือไม่
Henk Holterman

1
ฉันขอโทษฉันไม่ได้ออนไลน์ที่นี่มาเป็นเวลานานและฉันลืมไปแล้วว่าทำอย่างไร แต่ฉันจำได้ว่าหลังจากลองเรียงลำดับแบบสุ่มของคำสั่งเหล่านั้นช่วยได้
Preza8

หมายเหตุ: ด้วยเหตุผลบางอย่างฉันต้องตั้งค่าคุณสมบัติและใส่รหัสนี้
Joe Phillips

22

โซลูชันที่ผ่านการทดสอบและเรียบง่าย

ฉันกำลังมองหาคำตอบสำหรับคำถามนี้ใน SO และไซต์อื่น ๆ แต่มีคนหนึ่งที่ให้คำตอบนั้นซับซ้อนมากสำหรับฉันและคำตอบอื่น ๆ ก็ทำงานไม่ถูกต้องดังนั้นหลังจากการทดสอบโค้ดเป็นจำนวนมากฉันก็ไขปริศนานี้ได้

หมายเหตุ: ฉันใช้Windows 8และแถบงานของฉันไม่ได้อยู่ในโหมดซ่อนอัตโนมัติ

ฉันค้นพบว่าการตั้งค่า WindowState เป็น Normal ก่อนดำเนินการแก้ไขใด ๆ จะหยุดข้อผิดพลาดด้วยแถบงานที่ไม่ได้ปิดไว้

รหัส

ฉันสร้างคลาสนี้โดยมีสองวิธีการเข้าสู่ครั้งแรกใน "โหมดเต็มหน้าจอ" และครั้งที่สองออกจาก "โหมดเต็มหน้าจอ" ดังนั้นคุณต้องสร้างออบเจ็กต์ของคลาสนี้และส่งแบบฟอร์มที่คุณต้องการตั้งค่าเต็มหน้าจอเป็นอาร์กิวเมนต์ไปยังเมธอด 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;
        }
    }

ฉันได้วางคำตอบเดียวกันนี้ไว้กับคำถามอื่นที่ฉันไม่แน่ใจว่าซ้ำกันหรือไม่ของคำถามนี้ (ลิงก์ไปยังคำถามอื่น: จะแสดงฟอร์ม Windows แบบเต็มหน้าจอที่ด้านบนของแถบงานได้อย่างไร )


2
ด้วยความอยากรู้อยากเห็นทำไมคุณถึงมีทั้ง enum เพื่ออธิบายเงื่อนไขจริง / เท็จ?
Nathan Ridley

2
ฉันเขียนสิ่งนี้ไว้เมื่อนานมาแล้วตอนที่ฉันเอาแต่จดจ่อที่จะเขียนโค้ดโปรดระลึกถึงความโง่เขลาของฉัน มันไม่สมเหตุสมผลเลยและฉันควรจะใช้ประเภทบูลีน
Zignd

มันใช้ได้ผลสำหรับฉันและฉันต้องตั้งค่าtargetForm.WindowState = FormWindowState.Normal;ที่จุดเริ่มต้นของการออกจากแบบเต็มหน้าจอด้วย สำหรับการจัดการกรณีที่ผู้ใช้แสดงเต็มหน้าจอจากหน้าต่างที่ขยายใหญ่สุด
gneri

6

และสำหรับเมนูคำถามลองตั้งค่า

MenuStrip1.Parent = Nothing

เมื่ออยู่ในโหมดเต็มหน้าจอมันควรจะหายไป

และเมื่อออกจากโหมดเต็มหน้าจอให้รีเซ็ตเป็นmenustrip1.parentแบบฟอร์มอีกครั้งจากนั้นเมนูจะเป็นปกติอีกครั้ง


5

คุณสามารถใช้รหัสต่อไปนี้เพื่อให้พอดีกับหน้าจอระบบของคุณและแถบงานสามารถมองเห็นได้

    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" ด้วย)


4

ฉันเพิ่งสร้างแอปพลิเคชัน 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

6
เกิดอะไรขึ้นถ้าสองโปรแกรมทำสิ่งนี้? จะเกิดอะไรขึ้นหากโปรแกรมของคุณขัดข้องก่อนที่จะมีโอกาสยกเลิกการซ่อนแถบงาน?
Tmdean

@Tmdean: ในกรณีของฉันมันไม่ใช่ปัญหาโปรแกรมนี้กำลังทำงานบน mashines ที่ทุ่มเทเพื่อเรียกใช้เฉพาะโปรแกรมของฉันบนหน้าจอในห้องรอ
Stefan

@Tmdean: ประเด็นเกี่ยวกับว่าสองโปรแกรมนี้ถูกต้องหรือไม่มันอาจทำให้สิ่งต่าง ๆ ยุ่งเหยิงได้หากไม่ได้รับการจัดการอย่างถูกต้อง
Stefan

2

คุณต้องตั้งค่าหน้าต่างให้อยู่บนสุด


1
ไม่มีลูกเต๋า แม้ว่าฉันจะตั้งค่าหน้าต่างให้อยู่บนสุด แต่ก็ไม่ได้ปกปิดแถบงาน

3
ลอง: Bounds = Screen.PrimaryScreen.Bounds; codeproject.com/KB/cs/scrframework.aspxมีรายละเอียดเพิ่มเติมเช่นสำหรับ multimon
Tron

1

ฉันไม่รู้ว่ามันจะใช้งานได้บน. 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จะสร้างข้อยกเว้น


1

ในกิจกรรมการย้ายแบบฟอร์มให้เพิ่มสิ่งนี้:

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);
}

1

ฉันทำงานกับ Zingd idea และทำให้ง่ายขึ้นที่จะใช้

ฉันยังเพิ่มคีย์ F11มาตรฐานเพื่อสลับโหมดเต็มหน้าจอ

ติดตั้ง

ตอนนี้ทุกอย่างอยู่ในคลาส FullScreen ดังนั้นคุณไม่จำเป็นต้องประกาศตัวแปรมากมายในแบบฟอร์มของคุณ คุณเพียงแค่ใส่วัตถุ FullScreen ในตัวสร้างแบบฟอร์มของคุณ:

FullScreen fullScreen;

public Form1()
{
    InitializeComponent();
    fullScreen = new FullScreen(this);
}

โปรดทราบว่าสิ่งนี้ถือว่าฟอร์มไม่ได้ถูกขยายให้ใหญ่สุดเมื่อคุณสร้างวัตถุ FullScreen

การใช้งาน

คุณเพียงแค่ใช้หนึ่งในฟังก์ชันของ classe เพื่อสลับโหมดเต็มหน้าจอ:

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;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.