Seite 1 von 3
Magnetrand?!
Verfasst: 04.12.2004 13:37
von Lukaso
Hallo,
ich versuche das Anziehen des Fensters an den Bildschirmrand, ich habe es mit einem mix aus WindowX() und Movewindow versucht, funktioniert auch, nur erst beim loslassen, ich möchte allerdings, dass auch der Rahmen der beim Verschieben sichtbar ist, auch Angezogen wird. Kann mir irgendjemand helfen?
Danke
Lukaso

Verfasst: 04.12.2004 15:06
von MLK
ich hab grad verstanden was du willst!
wenn man dabei ist, das fenster zu verschieben und in die nähe des bildschirmrandes kommt, dann soll das fenster an diesen andocken, wie es zb winamp tut. das problem ist, dass beim verschieben keine events entstehen, nur am anfang und ende, und deshalb die hauptschleife nicht durchlaufen wird.
richtig ?
vielleicht anstatt WaitWindowEvent() einfach WindowEvent() verwenden ?
Verfasst: 04.12.2004 18:03
von Lukaso
Code: Alles auswählen
If OpenWindow(0, 100, 200, 290, 200, #PB_Window_SystemMenu, "Magnedrand Test")
Repeat
EventID = WindowEvent()
If WindowX() < 25
MoveWindow(0, WindowY())
ElseIf WindowX() > GetSystemMetrics_(#SM_CXSCREEN)-25-WindowWidth()
MoveWindow(GetSystemMetrics_(#SM_CXSCREEN)-WindowWidth(), WindowY())
EndIf
If WindowY() < 25
MoveWindow(WindowX(), 0)
ElseIf WindowY() > GetSystemMetrics_(#SM_CYSCREEN)-25-WindowHeight()
MoveWindow(WindowX(), GetSystemMetrics_(#SM_CYSCREEN)-WindowHeight())
EndIf
Delay(10)
Until EventID = #PB_EventCloseWindow
EndIf
End
@MLK
Dachte auch das liegt daran, geht aber trotzdem nicht

Verfasst: 04.12.2004 18:16
von MLK
WindowX() scheint sich wohl erst beim ende des verschiebens zu aktualisieren. musst du wohl die mausdaten bei gedrückter linken maustaste abfragen und dich so durchwurschteln.
was ich überhaupt nicht verstehe, ist warum #PB_Event_MoveWindow in diesem beispiel nicht funktioniert:
Code: Alles auswählen
If OpenWindow(0, 0, 0, 200, 200, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_MoveWindow
Debug 1
EndSelect
ForEver
EndIf
dann bräuchte man ja nur noch durch die relativen mauskoordinaten im fenster, die fensterkoordinaten selbst auswerten und gegebenenfalls das fenster andocken lassen.
Verfasst: 04.12.2004 18:17
von orange-blue
Das geht glaub ich am besten per api, aber leider kann ich dir nur einen sehr langen vb code anbieten(vielleicht übersetzt ich ihn ja mal, wenn ich lust und zeit hab).
http://www.activevb.de/tipps/vb6tipps/tipp0389.html
Verfasst: 05.12.2004 17:26
von ChaOsKid
hi Lukaso
mit einem WindowCallback geht sowas
Code: Alles auswählen
Procedure GetData()
Shared DesktopWidth, DesktopHeight, WindowWidth, WindowHeight
DesktopWidth = GetSystemMetrics_(#SM_CXFULLSCREEN)
DesktopHeight = GetSystemMetrics_(#SM_CYFULLSCREEN)
WindowWidth = WindowWidth() + GetSystemMetrics_(#SM_CXSIZEFRAME)<<1
WindowHeight = WindowHeight() + GetSystemMetrics_(#SM_CYSIZEFRAME)<<1
EndProcedure
Procedure.l WindowMove()
Shared DesktopWidth, DesktopHeight, WindowWidth, WindowHeight
Rand = 20
WindowX = WindowX()
WindowY = WindowY()
If WindowX < Rand
mustMove = 1
WindowX = 0
ElseIf WindowX > DesktopWidth-WindowWidth-Rand
mustMove = 1
WindowX = DesktopWidth-WindowWidth
EndIf
If WindowY < Rand
mustMove = 1
WindowY = 0
ElseIf WindowY > DesktopHeight-WindowHeight-Rand
mustMove = 1
WindowY = DesktopHeight-WindowHeight
EndIf
If mustMove
MoveWindow(WindowX, WindowY)
EndIf
ProcedureReturn mustMove
EndProcedure
Procedure.l Events(EventID)
Select EventID
Case #PB_Event_MoveWindow
GetData()
WindowMove()
ProcedureReturn 0
Case #PB_EventCloseWindow
ProcedureReturn 1
EndSelect
EndProcedure
Procedure WinCallback(hwnd, msg, wParam, lParam)
Events(msg)
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 100, 200, 280, 200, #PB_Window_SystemMenu|#PB_Window_SizeGadget, "Magnedrand Test")
SetWindowCallback(@WinCallback())
Repeat
Until Events(WaitWindowEvent())
EndIf
End
mfG
Tobi
Verfasst: 05.12.2004 17:49
von Andre
@ChaosKid: leider flackert Dein Code durch das ständige Zurücksetzen der Fensterposition beim Verschieben an den Desktop-Rand gewaltig....

Re: Magnetrand?!
Verfasst: 05.12.2004 17:52
von MLK
und der code tut nicht was er tun soll:
Lukaso hat geschrieben:..ich möchte allerdings, dass auch der Rahmen der beim Verschieben sichtbar ist, auch Angezogen wird..
(gefällt mir trotzdem gut der code)
Verfasst: 05.12.2004 18:40
von ChaOsKid
@Andre
ich hab das ja auch nur mal schnell zusammengeschustert
@MLK
beim obigen code hab ich mich an Lukaso's beispiel orientiert.
Verfasst: 05.12.2004 19:19
von nicolaus
@Lukaso
Ich hatte mal vor längere zeit ein Optionswindow gebastelt wo ich auch windows "docken" tu.
Ich habe den code noch mal in ne Zip gepackt.
Kannst du dir ja mal anschauen wie ich das gemacht habe vieleicht hilft dir das.
Hier das zip!!!
Hoffe das hilft dir ein wenig
MfG Nico