Fenster nur in einem bestimmten Bereich verschieben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
PBZecke
Beiträge: 394
Registriert: 02.09.2004 17:34

Fenster nur in einem bestimmten Bereich verschieben

Beitrag 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:
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Benutzeravatar
PBZecke
Beiträge: 394
Registriert: 02.09.2004 17:34

Beitrag 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
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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()
Bild
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1755
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 »

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 
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag 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. :|
Bild
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag 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
Gruss Andreas
Benutzeravatar
PBZecke
Beiträge: 394
Registriert: 02.09.2004 17:34

Beitrag 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.
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
Antworten