2016-08-10 5 views
2

Я приложил небольшой пример по проблеме. Как я могу скрыть блок управления полностью во время развернуть или свернуть Borderless формуКраска или скрыть блок управления для формы без полей при максимальном и минимальном размере

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

Я положил нить, чтобы показать, где проблема точно.

Черный прямоугольник, который, как я полагаю, связан с именем элемента управления и формой, будет отображаться перед формой, пока я хочу полностью скрыть его при максимализации и минимизации.

Example

+0

Форма без полей не имеет блока управления. – LarsTech

ответ

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

В моих тестах я удалил «CreateParams» переопределить и выполнил «Минимизировать» и «Максимизировать» и «Восстановить», используя 3 кнопки в форме. Также после минимизации как в максимизированном, так и в нормальном состоянии используется панель задач для восстановления формы до предыдущего состояния. –

+0

Я использую CreateParams, чтобы иметь возможность использовать восстановление и сворачивать с панели задач. Тем не менее у меня такая же проблема, исходя из вашего предложения. @Reza Aghaei –

+0

Я отправил код воспроизведения и обходной путь, вы можете просто проверить его. –