Fenster an Bildschirmrand verankern?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Fenster an Bildschirmrand verankern?

Beitrag 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?
Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag 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:
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Und wie kriegt man das fenster dann wieder weg :wink:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag 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:
Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag von DarkSoul »

hmmm. bei mir gehts einwandfrei... :roll:
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag von DarkSoul »

1.) Code bitte sauber formatieren
mach selber!
2.) Bitte PB4 kompatibel machen (geht auch mit der Demo)
geht nicht! - api!
Bild
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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:
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

die demo unterstützt einfach kein WinAPI.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Ein weiteres schönes Beispiel aus dem englischen Forum von netmaestro:
http://www.purebasic.fr/english/viewtop ... 51&start=3
Antworten