我附上了一个关于这个问题的小例子。如何在最大化和最小化无边框窗体期间完全隐藏控件框
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;
}
}
}
}
我把线程准确地显示问题在哪里。
我认为与控件箱和表单名称相关的黑色矩形将出现在表单之前,而我想在最大化和最小化时完全隐藏它。
答案 0 :(得分:2)
我可以确认这个问题。从最小化状态恢复无边界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();
}));
}