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 :wink:
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 :wink:
was funktioniert denn da bei Dir nicht richtig, wenn Du meinen Code ausführst?

Grüße ... Kiffi