Schließen-Button disablen

Hallo C.Experten,

zunächstmal: Ich bin zwar Programmierer, kenne mich mit verschiedenen Programmiersprachen aus, aber nicht mit C. Nun soll ich an einem bestehenden Programm (in Visual C++ geschrieben) eine Modifikation vornehmen und erbitte Eure Hilfe.

Mein Programm besteht aus einem Formular, welches ‚Always_On_Top‘ liegt. Das ist ok. Das Programm hat keinen ‚Schließen‘-Button. Das ist auch ok, denn der Benutzer darf das Programm nicht selbst schließen. Nun möchte ich aber dem Benutzer die Möglichkeit geben, das Fenster zu minimieren. Und hier beginnt nun das Problem: Wenn ich den ‚Minimize‘-Button im Eigenschaftendialog aktiviere, muß ich auch den ‚Systemmenü‘-Haken setzen. Dabei wird aber automatisch immer der ‚Schließen‘-Button mit aktiviert. Genau den brauche ich aber nicht.

Kann mir also jemand erklären, wie ich es erreiche, daß Benutzer ein Formular zwar minimieren, aber nicht schließen können?

Danke schonmal im Voraus für Eure Antworten
Gruß aus der VB/VBA-Welt
(Woly)

Hallo Woly,

ich gehe mal davon aus, daß Dein Programm aus einem einzigen Dialogfenster besteht. Dann mußt Du die Behandlungsfunktion OnCancel überschreiben.

Ich gehe weiter davon aus, daß es in dem Dialog kein Button mit der ID „IDCANCEL“ gibt (sonst könntest Du ja auch mit dem „Schließen“-Button im Systemmenü leben). Damit Du nicht alles „von Hand“ programmieren mußt, solltest Du erst einen neuen Button in dem Dialog erstellen und dem Button die ID „IDCANCEL“ zuweisen (auf Schreibweise achten!). Der Text auf dem Button ist völlig egal, der wird später sowieso wieder gelöscht.

Dann gehst Du im Arbeitsbereich auf „Klassen“ und klickst mit der rechten Maustaste auf die Klasse, die für den Dialog zuständig ist. Aus dem Kontextmenü wählst Du „Behandlungsroutine für Windows-Nachrichten“ hinzufügen.

In dem neuen Fenster wählst Du zuerst unter „Zu verwaltende(s) Klassenobjekt“ den Eintrag „IDCANCEL“ und danach unter „Neue Windows-Nachrichten / Ereignisse“ das Ereignis „BN_CLICKED“ aus. Danch klickst Du auf den Buttun „Hinzufügen und bearbeiten“. Das nächste Fenster bestätigst Du mit OK.

Der Klassenassistent erstellt jetzt eine Routine, die ungefähr so aussieht:

 void ........::open\_mouth:nCancel(void)
 {
 // TODO: Zusätzlichen Bereinigungscode hier einfügen

 CDialog::open\_mouth:nCancel();
 }

In dieser Routine kommentierst Du den Aufruf CDialog::open_mouth:nCancel() einfach aus (//). Das wär’s. Jetzt kannst Du den neu erstellten Button wieder aus dem Dialog löschen und das Systemmenü mit dem Minimieren-Button einschalten. Der „Schließen“-Button ist zwar immer noch aktiviert, aber es passiert nichts mehr, wenn er angeklickt wird.

Ich hoffe, ich konnte Dir helfen.

Gruß
Uwe

Hallo Uwe,

zunächst schonmal vielen Dank für Deine ausführliche Antwort. Ich komme leider jetzt erst dazu, zurückzuschreiben.

In Deinem Hilfetext stoße ich leider schon recht bald auf ein Hindernis: Das Kontextmenü für die Klasse enthält keinen Menüpunkt ‚Behandlungsroutine für Windows-Nachrichten‘. Auch sonst finde ich im Menü nichts dergleichen…
Kann es daran liegen, daß das Programm möglicherweise nicht im ‚MS VisualStudio‘ erstellt wurde?

Wäre nett, wenn Du mir bei diesem Problem nochmal einen kleinen Denkanstoß geben könntest…

Danke schonmal im Voraus.

Gruß
(Woly)

Hi Woly,

eigentlich sollte es kein Problem sein, wenn das Programm nicht in VC erstellt wurde.

Zuerst einmal: Welche Basisklasse hat denn die Klasse für den Dialog. Es sollte „CDialog“ sein (nicht CApp).

Wenn die Basisklasse tatsächlich CDialog ist, müßte eigentlich der besagte Menüpunkt vorhanden sein. Falls nicht, solltest Du VC verlassen und aus dem Projektordner die Dateien mit den Endungen „CLW“ und „NCB“ löschen (oder besser umbennenen in „CL“ und NC", falls was schiefgeht). Danach das Projekt wieder öffnen und mit „STRG W“ den Klassenassistenten aufrufen. Daraufhin erstellt VC die Verknüpfungsinformationen neu. Vielleicht hilft das.

Ich hoffe, das Problem ist damit gelöst.
Gruß
Uwe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]