2016-08-10 4 views
2

私はこの問題について小さな例を付けました。どのように私は、最大化時に完全にコントロールボックスを隠し、私は問題が正確である場所を示すために、スレッドを置くボーダレスフォームボーダレスフォームのコントロールボックスをペイントまたは非表示にして最大化および最小化する

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を最小化状態から復元すると、タイトルバーのゴーストがウィンドウの左上に非常に短時間表示されます。問題を再現するには問題

を再現

、それはNoneFormBorderStyleプロパティを設定することによって、国境のないフォームを作成し、最小限に抑え、タイマーでそれを復元するのに十分です。フォームを表示してプログラムを起動し、復元後にウィンドウの左上を見ます。

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

私のテストでは、 'CreateParams'オーバーライドを削除し、フォーム上の3つのボタンを使って' Minimize'と 'Maximize'と' Restore'を実行しました。また、最大化した状態と通常の状態の両方を最小化した後、タスクバーを使用してフォームを以前の状態に戻しました。 –

+0

私はCreateParamsを使用して、タスクバーのボタンからリストアと最小化を使用できるようにしています。それでも私はあなたの提案に基づいて同じ問題を抱えています。 @Reza Aghaei –

+0

再生コードと回避策を掲載しました。単に確認するだけです。 –

関連する問題