Magnetrand?!

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1767
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

@Nico: gelungenes Beispiel mit dem OptionWindow. :D

Sollte auch sonst der Allgemeinheit erhalten bleiben => CodeArchiv ?
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

@André

Gern kannst du das ins CodeArchiv stellen doch ist es da besser wenn ich den Code soweit umbaue das man nicht die ICON´s aus dem zip braucht sondern ich einfach welche aus der shell32 nehme da der code ja sonst nich per copy and past angeschaut werden kann.

Sag mir einfach bescheid ob ich den code soweit abändern soll und du ihn dann rein stellen willst.

Danke dor schon mal.

[Edit] Und ein paar mehr komentare würde ich dann auch rein schreiben das man auch weis wo was passiert [/Edit]
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1767
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

@Nico: ja, kannst gerne noch ein paar Kommentare dazu schreiben. Mit den Icons direkt aus der Shell32 nehmen ist auch keine schlechte Idee - natürlich wäre es auch möglich, die Icons in den gfx Ordner im CodeArchiv zu integrieren.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

OK ich werd das mal soweit umbauen das die icon´s aus der shell32 geladen werden und bastel die komentare mit rein.
Ich schick dir ds dann per mal zu.
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Nachdem freedimension wieder mal den Magnetrand des Bildschirms erwähnt hat, musste ich diesen ALTEN Thread ausgraben.

Damals konnte mir nicht richtig geholfen werden, ich habe gestern versucht das problem selbst zu lösen, nach 3 stündigen graben in der MS SDK, habe ich es fürs erste aufgegeben. Bin noch nicht so fit in der API Programmierung.

Ich hoffe das mir jetzt irgendjemand helfen kann. Ich versuch es heute nochmal auf ein neues ....

Danke :allright:

MFG Lukaso
Zuletzt geändert von Lukaso am 08.03.2005 20:34, insgesamt 1-mal geändert.
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

In guter alter Tradition gebe ich (obwohl ich dir ein komplettes Beispiel liefern könnte) nur ein paar "Schubser" in die richtige Richtung. Denken muss ein Programmierer schon selber, macht dafür aber auch mehr Spass :D

1. Es gibt noch weitere Messages welche nicht in PB selber definiert sind, so z.B. #WM_SIZING und #WM_MOVING. Diese kannst du in einem WindowCallback abfragen. Dabei wird dir eine RECT-Struktur mit den Koordinaten des Fensters übergeben, welche du verändern kannst um die neue Position des Fensters festzulegen. Das geht während des gesamten Ziehvorgangs.

2. Unter Windows können Fenster in zwei einstellbaren Modus (ja, das ist tatsächlich der Plural ;) ) verschoben werden. "Fensterinhalt bei ziehen anzeigen" und eben nicht. Leider verhält sich das oben Beschriebene in beiden Modus anders. Hierdrauf musst du also unterschiedlich reagieren. Abfragen kannst du diesen Modus über SystemParametersInfo_(#SPI_GETDRAGFULLWINDOWS,0,@Drag,0)

3. Alles weitere ist Mathematik, hier ein bisserl Vergleichen, dort etwas abziehen usw.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

@freedimension
Danke für deine Hilfe, habe es jetzt fass geschafft. :allright:

Ich brauche jetzt nur noch ne möglichkeit den Rahmen beim Ziehen abzuschalten, so dass er nicht mehr angezeigt wird.
Oder ne möglichkeit den Rahmen zu beeinflussen. Das erstgenannte würde ich bevorzugen. Habe jetzt im PSDK gesucht, finde aber keinen anhaltspunkt wie ich den Rahmen abschalten kann.

Ansonsten :allright:

MFG Lukaso
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

freedimension hat geschrieben:2. Unter Windows können Fenster in zwei einstellbaren Modus (ja, das ist tatsächlich der Plural ;) ) verschoben werden. "Fensterinhalt bei ziehen anzeigen" und eben nicht. Leider verhält sich das oben Beschriebene in beiden Modus anders.
Da muß ich jetzt mal nachfragen was sich da anders verhalten
soll, da ich das selbst schon genutzt habe und sich hier immer
wie erwartet verhalten hat.
Das heisst entweder wird das komplette Fenster per Magnet
an den Rand angedockt, oder eben nur das gezeichnete Rechteck,
wenn das der Nutzer so wünscht und eingestellt hat.

