사용자가 양식의 창 밖에서 클릭 할 때 양식을 닫으려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/298491

  •  08-07-2019
  •  | 
  •  

문제

사용자가 외부의 어느 곳에서나 클릭하면 시스템을 닫고 싶습니다. ImessageFilter를 사용하려고 시도했지만조차도 프리 필르터링으로 전달되지 않았습니다. 양식 창 밖에서 클릭을 어떻게 받습니까?

도움이 되었습니까?

해결책 2

감사합니다 p-daddy 안에 이 질문, 나는 ShowDialog를 사용할 수있는이 솔루션을 찾았습니다.

protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    this.Capture = true;
}

protected override void OnCaptureChanged(EventArgs e)
{
    if (!this.Capture)
    {
        if (!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position))
        {
            this.Close();
        }
        else
        {
            this.Capture = true;
        }
    }

    base.OnCaptureChanged(e);
}

다른 팁

양식의 비활성화 이벤트에서 "this.close ()"를 넣으십시오. Windows의 다른 곳을 클릭하자마자 양식이 닫힙니다.

업데이트 : 지금 당장 가지고있는 것은 볼륨 버튼이라고 생각합니다. 내부에서 클릭 이벤트 내부에서 VolumesLider 양식의 인스턴스를 생성하고 사용자가 팝업 양식을 닫을 때까지 차단하는 ShowDialog ()를 호출하여 나타납니다. 다음 줄에서는 사용자가 선택한 볼륨을 읽고 프로그램에서 사용합니다.

이것은 괜찮지 만, 당신이 알았을 때, 그것은 메인 프로그램으로 돌아 가기 위해 사용자가 팝업을 명시 적으로 닫아야합니다. show ()는 팝업 양식에서 여기에서 실제로 사용하려는 메소드이지만 Show ()는 차단하지 않으므로 새로운 볼륨이 무엇인지 모르면 메인 양식의 클릭 이벤트를 다시 마무리합니다.

간단한 해결책은 다음과 같은 주요 형태에 공개 메소드를 만드는 것입니다.

public void SetVolume(int volume)
{
    // do something with the volume - whatever you did before with it
}

그런 다음 볼륨 버튼의 클릭 이벤트 (기본 양식)에서 볼륨 슬라이더를처럼 보이게합니다.

VolumeSlider slider = new VolumeSlider();
slider.Show(this); // the "this" is needed for the next step

Volumeslider 양식에서 사용자가 (추측) 스크롤 바를 작동하면이 코드를 Scrollbar의 ValueChanged 이벤트에 넣습니다.

MainForm owner = (MainForm)this.Owner;
owner.SetVolume(scrollbar.Value);

그런 다음 Volumeslider Form의 비활성화 이벤트에서 위에서 언급 한 것처럼 this.close ()를 넣을 수 있습니다. 그러면 당신의 양식은 예상대로 작동합니다.

Simon의 솔루션으로 NOAM이 설명하는 것과 같은 문제가있었습니다. 다음 코드를 사용하면 "클릭"문제를 피하십시오 ...

protected override void WndProc(ref Message m)
{    
    base.WndProc(ref m);

    // if click outside dialog -> Close Dlg
    if (m.Msg == NativeConstants.WM_NCACTIVATE) //0x86
    {
        if (this.Visible)
        {
            if (!this.RectangleToScreen(this.DisplayRectangle).Contains(Cursor.Position))
                this.Close();
        }
    }
}

MDI 응용 프로그램에서 자식 형식 인 경우, 부모 형식으로 클릭을 가두는 경우 솔루션이 지저분해질 수 있습니다.

어쨌든 당신이 제안한 것이 직관적 인 UI 행동을 나타내는 것을 확신하지 못합니다. 그것이 최고의 디자인이라고 확신합니까?

컨트롤과 상호 작용할 수 있다는 점을 제외하고는 메뉴처럼 약간 동작하는 팝업 창을 만들려고한다면 ToolStrip 드롭 다운 내부에서 USERControl을 호스팅 할 수 있습니다.

단순히 방법 : Form1 에서이 코드를 사용하여 Form2를 호출합니다.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles     Button1.Click
    Form2.Owner = Me
    Form2.Show()
End Sub

그런 다음이 코드를 Form1에서 다시 사용하십시오.

Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    If Form2.IsHandleCreated = True Then
        Form2.Close()
    End If
End Sub

이것은 간단합니다 :

private void button1_Click(object sender, EventArgs e)
    {
        Form f = new Form();
        f.LostFocus +=new EventHandler(f_LostFocus);
        f.Show();
    }

    void f_LostFocus(object sender, EventArgs e)
    {
        Form f = sender as Form;
        f.Close();
        f.Dispose();
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top