Fenster nur in einem bestimmten Bereich verschieben
Fenster nur in einem bestimmten Bereich verschieben
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
Hab die Suchfunktion benutzt, aber in diesem Board nichts gefunden
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden...
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...
- 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:
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()
- 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:
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:
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
- 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:
@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.
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
oder
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.
Code: Alles auswählen
screenwidth = GetSystemMetrics_(#SM_CXSCREEN)
screenheight = GetSystemMetrics_(#SM_CYSCREEN)
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...