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



  • Hallo Gemeinschaft,

    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. Durch diese Kombination lassen sich die Formulare leider auch beliebig in der Größe verändern. Im OnResize() kann man die Grösse wieder zurücksetzen, ich bin damit jedoch nicht zufrieden gewesen, da ein Zurücksetzen von ClientWidth und -Height immer ein Flackern verursacht hat.
    Ich bin im weiteren Verlauf der Suche nach Lösungen recht schnell in den ortsansässigen BCB-FAQs gelandet und dort auf die Anleitung zum Abfangen von Botschaften gestossen.
    Methode 2 fand ich ganz gut und hab sie nach bestem Wissen und Gewissen implementiert. Die Funktion sieht bei mir so aus:

    void __fastcall TFormEAShow::OwnWndProc(TMessage& Msg)
    {
    	if(Msg.Msg!=WM_GETMINMAXINFO)
    	{ OrgWndProc(Msg); }
    }
    //===========================================================================
    

    Sie soll bewirken, dass alle Botschaften weitergegeben werden, bis auf WM_GETMINMAXINFO.
    Leider liess sich damit die Grösse des Formulars immernoch frei ändern. Also war vielleicht WM_GETMINMAXINFO nicht die richtige Botschaft... Folglich habe ich auch WM_SIZE und WM_SIZING getestet, erfolglos!
    Problem: Nun lässt sich zwar jede Botschaft an das jeweilige Formular abfangen (ich habs mit einem Haltepunkt überprüft 😃 ), eine Größenänderung ist jedoch weiterhin möglich, weil ich nicht weiß welche Botschaft ich rausfiltern muss. 😞

    Fragen: Welche Botschaft muss ich abfangen, um eine beliebige Größenänderung zu verhindern? Mache ich noch etwas Anderes falsch bzw. habe etwas Wichtiges nicht bedacht?

    MfG



  • Warum benutzt du nicht einfach Constraints um die Größenänderung zu verhindern?



  • Hi,

    deine Formulare müssten das OnCanResize-Event besitzen...

    mfg, Micha!



  • Ich hab' vergessen zu erwähnen: C++Builder3 !!!

    Der gibts weder Constraints in den Eigenschaften, noch OnCanResize in den Ereignissen der Formulare... 😞

    Aber jetzt sagt mir bitte nicht: "Dann geht es nicht!"
    Dann muss ich nämlich gaaaanz lange gaaaaanz laut schreien. 😃



  • 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


Log in to reply