Seite 1 von 1

Fenster nur in einem bestimmten Bereich verschieben

Verfasst: 12.09.2004 13:37
von PBZecke
Ich möchte, dass mein Fenster nicht über den Desktop hinaus verschoben werden kann. Also nicht kleiner als 0 und größer als die Desktopauflösung.

Hab die Suchfunktion benutzt, aber in diesem Board nichts gefunden :mrgreen:

Verfasst: 12.09.2004 15:05
von PBZecke
Habe das Problem gelöst. Für alle die sowas auch mal brauchen, oder für's CodeArchiv:

Code: Alles auswählen

Global screenwidth,  screenheight 

screenwidth  = GetSystemMetrics_(#SM_CXFULLSCREEN)
screenheight = GetSystemMetrics_(#SM_CYFULLSCREEN)

OpenWindow(0, 434, 377, 285, 173,  #PB_Window_SystemMenu | #PB_Window_TitleBar , "New window ( 0 )")
 
 
 
 
  ;WindowsCallback ------------------------
  Procedure myCallback(WindowID, Message, wParam, lParam) 
    Result = #PB_ProcessPureBasicEvents 
    If Message =#WM_MOVING
      
      *windowRect.Rect = lparam
  
      If *windowRect\left <= 0 
        *windowRect\left = 0
        *windowRect\right = *windowRect\left + 285           
      EndIf
      If *windowRect\Top < 0  
        *windowRect\Top = 0
        *windowRect\bottom = *windowRect\Top + 173                    
      EndIf
      If *windowRect\right >= screenwidth  
        *windowRect\left = screenwidth -  285
        *windowRect\right = *windowRect\left + 285
      EndIf
      If *windowRect\bottom >= screenheight  
        *windowRect\Top = screenheight  -  173
        *windowRect\bottom = *windowRect\top + 173
      EndIf
      
    EndIf
         
    ProcedureReturn result
  EndProcedure


;Callback definieren
SetWindowCallback(@myCallback())






Repeat
  
  Event = WaitWindowEvent()
  
  
Until Event = #PB_EventCloseWindow

End

Verfasst: 12.09.2004 15:32
von NicTheQuick
Bei mir gibt [c]#CX_FullScreen[/c] nicht die richtige Höhe zurück. Ich habe es deshalb so gemacht:

Code: Alles auswählen

Procedure.l GetScreenHeight()
  Protected Height.l, Size.RECT, WindowInfo.WINDOWINFO
  
  Height = GetSystemMetrics_(#SM_CYSCREEN)
  
  hTaskBar.l = FindWindow_("Shell_TrayWnd", "")
  If hTaskBar
    If GetClientRect_(hTaskBar, @Size.RECT)
      Height - Size\bottom
    EndIf
  EndIf
  
  ProcedureReturn Height
EndProcedure

Debug GetSystemMetrics_(#SM_CYBORDER)

screenwidth  = GetSystemMetrics_(#SM_CXSCREEN)
screenheight = GetScreenHeight()

Verfasst: 12.09.2004 16:01
von Andre
Im alten Beispiel wird tatsächlich nicht die korrekte Bildschirmhöhe ermittelt, d.h. zumindest die Taskleiste wird bei der Ermittlung außen vor gelassen.

Unter Verwendung der neuen Desktop-Library kann man es einfach so machen:

Code: Alles auswählen

Global screenwidth,  screenheight 

ExamineDesktops()
screenwidth  = DesktopWidth(0)
screenheight = DesktopHeight(0)

OpenWindow(0, 434, 377, 285, 173,  #PB_Window_SystemMenu | #PB_Window_TitleBar , "New window ( 0 )") 
  
  
  ;WindowsCallback ------------------------ 
  Procedure myCallback(WindowID, Message, wParam, lParam) 
    Result = #PB_ProcessPureBasicEvents 
    If Message =#WM_MOVING 
      
      *windowRect.Rect = lparam 
  
      If *windowRect\left <= 0 
        *windowRect\left = 0 
        *windowRect\right = *windowRect\left + 285            
      EndIf 
      If *windowRect\Top < 0  
        *windowRect\Top = 0 
        *windowRect\bottom = *windowRect\Top + 173                    
      EndIf 
      If *windowRect\right >= screenwidth  
        *windowRect\left = screenwidth -  285 
        *windowRect\right = *windowRect\left + 285 
      EndIf 
      If *windowRect\bottom >= screenheight  
        *windowRect\Top = screenheight  -  173 
        *windowRect\bottom = *windowRect\top + 173 
      EndIf 
      
    EndIf 
          
    ProcedureReturn result 
  EndProcedure 


;Callback definieren 
SetWindowCallback(@myCallback()) 






Repeat 
  
  Event = WaitWindowEvent() 
  
  
Until Event = #PB_EventCloseWindow 

End 

Verfasst: 12.09.2004 16:09
von NicTheQuick
@André: Ja, so ist es natürlich ganz einfach. Aber in meinem Beispiel wollte ich die Höhe der Taskleiste nochmals abziehen, da sie sowieso OnTop ist und jedes Fenster somit dahinter bleiben würde. Zeiht man die Höhe also von der gesamten Bildschirmhöhe ab, so kann man das Fenster nur noch in dem Bereich verschieben, in dem es wirklich nur zu sehen ist. Problematisch wird das ganze aber sicherlich, wenn man die Tasklsiet auf "automatisch ausblenden" eingestellt hat. :|

Verfasst: 12.09.2004 16:37
von Andreas
Du kannst den aktuellen Arbeitsbereich auch direkt ermitteln.

Code: Alles auswählen

SystemParametersInfo_(#SPI_GETWORKAREA,0,r.Rect,0)
Debug r\right
Debug r\bottom

Verfasst: 12.09.2004 16:46
von PBZecke
oder

Code: Alles auswählen

screenwidth  = GetSystemMetrics_(#SM_CXSCREEN)
screenheight = GetSystemMetrics_(#SM_CYSCREEN)
In meinem Programm wollte ich auch nur den für Programme nutzbaren Bereich des Desktops. Daher nur bis zur Taskleiste.

Edit:
Sorry habe leider Nic's Post übersehen, da hat er das ja auch benutzt, weiß aber nicht warum bei ihm #SM_CXFULLSCREEN nicht die richtigen Werte ergibt, bei mir schon.

Edit 2:
Jetzt weiß ich was er meint: Da fehlt noch ein bisschen, nämlich die höhe der Titelleiste und der Ränder. Muss natürlich noch dazu addiert werden, dann stimmts. Habe ich in meinem schnell geschriebenen Beispiel vernachlässigt.