Magnetrand?!

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Magnetrand?!

Beitrag 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 :allright:

Lukaso :wink:
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

ich hab grad verstanden was du willst! :lol:

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 ?
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag 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 :wink:
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag 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.
Zuletzt geändert von MLK am 04.12.2004 18:18, insgesamt 1-mal geändert.
orange-blue
Beiträge: 556
Registriert: 04.09.2004 22:23
Kontaktdaten:

Beitrag 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
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag 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
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
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 »

@ChaosKid: leider flackert Dein Code durch das ständige Zurücksetzen der Fensterposition beim Verschieben an den Desktop-Rand gewaltig.... /:->
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Re: Magnetrand?!

Beitrag 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)
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag von ChaOsKid »

@Andre
ich hab das ja auch nur mal schnell zusammengeschustert :)

@MLK
beim obigen code hab ich mich an Lukaso's beispiel orientiert.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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
Antworten