2013-05-03 4 views
1

최근에 간단한 사용자 정의 메시지 상자가 생성되었습니다. ShowDialog()를 사용하여 호출 한 또 다른 형식입니다.NET CF - 모달 폼을 숨길 때 응용 프로그램이 닫힙니다.

DialogResult 값을 설정하고 this.Hide()를 사용하여 양식을 숨기는 두 개의 YES/NO 버튼이 있습니다.

그러나 이렇게하면 전체 응용 프로그램이 닫힙니다. this.Close()를 사용할 때 발생하지 않습니다. 내가 Hide를 선택한 이유는 응답이 더 빨라 보이는 것 때문입니다. 닫기를 사용하면 메시지 상자 양식이 닫히기 2-3 초 전까지 지속됩니다.

MQMessageBox.Show("Warning", "Hello World"); 
    this.Show(); //Adding this call, will show the main form again. Without this call, the mobile will show the Today Screen making it appear the app has crashed. 

홈페이지 방법은 다음과 같습니다 : 아래

일부 코드입니다 : 나는 그것을 알고

 MQMainForm mainForm = new MQMainForm(); 
     Application.Run(mainForm); 
+1

DialogResult를 설정하면 양식이 닫힙니다. 숨겨진 후속 호출이 문제를 일으킨다는 것이 내 생각입니다. 전화를 끊으면 어떻게됩니까? – ctacke

+0

신청서의 Main 방법을 보여줄 수 있습니까? (어디 Application.Run (...) 전화) – Alan

+0

안녕하세요 앨런, 주된 방법을 포함하도록 게시물을 편집 – codex10

답변

1

하지 무엇으로 기본 폼에서

public static void Init() 
    { 
     if (_instance == null) 
     { 
      _instance = new MQMessageBox(); 
      _instance.MQButtonYes.Click += MQButtonYes_Click; 
      _instance.MQButtonNo.Click += MQButtonNo_Click; 
     } 
    } 

    public static DialogResult Show(string caption, string message) 
    { 
     Init(); 

     _instance.Caption = caption; 
     _instance.Message = message; 

     DialogResult result = _instance.ShowDialog(); 

     return result; 
    } 

    private void MQButtonYes_Click(object sender, EventArgs e) 
    { 
     this.DialogResult = DialogResult.Yes; 
     this.Hide(); 
    } 

    private void MQButtonNo_Click(object sender, EventArgs e) 
    { 
     this.DialogResult = DialogResult.No; 
     this.Hide(); 
    } 

, 그 호출되고 듣고 싶지만 다음 코드를 호출하는 것은 실제로 유효하지 않습니다.

private void MQButtonNo_Click(object sender, EventArgs e) 
{ 
    this.DialogResult = DialogResult.No; 
    this.Hide(); 
} 

DialogResult 설정이 Form.Close()과 같지 않기 때문입니다. Compact Framework와 Reflector의 정규 프레임 워크에서 Form을 구현하는 방법을 살펴 보았습니다. 불행히도 Compact Framework에서 Form의 정확한 구현을 볼 수 없었지만 이와 비슷한 정규 구현을 조사 할 수있었습니다.

Close의 구현은 Form이 닫히고 윈도우에 WM_CLOSE를 보내는 플래그를 설정합니다. DialogResult을 설정하면 양식에 전용 변수 만 설정됩니다. 자, 당신이 생각하는 것을 알고 있습니다. "하지만, 나는 DialogResult이 양식을 닫는다는 것을 알고 있습니다! 모두들 알고 있습니다!". 이 동작을 이해하는 핵심은 이것이 어떻게 발생하는지입니다. Form.ShowDialog()을 호출하면 모달 형식에 대한 새 창 메시지 루프가 만들어집니다. 창 메시지를 처리하는 루프를 만듭니다. 이 루프의 종료 조건에는 닫는 동안 설정 한 부울에서 사용자가 Close()를 호출했는지 여부 및/또는 DialogResult이 설정되어 있는지 여부가 확인됩니다. 따라서 DialogResult을 설정하면 메시지 루프가 종료되고 양식이 닫힙니다.

내가 말할 수있는 것은 폼을 숨기는 문제는 DialogResult을 설정한다는 것이지만 폼을 숨길 때 윈도우가 더 이상 윈도우 메시지를 수신하지 않는다고 생각합니다. 따라서 메시지 루프는 DialogResult의 값을 확인하기 전에 다음 메시지를 기다리고있을 것입니다.

폼에 대한 핸들을 가져 와서 WM_CLOSE로 보내면이 방법을 실험 해 볼 수 있습니다. 그러나 폼을 닫는 데 걸린 시간을 몇 초 정도면 줄일 수있는 방법이 있다고 생각합니다. 그러한 해킹의 아마 모르는 동작의 비용이 상당합니다.