Seite 1 von 2
Fenster an Bildschirmrand verankern?
Verfasst: 14.01.2007 19:55
von Jilocasin
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?
Verfasst: 14.01.2007 20:26
von DarkSoul
damit:
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
Die '10' ist der höchtabstand zum desktoprand, wo er noch 'ranzieht'. je höher diese zahl, desto 'magnetischer' wird das fenster zum rand

Verfasst: 14.01.2007 20:38
von AND51
Und wie kriegt man das fenster dann wieder weg

Verfasst: 14.01.2007 21:19
von Jilocasin
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....
Code: Alles auswählen
MachDassMeinFensterSichAutomatischBefestigt_(WindowiD(0),#True)

Verfasst: 16.01.2007 19:24
von DarkSoul
hmmm. bei mir gehts einwandfrei...

Verfasst: 17.01.2007 18:39
von Fluid Byte
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
1.) Code bitte sauber formatieren
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
Verfasst: 17.01.2007 21:34
von DarkSoul
1.) Code bitte sauber formatieren
mach selber!
2.) Bitte PB4 kompatibel machen (geht auch mit der Demo)
geht nicht! - api!
Verfasst: 17.01.2007 22:43
von Fluid Byte
mach selber!
Du hast es geposted also sorg bitte auch dafür das es "einigermaßen" lesbar ist. Sonst hilfts keinem.
geht nicht! - api!
Ach? In PB 4 gibts kein API?
Copy / Paste!

Verfasst: 18.01.2007 03:28
von #NULL
die demo unterstützt einfach kein WinAPI.
Verfasst: 18.01.2007 12:34
von Shardik
Ein weiteres schönes Beispiel aus dem englischen Forum von netmaestro:
http://www.purebasic.fr/english/viewtop ... 51&start=3