Seite 1 von 4
Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 21:29
von Kaeru Gaman
wie kann man - vermutlich nur mit API, deswegen poste ich hier - bei einem Fenster sozusagen den Rahmen an- und abschalten,
also von der Darstellung mit Rahmen und Kopfzeile umschalten auf Borderless und umgekehrt?
eine native PureBasic Funktion gibts da wohl nicht, da gibts anscheinend nur SetWindowState(#Window, Status) für Minimiert, Maximiert und Normal...
die win32.hlp ist nicht so umfangreich....
kann ich einfach per SetWindowLong_ die Window-Flags #PB_Window_BorderLess bzw. #PB_Window_SystemMenu an das Fenster senden?
und ist das dann #GWL_STYLE oder #GWL_EXSTYLE...?
Re: Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 22:11
von Josh
http://www.rsbasic.q-soft.ch/index.php? ... &Itemid=59
erzeugt zwar nur einen dünnen rahmen, aber vieleicht ist dein problem auf der selben basis zu lösen
Re: Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 22:14
von Kaeru Gaman
ähmn... hu
... aber danke.
Re: Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 22:54
von TomS
Hab mal bissal gegooglet und rausgekommen ist das hier:
Von Rahmen auf Ohne-Rahmen wechseln klappt schonmal. Nur leider habe ich beim Wiederherstellen des Borders ein Redraw-Problem (siehe Kommentar am Anfang).
Code: Alles auswählen
;Da der ReDraw bei mir nicht richtig funkioniert:
;Rechtsklick auf Taskleiste und "Wiederherstellen" verwenden.
;Danach evtl. mit Titelleiste bissal rumschieben^^
EnableExplicit
Enumeration
#Button
#Mode_Border
#Mode_NoBorder
EndEnumeration
Define event.i
Global mode.i = #Mode_Border
Procedure ChangeStyle()
If mode = #Mode_Border
mode = #Mode_NoBorder
SetWindowLongPtr_(WindowID(0),#GWL_STYLE,-1811939260)
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE,327680)
SetWindowPos_(WindowID(0), 0, 0, 0, 0, 0, #SWP_NOSIZE|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_FRAMECHANGED)
ElseIf mode = #Mode_NoBorder
mode = #Mode_Border
SetWindowLongPtr_(WindowID(0),#GWL_STYLE,#WS_BORDER|#WS_CAPTION|#WS_ICONIC|#WS_SYSMENU)
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE,#WS_EX_APPWINDOW)
;- Redraw.
;SetWindowPos sollte eigtl einen Redraw veranlassen. Funzt aber nicht richtig -_-
SetWindowPos_(WindowID(0), 0, 0, 0, 0, 0, #SWP_NOSIZE|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_FRAMECHANGED)
EndIf
EndProcedure
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#Button ,0,0,80,30,"Change Style")
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case #Button
ChangeStyle()
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf
Re: Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 23:00
von Kiffi
hier mein Vorschlag:
Code: Alles auswählen
#Window=0
#Button_Border=0
#Button_NoBorder=1
OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 300, 220, "")
ButtonGadget(#Button_Border, 5, 5, 290, 100, "Border")
ButtonGadget(#Button_NoBorder, 5, 110, 290, 100, "No Border")
Repeat
WWE=WaitWindowEvent()
Select WWE
Case #PB_Event_Gadget
Select EventGadget()
Case #Button_Border
SetWindowLong_(WindowID(#Window), #GWL_STYLE, GetWindowLong_(WindowID(#Window), #GWL_STYLE) | #WS_DLGFRAME)
SetWindowPos_(WindowID(#Window), 0,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_FRAMECHANGED)
Case #Button_NoBorder
SetWindowLong_(WindowID(#Window), #GWL_STYLE, GetWindowLong_(WindowID(#Window), #GWL_STYLE) &~ #WS_DLGFRAME)
SetWindowPos_(WindowID(#Window), 0,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_FRAMECHANGED)
EndSelect
EndSelect
Until WWE = #PB_Event_CloseWindow
Grüße ... Kiffi
Re: Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 23:04
von TomS
Oh mann. Und ich dachte & und ~ sind irgendwelche C++ spezifischen Sachen.

Was machen die genau?
Re: Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 23:07
von Kiffi
TomS hat geschrieben:Was machen die genau?
& = bitweises AND
~ = bitweises NOT
Alles weitere steht in der Hilfe unter "Variablen, Typen und Operatoren"
Grüße ... Kiffi
Re: Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 23:14
von ts-soft
Die funktionieren ja alle nicht richtig
Hier mal TomS seiner, leicht geändert, läuft unter Win 7 und XP (solange Ultramon aus ist)
Code: Alles auswählen
;Da der ReDraw bei mir nicht richtig funkioniert:
;Rechtsklick auf Taskleiste und "Wiederherstellen" verwenden.
;Danach evtl. mit Titelleiste bissal rumschieben^^
EnableExplicit
Enumeration
#Button
#Mode_Border
#Mode_NoBorder
EndEnumeration
Define event.i
Global mode.i = #Mode_Border
Procedure ChangeStyle()
If mode = #Mode_Border
mode = #Mode_NoBorder
SetWindowLongPtr_(WindowID(0),#GWL_STYLE,-1811939260)
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE,327680)
SetWindowPos_(WindowID(0), 0, 0, 0, 0, 0, #SWP_NOSIZE|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_FRAMECHANGED)
ElseIf mode = #Mode_NoBorder
mode = #Mode_Border
SetWindowLongPtr_(WindowID(0),#GWL_STYLE,#WS_BORDER|#WS_CAPTION|#WS_ICONIC|#WS_SYSMENU)
SetWindowLongPtr_(WindowID(0),#GWL_EXSTYLE,#WS_EX_APPWINDOW)
SetWindowState(0, #PB_Window_Normal)
EndIf
EndProcedure
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#Button ,0,0,80,30,"Change Style")
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case #Button
ChangeStyle()
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf
Gruß
Thomas
Re: Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 23:17
von TomS
@Kiffi:
Danke.
Man muss nur wissen, wo man suchen muss^^
@ts-soft: Also Kiffi's Code funzt bei mir gut. Win XP Pro SP3 32bit mit Win7-Aero-Skin
Wow. Du hast die blöde Api-funktion durch ne PB-Funktion ersetzt. Ich muss echt mal öfter in der Hilfe lesen...
Re: Fenster ändern Normal <-> Borderless
Verfasst: 18.02.2010 23:21
von Kiffi
ts-soft hat geschrieben:Die funktionieren ja alle nicht richtig

was funktioniert denn da bei Dir nicht richtig, wenn Du meinen Code ausführst?
Grüße ... Kiffi