2016-08-10 2 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 버튼을 사용하여'최소화 '와'최대화'및'복원 '을 수행했습니다. 또한 최대화 된 상태와 정상 상태 모두에서 최소화 한 후 작업 표시 줄을 사용하여 양식을 이전 상태로 복원합니다. –

+0

CreateParams를 사용하여 작업 표시 줄 버튼에서 복원 및 최소화를 사용할 수 있습니다. 아직도 나는 당신의 제안에 근거한 동일한 이슈를 가지고있다. @Reza Aghaei –

+0

복제 코드와 해결 방법을 게시 했으므로 간단히 확인할 수 있습니다. –

관련 문제