Neue Antwort erstellen

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.

Informationen
Frage Bitte beantworten Sie die untenstehende Frage bzw. lösen Sie die untenstehende Aufgabe.
Nachricht
Internet-Adressen werden automatisch erkannt und umgewandelt.
Smiley-Code wird in Ihrer Nachricht automatisch als Smiley-Grafik dargestellt.
Sie können BBCodes zur Formatierung Ihrer Nachricht nutzen.

Vorherige Beiträge 26

  • p. specht schrieb:

    Für Minimal- und Maximalgröße hat Georg Teles etwas gestiftet. Klappt bei mir gut: LINK
    Vielen Dank. Der Code funktioniert bestimmt auch und ich benutze schon einen ähnlichen Code, der per Subclassing arbeitet. Aber das löst nicht mein Problem: Er funktioniert solange sichd as Programm in einer Schleife mit waitinput befindet. Aber nicht, wenn zum Beispiel eine komplexere Funktion aufgerufen wird die eine Minute zu bearbeiten braucht bis das Programm wieder in die waitinput-Schleife springt. Mir ist klar, dass XProfan in der Zeit natürlich keine Messages abarbeitet, aber andere Programmiersprachen können das, die Fenster lassen sich zu jedem Zeitpunkt flackerfrei skalieren.
    Eine Möglichkeit wäre vielleicht ein zweiter Prozess, aber das ist doch ziemlich umständlich?!
  • Sorry, aber irgendwie haut das nicht hin:

    Quellcode

    1. $H Windows.ph
    2. $H Messages.ph
    3. 'Def %WM_GETMINMAXINFO = $24
    4. Struct MyPNT = x&, y&
    5. Struct MyMINMAXINFO = ptReserved!MyPNT, ptMaxSize!MyPNT, ptMaxPosition!MyPNT, ptMinTrackSize!MyPNT, ptMaxTrackSize!MyPNT
    6. Declare OldWndProc&
    7. Declare MMI#
    8. Dim MMI#, MyMINMAXINFO
    9. Proc MyWindowProc
    10. Parameters hWnd&, Message&, wParam&, lParam&
    11. If Message& = ~WM_GETMINMAXINFO // liefert in lParam die Adresse auf MinMaxInfo (wird bei Größenänderung gesendet)
    12. If lParam& <> 0
    13. MMI# = lParam& // dort setzt man dann seine Grenzen, die eingehalten werden sollen
    14. With MMI#
    15. .ptMinTrackSize.x& = 300 // neue Min-Werte setzen
    16. .ptMinTrackSize.y& = 300 // neue Min-Werte setzen
    17. EndWith
    18. EndIf
    19. EndIf
    20. Return ~CallWindowProc(OldWndProc&, hWnd&, Message&, wParam&, lParam&)
    21. EndProc
    22. OldWndProc& = ~GetWindowLong(%hWnd,~GWL_WNDPROC,ProcAddr("MyWindowProc",4))
    23. Set("FastMode",0)
    24. '.... DAS PROGRAMM
    25. cls
    26. while 1
    27. waitinput
    28. endwhile
    29. Set("FastMode",1)
    30. ~SetWindowLong(%hWnd,~GWL_WNDPROC,OldWndProc&)
    31. Dispose MMI#
    32. End
    Alles anzeigen
    ...macht quasi nichts. Tut mir leid, dass ich das nicht selbst hinkriege. :cry:
  • Die WindowProc kann man doch selbst bearbeiten. Siehe unter Callback.

    So ähnlich sollte es laufen.
    Die betreffende Message wird durch Größenänderung ausgelöst.
    Da jubelt man einfach seine eigenen Grenzen unter...

    Quellcode

    1. $H Windows.ph
    2. $H Messages.ph
    3. 'Def %WM_GETMINMAXINFO = $24
    4. Struct MyPNT = x&, y&
    5. Struct MyMINMAXINFO = ptReserved!MyPNT, ptMaxSize!MyPNT, ptMaxPosition!MyPNT, ptMinTrackSize!MyPNT, ptMaxTrackSize!MyPNT
    6. Declare OldWndProc&
    7. Declare MMI#
    8. Dim MMI#, MyMINMAXINFO
    9. Proc MyWindowProc
    10. Parameters hWnd&, Message&, wParam&, lParam&
    11. If Message& = ~WM_GETMINMAXINFO // liefert in lParam die Adresse auf MinMaxInfo (wird bei Größenänderung gesendet)
    12. If lParam& <> 0
    13. MMI# = lParam& // dort setzt man dann seine Grenzen, die eingehalten werden sollen
    14. With MMI#
    15. .ptMinTrackSize.x& = 300 // neue Min-Werte setzen
    16. .ptMinTrackSize.y& = 300 // neue Min-Werte setzen
    17. EndWith
    18. EndIf
    19. EndIf
    20. Return ~CallWindowProc(OldWndProc&, hWnd&, Message&, wParam&, lParam&)
    21. EndProc
    22. OldWndProc& = ~GetWindowLong(%hWnd,~GWL_WNDPROC,ProcAddr("MyWindowProc",4))
    23. 'Set("FastMode",0)
    24. '.... DAS PROGRAMM
    25. 'Set("FastMode",1)
    26. ~SetWindowLong(%hWnd,~GWL_WNDPROC,OldWndProc&)
    27. Dispose MMI#
    28. End
    Alles anzeigen
  • @Roland: Kannst du da was machen? Xprofan kümmert sich um die WindowProc soweit ich weiß, vielleicht hast du eine Möglichkeit, dass der Benutzer eine Minimalgröße angeben kann. Bisher nutze ich in etwa die folgende SubclassProc:

    Quellcode

    1. Def GetProcAddress(2) !"KERNEL32","GetProcAddress"
    2. Def GetModuleHandleA(1) !"KERNEL32","GetModuleHandleA"
    3. proc POKEDW
    4. PARAMETERS ADR&,V!
    5. var VI&=0
    6. Call(GetProcAddress(GetModuleHandleA("KERNEL32"),"RtlMoveMemory"),ADR&+2,ADDR(VI&),2)
    7. VI&=INT(V!-(VI&*2^16))
    8. Call(GetProcAddress(GetModuleHandleA("KERNEL32"),"RtlMoveMemory"),ADR&,ADDR(VI&),2)
    9. endproc
    10. subclassproc
    11. If SubClassMessage(%hWnd,$24)
    12. POKEDW &SLPARAM+24,minimalerxwert&
    13. POKEDW &SLPARAM+28,minimalerywert&
    14. Set("WinProc",1)
    15. endif
    16. endproc
    Alles anzeigen
    ...hilft aber eben nur, wenn sich das Programm in einer waitinput-Schleife befindet.
  • 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!
  • 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
  • Was spräche denn gegen einen Dialog (Create("Dialog",...)
    oder halt ein Fenster mit Dialogstil ?
    Da kann der User die Größe nicht ändern und
    das Problem tritt gar nicht erst auf.