简体   繁体   English

绘制或隐藏控制框以实现无边界形式,同时最大化和最小化

[英]Paint or Hide Control Box for Borderless Form while maximize and minimize

I've attached a small example about the issue. 我已附上一个有关此问题的小例子。 How can I hide the control box completely during Maximize and Minimize the Borderless Form 在最大化和最小化无边界表单期间如何完全隐藏控制框

using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Security;
using System.Threading;

namespace TalkTime
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private const int WM_NCPAINT = 0x0085;
    protected override void WndProc(ref Message m)
    {

        int message = m.Msg;
        switch (m.Msg)
        {
            case WM_NCPAINT:
                {

                    Thread.Sleep(100);

                    return;
                }
        }
        base.WndProc(ref m);
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.Style |= 0x20000;
            return cp;
        }
    }
}
}

I put the thread to show where is the problem exactly. 我把线程显示出确切的问题出在哪里。

The black rectangle which is I guess related to the controlbox and form name will appear before the form while I want to hide it completely while maximizing and minimizing. 我想与控制箱和表单名称有关的黑色矩形会出现在表单之前,而我想在最大化和最小化时完全隐藏它。

例

I can confirm the issue. 我可以确认这个问题。 When restoring a border-less Form from minimized state, a ghost of a title-bar shows at top-left of the window for a very short time. 从最小化状态还原无边界Form ,很短的时间在窗口的左上方会显示标题栏的重影。

Reproducing the issue 重现问题

To reproduce the problem, it's enough to create a border-less form by setting FormBorderStyle property to None and then minimize and restore it in a timer. 要重现该问题,只需将FormBorderStyle属性设置为None ,然后在计时器中最小化和还原它,即可创建无边界表单。 Start the program by showing the form and look at top-left of the window, after restore. 还原后,显示表单启动程序,并在窗口的左上方查看。

using System;
using System.Windows.Forms;
class Form1 : Form
{
    public Form1()
    {
        var timer = new Timer() { Interval = 1000 };
        this.Text = "Some Text";
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        timer.Tick += (x, y) =>
        {
            if (this.WindowState != FormWindowState.Minimized)
                this.WindowState = FormWindowState.Minimized;
            else
                this.WindowState = FormWindowState.Normal;
        };
        timer.Start();
    }
}

Workaround 解决方法

Here is the workaround which I used to remove that flicker. 这是我用来消除闪烁的解决方法。 It's enough to add the event handler to above Form1 class and register it for Activated event this.Activated += Form1_Activated; 将事件处理程序添加到上面的Form1类中并为Activated事件注册它this.Activated += Form1_Activated; .

private void Form1_Activated(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
        this.Hide();
    this.BeginInvoke(new Action(() =>
    {
        if (this.WindowState != FormWindowState.Minimized && !Visible)
            this.Show();
    }));
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM