Ausblenden der WindowClose/Minimize/Maximize Buttons



  • Hallo,

    ich versuche gerade in einem TFrom die WindowButtons auszublenden(runtime) finde aber die zuständige Property nicht.

    Hat jemand einen Tipp.

    Danke



  • borderstyle is glaub ich das was du suchst. probier ma alle durch.



  • Super,

    man kann es entweder über die BorderIcons machen und sie einzeln ausblenden oder mit BorderStyle die ganze WindowBar ausblenden.

    Danke nochmals



  • Wie kann ich aber das Icon für Maximieren ausblenden UND trotzdem das Minimieren-Icon eingeblendet lassen???
    Sobald ich biMinimize auf true setze, wird das Maximieren-Icon disabled angzeigt, obwohl biMaximize auf false gesetzt ist.



  • williman schrieb:

    Sobald ich biMinimize auf true setze, wird das Maximieren-Icon disabled angzeigt, obwohl biMaximize auf false gesetzt ist.

    wenn Du BorderIcons::biMaximize auf false setzt, dann ist doch klar, dass es nicht aktiv ist?!



  • Nochmal:
    Es soll NUR der Minimize-Button und der X-Button angezeigt werden. Maximize-Button soll nicht nur grau (disabled) dargestellt werden, sondern komplett weg sein.
    Wie geht das?
    Danke!



  • Das wird von der VCL nicht direkt unterstützt.

    Nach http://snipplr.com/view/30704/hide-minimize-and-maximize-buttons/ müßte es mit SetWindowLong funktionieren:

    long value = GetWindowLong(Handle, GWL_STYLE); // EDIT: <- GWL_STYLE fehlte hier noch
    
    SetWindowLong(Handle, GWL_STYLE, value & ~WS_MAXIMIZEBOX);
    

    (ich bin mir aber nicht sicher, ob man nur den Maximize- ohne den Minimize-Button entfernen kann)

    Eine andere Möglichkeit kenne ich noch über das SystemMenu (GetSystemMenu) und dann den Button entfernen (funktioniert zumindestens mit dem Schließen-Button), s. z.B. http://www.devasp.net/net/articles/display/307.html (ist zwar VB, aber der analoge Code klappt auch für C bzw. C++).
    Du müßtest dann also

    HMENU hMenu = GetSystemMenu(Handle, FALSE);
    
    int menuItemCount = GetMenuItemCount(hMenu);
    
    RemoveMenu(hMenu, menuItemCount - 3, MF_BYPOSITION);
    
    DrawMenuBar(Handle);
    

    aufrufen (beachte die "- 3"!).

    Probiere es mal aus und gib hier Bescheid.



  • setwindowlong geht nicht ("zu wenig Parameter...").

    RemoveMenu könnte man so übersichtlicher schreiben:

    RemoveMenu (hMenu, SC_MAXIMIZE, MF_REMOVE | MF_BYCOMMAND);
    

    Funktioniert leider auch nicht. Maximize-Button wird nur grau (disabled) dargestellt, verschwindet also nicht komplett.



  • Der wird immer Grau bleiben solange der Minimize Button noch angezeigt wird.

    Könntest höchstens noch versuchen den Grauen Maximize Button per Canvas zu übermalen, ging glaube irgendwie das man auf der Titelleiste "malen" kann, bin mir aber nicht sicher.



  • Möchte aber nichts übermalen.
    Ich brauche den Platz in der Titelleiste, da mein Fenster sehr schmal ist. Daher sollte der Minimize-Button und der Schließen-Button direkt nebeneinander und ganz rechts liegen. Den Schließen-Button blende ich evtl. auch aus, sodass nur noch der Minimize-Button da sein soll.



  • Das geht glaube nicht, das man nur ein Minimize Button hat. Du kannst entweder alle 3 Asublenden oder nur Minimize und Maximize. Andere Kombination von Ausblenden der Buttons geht nicht.



  • OK,
    ist es denn möglich, alle Buttons (Minimize, Maximize und Close) auszublenden, aber mein Formularicon links in der Titelzeile NICHT auch verschwindet? Das passiert leider, wenn ich Bordericons-Systemmenu auf false setze.



  • Dies ist leider glaube auch nicht möglich.
    Weiß dies aber nicht genau, solltest aber mal im WinAPI nachfragen.



  • Dann müßtest du, wie schon geschrieben, alles selber zeichnen (bzw. überzeichnen).
    Einen guten Artikel gibt es unter http://www.mycsharp.de/wbb2/thread.php?threadid=27473
    (ist zwar für C#, verwendet werden jedoch auch nur die WinAPI-Messages)


Anmelden zum Antworten