MFC in CMainFrame::OnCreate beenden
-
Hi ich habe eine modale dialogklasse geschrieben, welche ich in der oncreate funktion aufrufen möchte und bei einem falsch login das programm beenden soll.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ... if(this->LoginPoP.DoModal()==0) {// MFC beenden wenn Modalesfenster 0 zurück gibt ASSERT(AfxGetMainWnd() != NULL); this->SendMessage(WM_CLOSE); } ... }
Kann man das MFC Framework da schon beenden? Bei mir macht er nur laufend fehler....
Kann mir jemand helfen?
-
Soldi01 schrieb:
Bei mir macht er nur laufend fehler....
Aha, und welche denn?
-
In OnCreate des MainFRames musst Du doch nur -1 zurückgeben:
http://msdn.microsoft.com/de-de/library/384x0633(VS.80).aspxAnsonsten würde ich so etwas vor der Erzeugung des Mainframes machen und nicht während der Erzeugung!
-
Also ich habe das in der InitInstance des Hauptanwendungsobjektes gemacht. Im Falle des Fehlschlagens sende ich ein WM_CLOSE an das MainWnd. Es funktioniert, allerdings weiß ich nicht, ob das vom Stil her so ok ist.
-
Und warum machst Du es nicht einfach bevor. Das Hauptfenster erzeugt wird?
Dann kehrst Du einfach mit einem return FALSE aus InitInstance zurück.
Warum erst das Fenster erzeugen und dann doch zerstören?
-
Martin Richter schrieb:
Und warum machst Du es nicht einfach bevor. Das Hauptfenster erzeugt wird?
Dann kehrst Du einfach mit einem return FALSE aus InitInstance zurück.
Warum erst das Fenster erzeugen und dann doch zerstören?Das hab ich mir von unserem ERP-System abgeschaut. Dort läuft das auch so. Mir persönlich gefällts auch nicht, wenn einfach so ein Dialogfenster erscheint und nach Benutzernahmen und Passwort fragt.
-
Dann würde ich in keinem Fall ein WM_CLOSE senden sondern direkt DestroyWindow ausführen.
Was würde passieren wenn WM_CLSOE das schließen des Fensters verneint.
Beispiel:
1. Mainframe wird erzeugt.
2. Auf Befehlszeile war eine Datei mit angegeben, und diese wird geladen.
3. Software enscheidtet ist altes Dokument wir machen ein Update und sezen SetModify
3. Du zeigst jetzt werst den "dämlichen" Login an! Die daten sind schon sichtbar!
4. Du sendest WM_CLOSE weil Du denkst das schließt das Mainframe. Pustekuchen, der Benutzer sagt Nein! nicht Beenden.WM_CLSOE ist keine "sichere" Methode um ein Programm zu beenden.
-
Martin Richter schrieb:
Dann würde ich in keinem Fall ein WM_CLOSE senden sondern direkt DestroyWindow ausführen.
Was würde passieren wenn WM_CLSOE das schließen des Fensters verneint.
Beispiel:
1. Mainframe wird erzeugt.
2. Auf Befehlszeile war eine Datei mit angegeben, und diese wird geladen.
3. Software enscheidtet ist altes Dokument wir machen ein Update und sezen SetModify
3. Du zeigst jetzt werst den "dämlichen" Login an! Die daten sind schon sichtbar!
4. Du sendest WM_CLOSE weil Du denkst das schließt das Mainframe. Pustekuchen, der Benutzer sagt Nein! nicht Beenden.WM_CLSOE ist keine "sichere" Methode um ein Programm zu beenden.
Warum ich das so gemacht habe kann ich jetzt auch nicht mehr sagen. Ich glaube ich hatte das von irgendeinem Beispiel. Mir ist nur nicht ganz klar, warum das Fenster das WM_CLOSE verneinen sollte. Eine Datei wird nicht über die Befehlszeile mitgegeben, da das Programm zum Speichern/Laden von Einstellungen die Registry benutzt und sonst keine Dateiunterstützung hat. Das WM_CLOSE wird ja an dieser Stelle ausschließlich gesendet, wenn der Benutzer einen falschen Benutzernamen und/oder ein falsches Passwort eingegeben hat. Daten waren auch keine sichtbar, da die Oberfläche nur aus Buttons, einer Bitmap und ein paar leeren Editfeldern bestand. Die Initialisierungen hatte ich in den nachfolgenden Schritten implementiert.
Wo müsste ich denn dann das DestroyWindow einbauen (mir ist klar das eine Instanz des Fensters, egal ob nun sichtbar oder nicht, bereits existieren muss)? Auch in der InitInstance?
-
Die MFC Implentierung für WM_CLOSE stellt eine Frage, wenn ein CDoument geändert wurde. Hier kann man das Schließen abbrechen... WM_CLOSE führt dann nicht zum Beenden der Software.
Statt Deinem SendMessage fürst Du DestroyWindow aus... so schwer ist das doch nicht zu verstehen oder?