我的目标是防止用户通过鼠标移动表单时部分或全部隐藏我的表单。例如,如果我的桌面分辨率为 1024x768,则以下将是表单位置属性坐标的“x/y”最小/最大值:0、1024 - form.width、0、768 - form.height。
我使用一些本机 APi 来完成所有这些并且一切正常,但我经常注意到我的表单刷新(闪烁)不好(我正在管理所有 form_move 事件)。
似乎SuspendLayout
方法不能正常工作,否则表单移动事件不会触发每个更改的像素,但可能不止一个(请参阅下面的代码以了解我的意思)。
我的代码如下所示:
private void Form1_Move(object sender, EventArgs e)
{
this.SuspendLayout();
// Desktop Resolution (API utility)
int x = Desktop.GetXResolution();
int y = Desktop.GetYResolution();
// Taskbar Info (API utility)
Taskbar tb = new Taskbar();
int minX = 0;
int maxX = x - this.Width;
int minY = 0;
int maxY = y - this.Height;
if (!tb.AutoHide)
{
if (tb.Position != TaskbarPosition.Unknown && !tb.Size.IsEmpty)
{
if (tb.Position == TaskbarPosition.Top) minY += tb.Size.Height;
switch (tb.Position)
{
case TaskbarPosition.Top: minY = tb.Size.Height; break;
case TaskbarPosition.Bottom: maxY -= tb.Size.Height; break;
case TaskbarPosition.Left: minX = tb.Size.Width; break;
case TaskbarPosition.Right: maxX -= tb.Size.Width; break;
}
}
}
// Restore X Position
if (this.Location.X < minX) this.Location = new Point(minX, this.Location.Y);
if (this.Location.X > maxX) this.Location = new Point(maxX, this.Location.Y);
// Restore Y Poistion
if (this.Location.Y < minY) this.Location = new Point(this.Location.X, minY);
if (this.Location.Y > maxY) this.Location = new Point(this.Location.X, maxY);
this.ResumeLayout(false);
}
正如我已经说过的,当我恢复 Location 属性时,我的 winForm 通常会闪烁。
任何建议将不胜感激。