为无边框forms绘制或隐藏控制框,同时最大化和最小化

我附上了一个关于这个问题的小例子。 如何在最大化和最小化无边框窗体期间完全隐藏控制框

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

我把线程放在显示问题的确切位置。

我认为与控件箱和表单名称相关的黑色矩形将出现在表单之前,而我想在最大化和最小化时完全隐藏它。

例

我可以确认这个问题。 从最小化状态恢复无边框Form ,标题栏的重影显示在窗口的左上角很短的时间。

再现问题

要重现该问题,通过将FormBorderStyle属性设置为None ,然后在计时器中最小化并恢复它,就可以创建无边框表单。 通过显示表单启动程序,并在还原后查看窗口的左上角。

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

解决方法

这是我用来消除闪烁的解决方法。 将事件处理程序添加到上面的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(); })); }