Fenster an Bildschirmrand verankern?
Fenster an Bildschirmrand verankern?
Hi...
Ist es möglich per API ein Fenster so handzuhaben dass es, wenn man es in die Nähe des Bildschirmrandes rückt, sich automatisch an diesem "befestigt"?
Als Beispiel so wie bei "Trillian" etc...
Oder muss man das "per Hand", also mit Abfragen und Verrücken selbst bewerkstelligen?
Ist es möglich per API ein Fenster so handzuhaben dass es, wenn man es in die Nähe des Bildschirmrandes rückt, sich automatisch an diesem "befestigt"?
Als Beispiel so wie bei "Trillian" etc...
Oder muss man das "per Hand", also mit Abfragen und Verrücken selbst bewerkstelligen?
damit:
Die '10' ist der höchtabstand zum desktoprand, wo er noch 'ranzieht'. je höher diese zahl, desto 'magnetischer' wird das fenster zum rand 
Code: Alles auswählen
winxsize=windowwidth()
winysize=windowheight()
SystemParametersInfo_(#SPI_GETWORKAREA,0,wrc.RECT,0)
If WindowX() < wrc\left+10:MoveWindow(wrc\left,WindowY()):EndIf
If WindowY() < wrc\top+10:MoveWindow(WindowX(),wrc\top):EndIf
If WindowX()+WinXSize > wrc\right-10:MoveWindow(wrc\right-WinXSize,WindowY()):EndIf
If WindowY()+WinYSize > wrc\bottom-10:MoveWindow(WindowX(),wrc\bottom-WinYSize):EndIf


Und wie kriegt man das fenster dann wieder weg 

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
Jo.. die Idee hatte ich auch.
Nur leider flackert das Fenster bei mir hierbei ziemlich
Deshalb dachte ich es gäbe vllt eine API in etwa wie....

Nur leider flackert das Fenster bei mir hierbei ziemlich

Deshalb dachte ich es gäbe vllt eine API in etwa wie....
Code: Alles auswählen
MachDassMeinFensterSichAutomatischBefestigt_(WindowiD(0),#True)

- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Code: Alles auswählen
winxsize=windowwidth()
winysize=windowheight()
SystemParametersInfo_(#SPI_GETWORKAREA,0,wrc.RECT,0)
If WindowX() < wrc\left+10:MoveWindow(wrc\left,WindowY()):EndIf
If WindowY() < wrc\top+10:MoveWindow(WindowX(),wrc\top):EndIf
If WindowX()+WinXSize > wrc\right-10:MoveWindow(wrc\right-WinXSize,WindowY()):EndIf
If WindowY()+WinYSize > wrc\bottom-10:MoveWindow(WindowX(),wrc\bottom-WinYSize):EndIf
2.) Bitte PB4 kompatibel machen (geht auch mit der Demo)
3.) Zusammenhang fehlt, wie setze ich den code korrekt ein?
Dieser code macht nur Sinn wenn man entsprechende Nachrichten mit einem Callback abfängt (#WM_MOVE, #WM_WINDOWPOSCHANGED, etc.). Das funktioniert aber nur teilwiese da sich das Fenster nicht über Bildschirmrand hinaus verschieben lässt. Außerdem flackert es stark und es gibt Darstellungsprobleme wenn man das Fenster minimiert / maximiert.
Der Ansatz ist schon richtig halt nur "dürftig" umgesetzt:
Code: Alles auswählen
; Title: Window Snapping
; Author: Fluid Byte
; Date: January 17, 2007
#TOLERANCE = 20
OpenWindow(0,0,0,280,200,"Window Snapping",#WS_OVERLAPPEDWINDOW | 1)
CreateGadgetList(WindowID(0))
TextGadget(0,10,40,260,180,"MOVE" + #CRLF$ + "ME!",#SS_CENTER)
SetGadgetFont(0,LoadFont(0,"Arial",40,#PB_Font_Bold))
Procedure WindowCallback(hWnd.l,uMsg.l,wParam.l,lParam.l)
Select uMsg
Case #WM_WINDOWPOSCHANGING
*lpwp.WINDOWPOS = lParam
SystemParametersInfo_(#SPI_GETWORKAREA,0,rwa.RECT,0)
; // OUTSIDE SCREEN
If *lpwp\x < 0
*lpwp\x - #TOLERANCE
EndIf
If (*lpwp\x + *lpwp\cx) > rwa\right
*lpwp\x + #TOLERANCE
EndIf
If *lpwp\y < 0
*lpwp\y - #TOLERANCE
EndIf
If (*lpwp\y + *lpwp\cy) > rwa\bottom
*lpwp\y + #TOLERANCE
EndIf
; // INSIDE SCREEN
If *lpwp\x >= 0 And *lpwp\x <= (rwa\Left + #TOLERANCE)
*lpwp\x = rwa\Left
EndIf
If (*lpwp\x + *lpwp\cx) <= rwa\right And (*lpwp\x + *lpwp\cx) >= (rwa\right - #TOLERANCE)
*lpwp\x = rwa\right - *lpwp\cx
EndIf
If *lpwp\y >= 0 And *lpwp\y <= (rwa\Top + #TOLERANCE)
*lpwp\y = rwa\Top
EndIf
If (*lpwp\y + *lpwp\cy) <= rwa\Bottom And (*lpwp\y + *lpwp\cy) >= (rwa\Bottom - #TOLERANCE)
*lpwp\y = rwa\Bottom - *lpwp\cy
EndIf
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
SetWindowCallback(@WindowCallback())
While WaitWindowEvent() ! 16 : Wend
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Ein weiteres schönes Beispiel aus dem englischen Forum von netmaestro:
http://www.purebasic.fr/english/viewtop ... 51&start=3
http://www.purebasic.fr/english/viewtop ... 51&start=3