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 :wink:

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

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)
:mrgreen:

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

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! :allright:

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