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

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.