[gelöst] Formular ohne Größenänderung, aber minimierbar. WM's abfangen.



  • Hallo

    Vermutlich kann man die einzelnen Optionen (Minimieren, Größenveränderung) mit entsprechenden WinAPI-Funktionen auch einzeln an- und ausschalten. Dann brauchst du nicht Messages abfangen, sondern das macht Windows für dich. Schau mal in der MSDN oder im WinAPI-Forum nach.

    bis bald
    akari



  • akari schrieb:

    [...] Schau mal in der MSDN oder im WinAPI-Forum nach.

    Martin Richter schrieb:

    Einfach auf WM_GETMINMAXINFO reagieren und die entsprechende minimale Größe in der übergebenen Struktur eintragen. [...] Dafür gibt AdjustWindowRect und AdjustWindowRectEx!

    habe ich gerade im WinAPI-Forum gefunden... Also sollte es doch irgendwie gehen mit der abgefangenen Botschaft. Dann schau ich mal, wie ich die besagte Struktur anpasse...

    geeky schrieb:

    Nimm einfach als Window Styles nicht WS_OVERLAPPEDWINDOW sondern selber zusammenschustern:
    WS_BORDER|WS_SYSMENU|WS_MINIMIZEBOX [...]

    Oder lieber diesen Ansatz verfolgen?



  • Hallo

    Ja ich meine das was geeky schreibt. Die einzelnen Optionen sind von WinAPI-Seite frei wählbar, aber der VCL-Wrapper TForm bietet sie nur als zusammenhängendes Optionspaket an.

    bis bald
    akari



  • Boah, das hat aber jetzt gedauert bis ich SetWindowLong(...) gefunden habe... 🙄

    Was mich trotzdem noch interessiert (vielleicht braucht man's ja nochmal!?!): Warum funktioniert das "Filtern" der Botschaft WM_GETMINMAXINFO nicht, wie ich es im Start-Post beschrieben habe??? 😕

    Edit: Hier noch ein guter Link zu SetWindowLong(...).



  • Hm, ja... Gute Frage. Hast Du es mal mit den MESSAGE_MAP-Makros probiert?

    // Header:
    void __fastcall CMFileQueued(TMessage Message); // nicht wie im Beispiel TMessage*!! zumindest in meinen BCB 6 ist dieser Fehler da
    BEGIN_MESSAGE_MAP
    	VCL_MESSAGE_HANDLER(CM_FILEQUEUED, TMessage, CMFileQueued);
    END_MESSAGE_MAP (TForm)
    // CPP:
    void __fastcall TMainForm::CMFileQueued(TMessage Message)
    {
       // Code
    }
    //---------------------------------------------------------------------------
    


  • Kolumbus schrieb:

    es ärgert mich da ein kleines Problem... Vorgeschichte: Ich möchte einige Formulare einer Anwendung zwar minimieren, sie sollen jedoch nicht frei größenverändert werden können. Damit die Formulare minimierbar sind habe ich Borderstyle auf bsSizeable und Bordericons->biMinimize auf true gesetzt.

    Schon mal mit BorderStyle = bsSingle versucht?



  • Hey Joe_M, nein hab' ich nicht... Was würde es jetzt bringen das zu testen? Was könntest du daraus dann ableiten, wenn es mit den MESSAGE_MAP-Makro's funktioniert?



  • audacia schrieb:

    Schon mal mit BorderStyle = bsSingle versucht?

    Oh man, wie blöd ist das denn? Da hab' ich wohl den Wald vor lauter Bäumen nicht gesehen (bzw umgekehrt)! 😮 Danke für den Tip audacia 🙂 , manchmal steh' ich echt auf der Leitung... 😞

    Aber gut, dass ich jetzt die WinAPI-Funktion SetWindowLong(...) kenne, das ist bestimmt nicht verkehrt. 😉

    Offen ist immernoch, warum das Filtern der Botschaft nicht funktioniert... ⚠



  • Kolumbus schrieb:

    Offen ist immernoch, warum das Filtern der Botschaft nicht funktioniert...

    Versuch es doch einfach mal... Ich hatte in einer Anwendung das Problem, dass Nachrichten von Threads verloren gingen. Dazu reichte es schon das Formular zu verschieben, während es eine Nachricht emfpfangen sollte.
    Nachdem ich von ApplicationEvents::OnMessage() auf die Message-Map-Makros umgestellt hatte, funktionierte das problemlos.



  • Ich hab' jetzt gerafft warum es mit der Filterung nicht geht... ➡ Ich müsste die Werte in der Struktur MINMAXINFO ändern, sonst lässt sich das Formular eben in der Größe ändern!

    Wenn ich WM_GETMINMAXINFO unterdrücke (filtere), findet lediglich keine Prüfung statt ob die Größenänderung des Formulars im zulässigen Bereich ist!
    Weiterhin sind WM_SIZING und WM_SIZE nur Benachrichtigungen an das Fenster, wenn eine Größenänderung stattfindet... Das Filtern der 3 genannten Benachrichtigungen unterdrückt aber nicht die Größenänderung an sich! 💡

    Ich hab' mir eine kleine Funktion geschrieben, die mir alle Botschaften an das Formular auf einem Label als HEX-Werte ausgibt. Dann konnte ich in der winuser.h nachschauen, für welche Botschaften die HEX-Werte stehen und mit F1 gleich die Botschaftsbeschreibung in der Hilfe öffnen... sehr interessant!! 🙂
    Natürlich musste ich einige Botschaften ausblenden, um nicht "überflutet" zu werden.
    Trotzdem konnte ich gut beobachten, wie der Botschaftsablauf bei einer Größenänderung aussieht, oder bei einem Mausklick, oder bei einem Dopelklick, oder oder oder... hat was von einem Kommunikationsprotokoll.

    So, nun ist Alles geklärt...

    Vielen Dank für eure Anteilnahme 😃

    MfG


Anmelden zum Antworten