2009-11-03 7 views

Odpowiedz

116

można zastąpić OnFormClosing, aby to zrobić. Tylko uważaj, aby nie robić niczego zbyt nieoczekiwanego, ponieważ kliknięcie przycisku "X" w celu zamknięcia jest dobrze zrozumiałym zachowaniem.

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    base.OnFormClosing(e); 

    if (e.CloseReason == CloseReason.WindowsShutDown) return; 

    // Confirm user wants to close 
    switch (MessageBox.Show(this, "Are you sure you want to close?", "Closing", MessageBoxButtons.YesNo)) 
    { 
    case DialogResult.No: 
     e.Cancel = true; 
     break; 
    default: 
     break; 
    }   
} 
+2

Domyślam się, że chce zminimalizować na tacy, ale otrzymujesz +1 ode mnie za mówienie, bądz ostrożny. –

+4

@Jon B - powinieneś sprawdzić przyczynę zamknięcia.Jeśli system Windows się wyłącza, nie chcesz wyświetlać okien dialogowych. –

+1

Zrobiłem to oświadczenie przełącznika, więc nie muszę przewijać w prawo, aby przeczytać prawą stronę '==' –

1

To jest dość często zadawane pytanie. Jedna dobra odpowiedź jest tutaj:

VB.NET overload default functionality when user clicks the X (Close Program)


Jeśli nie czujesz się komfortowo wprowadzenie kodu w przypadku Form_Closing, jedyna inna opcja Jestem świadomy jest „hack”, że mam użyty raz lub dwa razy. Nie powinno być konieczne używanie tego hackowania, ale tutaj jest:


Nie należy używać normalnego przycisku zamykania. Zamiast tego utwórz formularz, aby nie zawierał elementu ControlBox. Możesz to zrobić, ustawiając ControlBox = false na formularzu, w takim przypadku nadal będziesz miał normalny pasek u góry formularza lub możesz ustawić FormBorderStyle formularza na "Brak". Jeśli przejdziesz tę drugą trasę, nie będzie to pasek na górze ani żadna inna widoczna granica, więc będziesz musiał je zasymulować, rysując na formularzu lub używając w sposób artystyczny elementów sterujących Panelem:

Następnie możesz dodać standardowy przycisk i zrobić to wygląd jak przycisk zamknięcia i umieścić oczyszczenia kodu tam. na koniec imprezy przycisk, zadzwoń this.Close() (C#) lub Me.Close() (VB)

+0

Dlaczego nikt nie czułby się komfortowo w obsłudze zdarzenia zamknięcia? IMHO dodając niestandardowy (ale przekonujący) przycisk zamykania nie jest tak banalny (zwłaszcza, gdy bierzesz pod uwagę efekty przejścia i Aero, które normalnie dostajesz bez żadnego bólu). – Groo

+0

W odpowiedzi, z którą się łączyłem, osoba, która odpowiedziała na pytanie, nie chciała użyć zdarzenia Form_Closing z jakiegoś powodu. Nie jestem pewien, jaki był jego powód, ale nie chciał z niego korzystać. Czasy, w których używałem hacka, chciałem po prostu zamknąć przycisk o innym wyglądzie. – David

+0

Innymi słowy, druga odpowiedź była zarówno powiązana (rzetelnie) jak i skopiowana, dlatego połowa odpowiedzi jest nieistotna, a reszta rekomenduje coś, co nie ma tutaj żadnego uzasadnienia. – jwg

10

Albo nadpisać OnFormClosing lub zarejestrować zdarzenia FormClosing.

ten jest przykładem nadrzędne funkcje OnFormClosing w postaci pochodnych:

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    e.Cancel = true; 
} 

Jest to przykład procedury obsługi zdarzenia, aby zatrzymać postać zamykania, które mogą być w dowolnej klasy:

private void FormClosing(object sender,FormClosingEventArgs e) 
{ 
    e.Cancel = true; 
} 

Aby uzyskać bardziej zaawansowane funkcje, należy sprawdzić właściwość CloseReason na formularzu FormClosingEventArgs, aby upewnić się, że wykonano odpowiednią akcję. Możesz wykonać alternatywne działanie tylko wtedy, gdy użytkownik spróbuje zamknąć formularz.

3

Jedną z sytuacji, w której można sobie poradzić z zdarzeniem kliknięcia za pomocą przycisku x, jest użycie formularza będącego pojemnikiem MDI. Dzieje się tak dlatego, że zamykanie i zamykanie imprez odbywa się najpierw z dziećmi, a na końcu z rodzicem. Tak więc w jednym scenariuszu użytkownik klika przycisk x, aby zamknąć aplikację, a rodzic MDI prosi o potwierdzenie. Jeśli zdecyduje się nie zamykać wniosku, ale będzie kontynuował to, co robi, dzieci już przetworzyły zamknięcie, potencjalnie utraciły informacje/wykonały cokolwiek. Jednym z rozwiązań jest przechwycić wiadomość WM_CLOSE z pętli komunikatów systemu Windows w głównym formularzu zgłoszeniowym (tj które zamknięte kończy aplikację) tak:

protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0010) // WM_CLOSE 
     { 
      // If we don't want to close this window 
      if (ShowConfirmation("Are you sure?") != DialogResult.Yes) return; 
     } 

     base.WndProc(ref m); 
    } 
15

Jedno te odpowiedzi brak, a które początkujący są prawdopodobnie szuka bo tak jest, gdy miło jest mieć wydarzenie:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // do something 
} 

Nic nie da się zrobić, dopóki nie zarejestrujesz wydarzenia. Umieścić to w konstruktorze klasy:

this.FormClosing += Form1_FormClosing; 
0
protected override bool ProcessCmdKey(ref Message msg, Keys dataKey) 
    { 
     if (dataKey == Keys.Escape) 
     { 
      this.Close(); 
      //this.Visible = false; 
      //Plus clear values from form, if Visible false. 
     } 
     return base.ProcessCmdKey(ref msg, dataKey); 
    } 
7

jak powiedział Jon B, ale będziesz również sprawdzić za ApplicationExitCall i TaskManagerClosing CloseReason:

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    if ( e.CloseReason == CloseReason.WindowsShutDown 
     ||e.CloseReason == CloseReason.ApplicationExitCall 
     ||e.CloseReason == CloseReason.TaskManagerClosing) { 
     return; 
    } 
    e.Cancel = true; 
    //assuming you want the close-button to only hide the form, 
    //and are overriding the form's OnFormClosing method: 
    this.Hide(); 
} 
-4
  1. Wystarczy przejść do "Program.Designer.cs"
  2. Dowiedz się o funkcji o nazwie protected override void Dispose(bool disposing)
  3. komentarza albo usunąć linia base.Dispose(disposing);
  4. Zamiast tej linii napisać kod dla bliskiej operacji
0

Zaakceptowanych odpowiedź działa całkiem dobrze. Alternatywną metodą, którą użyłem, jest stworzenie metody FormClosing dla głównego formularza. Jest to bardzo podobne do nadpisania. Mój przykład dotyczy aplikacji, która minimalizuje się do zasobnika systemowego po kliknięciu przycisku zamykania formularza.

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.ApplicationExitCall) 
     { 
      return; 
     } 
     else 
     { 
      e.Cancel = true; 
      WindowState = FormWindowState.Minimized; 
     }    
    } 

Pozwoli ALT + F4 lub coś w aplikacji wywołującej Application.Exit();, aby działać normalnie, a kliknięcie przycisku (X) zminimalizuje aplikację.

Powiązane problemy