Minimalgröße eines Fensters festlegen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • Minimalgröße eines Fensters festlegen

      Folgendes Problem:
      Ich hab ein größenveränderbares Fenster. Das Fenster soll eine bestimmte Minimalgröße haben, also nicht kleiner gezogen werden können.Das ist bei etlichen Anwendungen Standard. Bei XProfan kenne ich jetzt nur die Möglichkeit die entsprechende Notification während eines WaitInput/GetMessage mittels Subclassing abzufangen und die Fenstergröße zu manipulieren. Das klappt wunderbar und flackerfrei. Wenn ich dem Programm aber etwas zu tun gebe, dann klappt das natürlich nicht. Ich behelfe mir momentan mit einem zweiten Prozess, das flackert aber und ist auch nicht elegant. Gibt es eine andere Möglichkeit das hinzubiegen, viellecht kann man die Minimalgröße des Fensterobjekts als Eigenschaft festlegen?

      Nachtrag:
      So wie ich das verstehe ist das Aufgabe der Funktion, die die Messages des Fensters verarbeitet, also müsste das direkt in XProfan integriert sein. Reagiert XProfan überhaupt auf Messages während das Programm normal weiterläuft?
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 6 256GB Midnight Black
      jacdelad.bplaced.net

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Jac de Lad () aus folgendem Grund: Mehr Infos.

    • Mach es mal mittels UserMessage :

      Quellcode

      1. Declare Handle win, Long ende, xminsize, yminsize
      2. xminsize = 400 : yminsize = 200
      3. win = Create("Window", %DeskTop, "Mein Fenster", 100, 100, 600, 400)
      4. ende = 0
      5. UserMessages $0232 ' wm_ExitSizeMove
      6. WhileNot ende
      7. WaitInput
      8. If %UMessage = $0232
      9. If &UlParam = $0 ' size_move
      10. Case Width(win, 1) < xminsize : SetWindowPos win = 100, 100 - xminsize, yminsize
      11. Case Height(win, 1) < yminsize : SetWindowPos win = 100, 100 - xminsize, yminsize
      12. EndIf
      13. EndIf
      14. Case %Key = 2 : ende = 1
      15. EndWhile
      16. End
      Alles anzeigen
      Was anderes wüßte ich jetzt auch nicht.
    • Jaja, aber das bringt wie gesagt nur was in der Schleife. Bei anderen Programmen geht es auch jederzeit, auch wenn das Programm schwer beschäftigt ist.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 6 256GB Midnight Black
      jacdelad.bplaced.net
    • In XProfan sollte es mit einem Callback zu SetWindowsPlacement funktionieren. In der WINDOWPLACEMENT structure sollte der Flag: WPF_SETMINPOSITION gesetzt sein.

      Weitere Infos auf MSDN:
      msdn.microsoft.com/en-us/libra…op/ms633544(v=vs.85).aspx
      msdn.microsoft.com/en-us/libra…op/ms632611(v=vs.85).aspx


      Nach XProfan muß das aber einer von euch schon transferieren ;-)

      In PureBasic gibt es die Funktion WindowsBounds() dafür, um Crossplattform-Funktionalität zu erreichen.
      Gruß Thomas
      Meine Hardware
      ƃᴉɹǝᴉʍɥɔs ʇsᴉ ɥɔɐɟuᴉǝ
      ComputerInfo für PPF
    • Hm, danke, aber ich glaube das hilft nicht weiter. Die Funktion scheint nur das Minimieren etc. zu ermöglichen. Außerdem muss die Funktion ja auch extra aufgerufen werden, was mir nicht weiterhilft wenn mein Progrmm anderweitig beschäftigt ist.
      WPF_SetMinPosition gibt auch eine Position an, nicht eine Größe.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 6 256GB Midnight Black
      jacdelad.bplaced.net
    • Jac de Lad schrieb:

      WPF_SetMinPosition gibt auch eine Position an, nicht eine Größe.
      Das ist ein Flag und gibt nichts an ;-)
      Für die Größe ist der Member RECT in der Strukture zuständig. Ein Callback sollte bei eintreffen des entsprechenden Ereignisse automatisch aufgerufen werden, weiß allerdings nicht wie das in XProfan funktioniert. Deswegen programmiere ich ja auch nicht mehr in XProfan ;-)

      PS: Wenn sich das Fenster verändern läßt, empfängt es auch Ereignisse, ansonsten wäre das Fenster Tot und zeigt keinerlei Veränderungen. Verstehe also das Problem nicht.
      Gruß Thomas
      Meine Hardware
      ƃᴉɹǝᴉʍɥɔs ʇsᴉ ɥɔɐɟuᴉǝ
      ComputerInfo für PPF

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ts-soft ()

    • Also entweder blick ich das gerade nicht, oder du liegst falsch.
      Beschreibung von SetWindowPlacement:
      Sets the show state and the restored, minimized, and maximized positions of the specified window.

      Beschreibung von WPF_ASYNCWINDOWPLACEMENT:
      If the calling thread and the thread that owns the window are attached to different input queues, the system posts the request to the thread that owns the window. This prevents the calling thread from blocking its execution while other threads process the request.

      Die geben mir beide keinen Hinweis darauf, dass die Funktion per Callback arbeitet. ersteres sagt mir nur, dass ich damit das Fenster manipulieren kann, letzteres, dass damit der Aufruf an den Owner umgeleitet werden kann, falls der Thread eine andere Input Queue benutzt.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 6 256GB Midnight Black
      jacdelad.bplaced.net
    • Keine Ahnung wie XProfan tickt :-D
      Es gibt doch z.B. WM_SIZE oder WM_MOVE ereignisse. Dort wird die minimale Größe abgefragt und bei unterschreiten als neu gesetzt. Wenn das XProfan-Programm zu beschäftigt ist, gibt es auch keine Änderung der Größe.

      WPF_ASYNCWINDOWPLACEMENT sollte bei XProfan gar nicht funktionieren, da keine Threads unterstützt werden.

      Ansonsten mal Roland fragen, ob er sowas einbauen kann oder entsprechenden Code programmieren.
      Gruß Thomas
      Meine Hardware
      ƃᴉɹǝᴉʍɥɔs ʇsᴉ ɥɔɐɟuᴉǝ
      ComputerInfo für PPF
    • Wm_sizing und wm_size nutze ich ja schon. Bringt aber nur in einer waitinput Schleife was, ansonsten per Timer. Bleibt nur Roland. Vielleicht kann der einen Befehl "Set("WindowMin",handle,dx,dy)" einbauen.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 6 256GB Midnight Black
      jacdelad.bplaced.net
    • Das Verändern der Fenstergröße unterbricht doch schon immer das WAITINPUT und setzt %KEY auf 4!

      Gruß
      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X4
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


      http://www.xprofan.de

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von RGH ()

    • Und hier ein kleines Beispielprogramm:

      Quellcode

      1. window 500, 500
      2. declare int dx, dy
      3. var int ende = 0
      4. whilenot ende
      5. waitinput
      6. if %key = 27 // Escape-Taste
      7. ende = 1
      8. elseif %key = 2 // Schließen gewählt
      9. ende = 1
      10. elseif %key = 4 // Fenster ändert Größe
      11. dx = width(%hwnd, 1)
      12. case dx < 300 : dx = 300
      13. dy = height(%hwnd, 1)
      14. case dy < 300 : dy = 300
      15. setwindowpos %hwnd, %winleft, %wintop - dx, dy
      16. endif
      17. endwhile
      18. end
      Alles anzeigen

      Gruß
      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X4
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


      http://www.xprofan.de
    • Leute, es geht mir um Veränderungen der Fenstergröße während das Programm NICHT im Waitinput hängt und irgendwas tut. Im Waitinput habe ich kein Problem damit, das läuft ja schon flackerfrei. Aber man kann die Fenstergröße natürlich auch ändern während das Programm beschäftigt ist. Dann kann ich nicht verhindern, dass das Fenster kleiner als z.B. 200*300 gezogen wird.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 6 256GB Midnight Black
      jacdelad.bplaced.net
    • Jac de Lad schrieb:

      das Programm NICHT im Waitinput hängt
      Ein Windows-Programm befindet sich solange im Event-Loop, bis es beendet wird. Es ist Ereignisgesteuert. Alles andere sind keine Windows-Programme und sollten dann auch als Batch-Programm deklariert werden und möglichst keine GUI haben.

      Jac de Lad schrieb:

      Aber man kann die Fenstergröße natürlich auch ändern während das Programm beschäftigt ist.
      Ein Resizen des Fensters ist auch gar nicht möglich, ohne das ein Ereignis verarbeitet wird, es sagt ihm ja niemand: ändere Deine Größe, es kann also nicht in der Größe verändert werden.

      Es könnte natürlich sein, das XProfan noch in anderen Routinen (RunTime?) die Ereignisse verarbeitet, so muß man sich hier einklinken. Wie das geht weiß ich leider nicht, dafür fehlen mir die Kenntnisse in XProfan. Aber ich denke eher, das der Programm-Ablauf hier verkehrt gewählt wurde.

      Aber ich halte mich lieber raus und laß die XProfan Profis unter sich.
      Gruß Thomas
      Meine Hardware
      ƃᴉɹǝᴉʍɥɔs ʇsᴉ ɥɔɐɟuᴉǝ
      ComputerInfo für PPF
    • Profan tickt da etwas anders, als normale Windowsprogramme. Die eigentliche Messageverarbeitung findet intern im Interpreter oder der Runtime statt und hat mit WaitInput wenig zu tun. Dorthin werden nur gezielt bestimmte Ereignisse "durchgereicht", damit ich überhaupt irgendwas machen kann :-D
      Sogar das funktioniert und kann beliebig in der Größe verändert und natürlich auch per Klick auf das Schließfeld beendet werden:

      Quellcode

      1. cls
      2. while 1
      3. endwhile



      Gruß Volkmar
    • Zum Einen kann man dann gleich einen Windowsstil wählen, in dem die Fenstergröße nicht veränderbar ist und zum Anderen bleibt dann nur das Subclassing, dass ja vom Waitinput unabhängig ist. Dort kann man dann die Message zur Größenänderung abfangen und dafür sorgen, dass die Mindestgröße eingehalten wird.

      Gruß
      Roland
      Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD / ATI Radeon HD4770 512 MB / Windows 7(32) - XProfan X4
      AMD Athlon II X2 2,9 GHz / 3 GB RAM / 500 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


      http://www.xprofan.de
    • Volkmar schrieb:

      Die eigentliche Messageverarbeitung findet intern im Interpreter oder der Runtime statt und hat mit WaitInput wenig zu tun
      So in etwa funktioniert auch "WaitWindowEvent()" bzw. "WindowEvent()" in PureBasic, was aber mehr ein Überbleisel aus älteren Versionen darstellt. Aber mit dem Befehl: "SetWindowCallback()" kann ich eine Procedure bestimmen, in der "alle" Ereignisse, ungefiltert eintreffen. Ich dachte eigentlich, das es diese Funktionalität inzwischen auch in XProfan gibt.

      Edit: Lösung von RGH scheint das Problem doch zu lösen, SubClassing!
      Gruß Thomas
      Meine Hardware
      ƃᴉɹǝᴉʍɥɔs ʇsᴉ ɥɔɐɟuᴉǝ
      ComputerInfo für PPF
    • Subclassing funktioniert auch nur mit Waitinput. Deswegen dachte ich ja, dass Roland was an der internen Bearbeitung drehen kann.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/65TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 6 256GB Midnight Black
      jacdelad.bplaced.net