【问题标题】:Paint or Hide Control Box for Borderless Form while maximize and minimize在最大化和最小化的同时绘制或隐藏无边界表单的控制框
【发布时间】:2016-08-10 19:15:59
【问题描述】:

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

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

我把线程显示在哪里确切地显示问题。

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

【问题讨论】:

  • 无边框表单没有控制框。

标签: c# winforms winforms-interop


【解决方案1】:

我可以确认问题。当从最小化状态恢复无边框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();
    }));
}

【讨论】:

  • 在我的测试中,我删除了 CreateParams 覆盖并使用表单上的 3 个按钮执行 MinimizeMaximizeRestore。同样在最大化和正常状态下最小化后,使用任务栏将表单恢复到以前的状态。
  • 我正在使用 CreateParams 来使用任务栏按钮的还原和最小化。根据你的建议,我仍然有同样的问题。 @Reza Aghaei
  • 我贴了复制代码和解决方法,你可以简单检查一下。
  • 而且我不想使用 Show() Hide() 方法,因为它正在删除任务栏按钮。
  • .. 如果将计时器间隔减少到 100 毫秒,您会发现问题仍未解决。如果您删除计时器并使用窗口样式启用 WS_MINIMIZEBOX,并尝试从任务栏激活它,您将在那里看到问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
相关资源
最近更新 更多