ESC schliesst Dialog



  • und wo genau?



  • In der Dialog-Klasse, die den Dialog beschreibt, der nicht mit ESC beendet werden soll. Wenn Du den Abbrechen-Button noch nicht entfernt hast, kannst Du die OnCancel-Methode einfach mit dem Klassenassistenten erzeugen. Objekt-ID: IDCANCEL
    Nachricht: BN_CLICKED.
    Falls Du den Abbrechen-Button weiter benutzen willst, musst Du ihm hinterher eine andere ID geben. Für diese kannst Du dann wie bei anderen Buttons auch eine OnClick-Methode erzeugen, und dort schreibst Du einfach wieder CDialog::OnCancel() rein.

    viel Erfolg



  • ich habe auch das OnCancel gelöscht/auskommentiert aber es funktioniert nicht

    ausserdem weiss ich nicht genau wo ich suchen soll

    kann mir bitte jemand helfen?

    danke sehr



  • Nu gibt es schon eine schöne Suchfunktion, aber...

    Wer suchet, der findet...



  • ich habe gesucht nur wie soll ich suchen wenn ich nicht weiss wie der jenige die frage formuliert hat? 😃



  • gibts auch ne möglichkeit mit der noch das kleine "x" funktuniert?



  • das wollte ich auch fragen 😃
    weil eben dadurch das X nicht geht 😡



  • Huhu Peoplez

    Solltet Ihr die OnCancel Methode ganz und gar beseitigen so habt Ihr nicht mehr die Möglichkeit über das X den Dialog zu schließen.
    Mit dieser Methode funktioniert das Schließen über das X aber das schließen durch ESC wird verhindert.

    Probiert es aus.

    BOOL CAsbDirectoryDlg::PreTranslateMessage(MSG* pMsg) 
    {
    	// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
        ////////////////////////////////////////////////////////////////
        // Diese Zeile einbauen !!
        if ((pMsg->message == 0x100) && (pMsg->wParam == 27)){return FALSE;}
        ////////////////////////////////////////////////////////////////
    	m_ctlToolTips.RelayEvent(pMsg); // Dies könnt Ihr ignorieren !!!
    	return CDialog::PreTranslateMessage(pMsg);
    }
    

    Gruss Daywalker



  • Wenn du jetzt noch 0x100 durch WM_KEYDOWN ersetzt... 😉



  • kleine frage dazu...

    ist es auf diesem wege möglich ein "geöffnetes dukument speichern" / "sind sie sicher" dialog zu erstellen, welcher vor dem tatsächlichen beenden des programms noch eine kleinigkeit erledigt und eine möglichkeit zum abbrechen des schliessen-vorgangs bietet?



  • Im Bezug auf welches Schließen ?

    Theoretisch und auch praktisch ist dies natürlich möglich nur solltest du genau definieren bei welchem Schließen du diese Operation ausführen möchtest.

    Es gibt 2 oder auch mehr Wege um dies zu realisieren.
    2 der Bekanntesten sind folgende...

    1. Abfangen der Nachrichten und Reaktion Beispiel abfangen der ESC Taste und eventuelles Speichern vorhandener Daten.

    BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)  
    { 
        // TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen 
        //////////////////////////////////////////////////////////////// 
        // Diese Zeile einbauen !! 
        if ((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_ESCAPE))
        {
    	// Hier Behandlung einfügen z.B.
    
    	CString	szMyProgramName, szMyMsg;
    
    	szMyProgramName.LoadString(IDS_PROGNAME);
    	szMyMsg.LoadString(IDS_MSG_ENDPROGRAM);
    
    	if (IDYES == MessageBox(szMyMsg, szMyProgramName, MB_YESNO | MB_ICONWARNING))
    	{
    		// Der Nutzer möchte das Programm beenden und vorher Speichern.
    		... = SaveData(...);
    		CDialog::PreTranslateMessage(pMsg);
    		// Das Programm speichert die Daten und beendet sich.
    	}
    	return FALSE; // Program wird nicht beendet bei ESC Key
        } 
        //////////////////////////////////////////////////////////////// 
        m_ctlToolTips.RelayEvent(pMsg); // Dies könnt Ihr ignorieren !!! 
        return CDialog::PreTranslateMessage(pMsg); 
    }
    

    2. Der Weg über den Destruktor

    Die Möglichkeit sieht wie folgt aus...

    Überschreibe den Konstruktor deiner Dialog Klasse und prüfe z.B ob der Pointer auf dein Dokument noch geöffnet ist.
    Erstelle dann eine MessageBox und frage den Nutzer ob er die Daten speichern möchte. Wenn ja dann speichere und wenn nein dann erledigt der Destruktor den Rest seiner Arbeit.
    Der Destruktor wird bei der Beendigung des Dialoges aufgerufen und die Klasse ist zu diesem Zeitpunkt noch komplett erhalten. Anschließend wird die Instanz der Klasse zerstört und alle Werte respektive Zugriffe auf die Instanz verursachen einen Absturz.

    Ich helfe dir gerne weiter bei deinem Problem dennoch müsstest du es ein wenig näher beschreiben.



  • mit schliessen meine ich das beenden der anwendung.
    der programmnutzer klickt auf das x oben rechts und bekommt erst ein modales dialog. in dem hat er z.b. die möglichkeit eine sicherung auf eine diskette durchzuführen oder abzubrechen, sodass man wieder zum programm gelangt.

    ich verwende in dem sinne keine dokumente. meine mdi anwendung nutze ich nur als rahmenanwendung um formulare anzeigen zu lassen...



  • So wie sagte würde ich den weg über den Destruktor wählen.

    Dort öffnest du den Dialog zum Speichern und Anschließend kehrst du wieder zu Destruktor zurück und beendest das Programm.

    Beispiel:

    int CMyDialog::~CMyDialog()
    {
      CSaveDlg pSaveDlg;
    
      pSaveDlg.DoModal();
    
      /// Fertig !!!!!
    
    }
    


  • DaDaywalker schrieb:

    So wie sagte würde ich den weg über den Destruktor wählen.

    Dort öffnest du den Dialog zum Speichern und Anschließend kehrst du wieder zu Destruktor zurück und beendest das Programm.

    Beispiel:

    int CMyDialog::~CMyDialog()
    {
      CSaveDlg pSaveDlg;
      
      pSaveDlg.DoModal();
    
      /// Fertig !!!!!
    
    }
    

    soweit so gut, aber wie bekomme ich es hin, dass ich beim abbrechen im "save" dialog wieder zum programm zurückkehre. das ist damit gemeint. ich möchte das schliessen der anwendung in diesem dialog abbrechen können.

    noch mal das ganze:

    (1) klick auf [x]

    (2) dialog erscheint modal:
    ________________________________
    |
    |
    | > Sichern auf Diskette/Zip
    | und beenden
    |
    | > Beenden ohne Sichern
    |
    |
    | > Zurück zum Programm
    |
    --------------------------------

    hoffe jetzt ist deutlich was ich vorhabe

    und(!) das ganze ist eine mdi anwendung...


Anmelden zum Antworten