Muß damit mal kurz gegen meine kleine Regel (no Code)
verstoßen, aber was soll's: ;)

Code: Alles auswählen

;
; Workarea Border Magnet
;
;   by Danilo, 9th March 2005
;
#MAGNET = 25

Procedure WndProc(hWnd,Msg,wParam,lParam)
  Static MouseMoveX,MouseMoveY

  If hWnd = WindowID(0)
    Select Msg
      Case #WM_NCLBUTTONDOWN
        GetWindowRect_(hWnd,rect.RECT)
        MouseMoveX = (lParam & $FFFF)       - rect\left
        MouseMoveY = ((lParam >> 16)&$FFFF) - rect\top
      Case #WM_MOVING
        *rect.RECT = lParam
        If *rect
          width  = *rect\right  - *rect\left
          height = *rect\bottom - *rect\top
          SystemParametersInfo_(#SPI_GETWORKAREA,0,rect.RECT,0)

          If *rect\left < #MAGNET                    ; left
            *rect\left = 0 : modified = 1
          EndIf
          If *rect\top  < #MAGNET                    ; top
            *rect\top  = 0 : modified = 1
          EndIf
          If *rect\right > rect\right - #MAGNET      ; right
            *rect\left = rect\right - width   : modified = 1
          EndIf
          If *rect\bottom > rect\bottom - #MAGNET    ; bottom
            *rect\top  = rect\bottom - height : modified = 1
          EndIf

          If modified
            *rect\right  = *rect\left + width
            *rect\bottom = *rect\top  + height
            SetCursorPos_(*rect\left+MouseMoveX,*rect\top+MouseMoveY)
            ProcedureReturn #TRUE
          EndIf
        EndIf
    EndSelect
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure



OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Move me!")
  SetWindowCallback(@WndProc())

Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
Verhält sich das vielleicht nur auf manchen Windows-Version
nicht korrekt, freedimension? Oder was meintest Du genau?

Danke schonmal!
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Ich hatte bei einer Anwendung einmal einen Magnetrand (das erste und bisher einzige Mal) programmiert. Dabei hatte ich einen, für mich unerklärlichen Bug, der bei einigen Freunden auftauchte, bei mir allerdings nicht. Nach langem Suchen bin ich dann darauf gestoßen, dass hier eben diese Einstellung dazu führte. Bei gesetztem Häkchen wird das Fenster nicht nur beim Ziehen angezeigt, sondern auch noch gleich mitbewegt. Die XY-Koordinaten änderten sich von Aufruf zu Aufruf. Ich weiß jetzt leider nicht mehr, warum ich diese benötigt hatte, aber es gab einen triftigen Grund. Aber es gab auch schon andere Personen die mir von Problemen mit eben dieser Einstellung berichtet hatten.

Achja, ich erachte Deine Lösung noch nicht als optimal. Man muss das Fenster ja richtiggehend vom Rand wegreißen da der Mauscursor bei zu geringer Bewegung ständig wieder auf den selben Platz geschoben wird. Auch verhält sich das Fenster, zumindest hier bei mir, etwas träge wenn es eingerastet ist. Ansonsten aber ein guter Ansatzpunkt.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

freedimension hat geschrieben:Achja, ich erachte Deine Lösung noch nicht als optimal.
Das ist auch keine Lösung, sondern ein einzelnes Beispiel was
ich vorhin schnell gemacht habe, so dass Du mir daran zeigen
kannst wann Dein besagter Fehler kommt.
freedimension hat geschrieben:Man muss das Fenster ja richtiggehend vom Rand wegreißen da der Mauscursor bei zu geringer Bewegung ständig wieder auf den selben Platz geschoben wird. Auch verhält sich das Fenster, zumindest hier bei mir, etwas träge wenn es eingerastet ist.
Wenn Du das mit der Mouseabfrage (und SetCursorPos) rausmachst,
dann ist es besser. Dann muß allerdings noch eine Abfrage rein
wie weit die Mouse vom ursprünglichen Punkt entfernt ist, sonst
kann man mit dieser Methode den Cursor ganz langsam wegbewegen,
wenn das Fenster einmal angedockt ist.
Hab deshalb vorhin den einfachsten Weg gewählt um das zu
verhindern... :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten