하지 무엇으로 기본 폼에서
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로 보내면이 방법을 실험 해 볼 수 있습니다. 그러나 폼을 닫는 데 걸린 시간을 몇 초 정도면 줄일 수있는 방법이 있다고 생각합니다. 그러한 해킹의 아마 모르는 동작의 비용이 상당합니다.
DialogResult를 설정하면 양식이 닫힙니다. 숨겨진 후속 호출이 문제를 일으킨다는 것이 내 생각입니다. 전화를 끊으면 어떻게됩니까? – ctacke
신청서의 Main 방법을 보여줄 수 있습니까? (어디 Application.Run (...) 전화) – Alan
안녕하세요 앨런, 주된 방법을 포함하도록 게시물을 편집 – codex10