2010-04-22 4 views
3

일부 상황에서는 제목 표시 줄의 닫기 버튼의 동작을 차단하고 싶습니다. 문제는 MDI 응용 프로그램이므로 각 폼에 코드를 추가하여 Closing 이벤트 처리기에서 작업을 취소해야하는 것으로 보입니다. 어린이 양식이 처음으로 행사를받는 것으로 보입니다. 한 곳에서 코드를 추가하여 닫기 작업을 취소 할 수있는 방법이 없습니다. 친밀한 사건이 어떻게 어린이 양식에 전파되는지에 대한 정보는 환영받을 것이다. 우리가하고 싶은 일을하는 간단한 방법이 있습니까?소스에서 닫기 (큰 X) 버튼을 처리하는 방법은 무엇입니까?

당신이 동작을 재정의 한 BaseFormsClass를 생성 한 다음 새 BaseFormsClass에서 클래스를 서브 클래스 :

+2

양식을 하위 클래스로 작성하고 닫을 코드를 작성한 다음 하위 폼에 대신 사용할 수 있습니다. –

+0

@Michael. 어려움은 레거시 응용 프로그램이며 많은 Forms가 이미 구현되어 있습니다. 계승 된 클래스를 변경하는 것은 그렇게 어렵지 않습니다. 문제는 그 클래스들 각각이'Closing' 이벤트에 핸들러를 가지고 있다는 것입니다. 상속 된 클래스에서 호출 된 다른 사용자 지정 이벤트에 바인딩 할 수 있습니다. 나는 여전히 더 나은 해결책을 원하지만 그것이 지금까지 얻은 최선이다. –

답변

3

Windows에서는이 작업을 수행 할 수있는 방법을 제공합니다. 시스템 메뉴를 사용하여 문제를 해결할 수 있습니다. 멋진 피드백을 제공하기 때문에 닫기 버튼이 실제로 비활성화 된 것처럼 보일 것입니다. 시스템 메뉴에서 SC_CLOSE 명령을 비활성화 할 수 있습니다. 샘플 양식으로 가장 잘 보여 주면 버튼을 눌러 시작하십시오.

using System.Runtime.InteropServices; 
... 

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     button1.Click += new EventHandler(button1_Click); 
    } 

    private bool mCloseEnabled = true; 
    public bool CloseEnabled { 
     get { return mCloseEnabled; } 
     set { 
      if (value == mCloseEnabled) return; 
      mCloseEnabled = value; 
      setSystemMenu(); 
     } 
    } 

    protected override void OnHandleCreated(EventArgs e) { 
     base.OnHandleCreated(e); 
     setSystemMenu(); 
    } 
    private void setSystemMenu() { 
     IntPtr menu = GetSystemMenu(this.Handle, false); 
     EnableMenuItem(menu, SC_CLOSE, mCloseEnabled ? 0 : 1); 
    } 
    private const int SC_CLOSE = 0xf060; 
    [DllImport("user32.dll")] 
    private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool revert); 
    [DllImport("user32.dll")] 
    private static extern int EnableMenuItem(IntPtr hMenu, int IDEnableItem, int wEnable); 

    private void button1_Click(object sender, EventArgs e) { 
     CloseEnabled = !CloseEnabled; 
    } 
} 
+0

그것이 내가 마침내 사용한 해결책입니다. 그것은 위대한 작품. 감사. –

1

마이클은 이미 (바로 답변을 여기에 추가 할) 코멘트에 대답을 썼다.

+0

나는 방금 Michael에게 대답했다. –

+0

WM_CLOSE 창 메시지를 가로 챌 수 있습니다. 그러나 말 그대로 기존의 양식이 수천 가지가 아니라면 기본 클래스 방식이 가장 쉽고 빠른 방법이라고 생각합니다. – Foxfire

관련 문제