Schliessen-Kreuz auf geöffnetem Form de- / aktivieren



  • Hallo Gemeinschaft,

    ich wollte gern das Schliessen-Kreuz eines bereits geöffneten Form deaktivieren / aktivieren (also zur Laufzeit).
    Nun hab' ich einen Artikel in den FAQ's gesehen und daraufhin folgenden Code in eine Button-Click-Methode geschrieben, um das Deaktivieren zu testen:

    long lTmp= GetWindowLong(this->Handle, GWL_STYLE);
    lTmp= lTmp & (~CS_NOCLOSE);
    SetWindowLong(this->Handle, GWL_STYLE, lTmp);
    

    Leider tut sich nach dem Button-Klick optisch garnichts am Schliessen-Kreuz, auch kann ich es noch benutzen. 😞
    Dann dachte ich, es liegt viell. an diesem CS_NOCLOSE das da negiert wird und hab das hier versucht:

    long lTmp= GetWindowLong(this->Handle, GWL_STYLE);
    lTmp= lTmp & CS_NOCLOSE;
    SetWindowLong(this->Handle, GWL_STYLE, lTmp);
    

    Damit tut sich optisch auch nichts am Schliessen-Kreuz, aber das Form ist danach komplett "gesperrt" (egal wo ich raufklicke - nix passiert). Irgendwie steh' ich grad aufm Schlauch, was da schieflaufen könnte...

    Sieht jemand etwas oder hat eine Idee - was mache ich falsch?



  • Ich habe das Schliessen vorerst im OnCloseQuery-Event mit CanClose false / true geregelt. Schöner wäre es jedoch, das Schliessen-Kreuz zu deaktivieren / aktivieren. Somit weiß der Nutzer dann, das es im Moment ausser Funktion ist und muss sich nicht wundern, warum er das Fenster einfach nicht schliessen kann.



  • Hab grad in einem anderen Thread das hier gefunden:

    anderer Thread schrieb:

    Window Styles

    --------------------------------------------------------------------------------

    The following styles can be specified wherever a window style is required. After the control has been created, these styles cannot be modified, except as noted.

    😞
    Heisst das: ich kann's vergessen? Und welche sind die Ausnahmen (except as noted)?



  • Davon mal ganz abgesehen, ich finde OnCloseQuery ist schon die passende Stelle.
    Ein User sollte immer die Möglichkeit haben ein Programm zu beenden. Weise ihn darauf hin, dass die bisherigen Berechnungen / Arbeiten (oder was weiß ich) verloren gehen, wenn er das Programm jetzt beendet. Aber zulassen würde ich es.



  • Ok, hast mich überzeugt Joe! Ich kann ja den Timer auch einfach dann deaktivieren, wenn der Benutzer auf Schliessen drückt. Welchen Timer? Naja: Auf Knopfdruck wird vom Benutzer ein Timer aktiviert und wenn der Benutzer nun danach einfach das Fenster schliesst, wird der Timer eben nicht deaktiviert... Da das Form dynamisch erstellt wird, ist nach dem Schliessen Alles weg und ich dachte: nicht das da undefiniertes Verhalten entstehen kann, wenn der Timer grad ausgelöst hat und die Event-Methode eine Funktion auf einem anderen Form aufruft, die dann was zurückgeben will, aber das Form nicht mehr findet .... oder braucht mich das nicht zu sorgen?

    Ganz nebenbei habe ich mir mal die Styles angeschaut (in der Hilfe unter CreateWindow) und keinen CS_NOCLOSE gefunden... Die heißen ja alle WS_IRGENDWAS... Was ist CS_NOCLOSE? 😕

    Und die Hauptfrage steht immernoch: Kann ich das Schliessen-Kreuz zur Laufzeit bei angezeigtem Form deaktivieren oder nicht? Wenn ja, wie? (Wir wollen mal nicht den Lerneffekt vergessen 😉 )



  • Ok, wenn Du darauf bestehst, lass Dich ins WinAPI-Forum verschieben. Dort kann man Dir diese Frage sicherlich eher beantworten. 😉

    Ich, für meinen Teil, mache immer noch einen möglichst großen Bogen um die WinAPI. CRITICAL_SECTION und Events nutze ich direkt aus der WinAPI, aber das ist auch schon alles.



  • ich schrieb:

    Da das Form dynamisch erstellt wird, ist nach dem Schliessen Alles weg und ich dachte: nicht das da undefiniertes Verhalten entstehen kann, wenn der Timer grad ausgelöst hat und die Event-Methode eine Funktion auf einem anderen Form aufruft, die dann was zurückgeben will, aber das Form nicht mehr findet .... oder braucht mich das nicht zu sorgen?

    Kannst du mir dazu auch was sagen?

    Joe_M. schrieb:

    Ok, wenn Du darauf bestehst, lass Dich ins WinAPI-Forum verschieben. ...

    Ich will aber nich abgeschoben werden 😞 😉

    Joe_M. schrieb:

    Ich, für meinen Teil, mache immer noch einen möglichst großen Bogen um die WinAPI. CRITICAL_SECTION und Events nutze ich direkt aus der WinAPI, aber das ist auch schon alles.

    Hast du Angst vor der WinAPI? 🕶 🤡 Nee, mal im Ernst: Warum meidest du das WinAPI?



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • 😮 ich bin abgeschoben worden *heul*



  • Hallo,

    hole dir mit GetSystemMenu ein Menü-Handle zum System/Fenster-Menü und (de-)aktiviere mit EnableMenuItem den Punkt unter Nutzung von SC_CLOSE als Kommando-ID ([i]MF_BYCOMMAND[/i)].

    MfG,

    Probe-Nutzer



  • // deaktivieren
    EnableMenuItem ( GetSystemMenu (hwnd_main, FALSE), SC_CLOSE, MF_GRAYED);
    
    // aktivieren
    EnableMenuItem ( GetSystemMenu (hwnd_main, FALSE), SC_CLOSE, MF_ENABLED);
    


  • Vielen Dank Joe_M, akari, Probe-Nutzer und merker - Dank den letzten beiden Posts funktioniert das Aktivieren / Deaktivieren des Schliessen-Kreuz des aktiven Form jetzt. Wieder was gelernt! 🙂



  • Hallo,

    bei mir kommt beim obigen Code die Meldung:
    [C++ Fehler] Unit1.cpp(21): E2451 Undefiniertes Symbol 'hwnd_main'

    Was mache ich Falsch? 😕



  • Hallo,

    hwnd_main sollte das Handle zum Fenster sein, dessen Schliessen-Symbol man deaktivieren will. Das heisst bei dir wahrscheinlich anders.

    MfG,

    Probe-Nutzer


Anmelden zum Antworten