Fenster ändern Normal <-> Borderless

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Fenster ändern Normal <-> Borderless

Beitrag von Kaeru Gaman »

Kiffi hat geschrieben:hier mein Vorschlag:
:shock: boah so EASY im Grunde...
und über SetWindowLong (nicht Ptr) und #GWL_STYLE (nicht EX)... das hatte ich mir eigentlich gedacht und auch ausprobiert.

darauf den #WS_DLGFRAME zu LÖSCHEN bin ich einfach nicht gekommen.
Borderless ist $80000000, hab mir den kopf zerbrochen, warum das #WS_POPUP ist, und als ichs hingeschickt hab ist mein window komplett verschwunden... :|
und mit nem anderen style hatte es redraw-probleme, darauf, das einfach mal zu moven um das redraw zu erzwingen bin ich auch nicht gekommen.

also, vielen Dank Kiffi! :allright:

------------------------------------------------------------
oh hoppla... mehr postings...

ja, das funktioniert besser.
allerdings wenn ich den Rahmen wiederherstelle, wird das Fenster wieder zentriert...
das ist aber zweitrangig....

was für ein #GWL_STYLE ist -1811939260 und was für ein #GWL_EXSTYLE ist 327680 ...?

--------------------------------------------------------------------------------------------

zweitrangig ist es deshalb, weil ich eigentlich von dem was ich Plane her bei Rahmen entfernen gleichzeitig maximieren, und beim Rahmen wiederherstellen auch Größe wiederherstellen würde....

da muss ich noch mal ausprobieren, ob der reine #GWL_STYLE Ansatz von Kiffi ausreicht.


<offtopic>
(solange Ultramon aus ist)
.... na, um diese Zeit sollten deine Digimons auch schon alle im Bett sein...
</offtopic>
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Fenster ändern Normal <-> Borderless

Beitrag von TomS »

Kaeru Gaman hat geschrieben:was für ein #GWL_STYLE ist -1811939260 und was für ein #GWL_EXSTYLE ist 327680 ...?
Ich hab leider keine Ahnung. Ich hab wie gesagt gegooglet und das war die einzige Lösung, die gefunzt hat.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Fenster ändern Normal <-> Borderless

Beitrag von RSBasic »

Josh hat geschrieben: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
Rahmen entfernen gibt es dort auch, nur nicht unter OpenWindow, sondern unter Prozesse, aber man kann es sowieso durch WindowID() ersetzen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Fenster ändern Normal <-> Borderless

Beitrag von Kaeru Gaman »

jagut, das was du da hast ist ja praktisch das was Kiffi vorgeschlagen hat.
(nur das du SetWindowLongPtr benutzt)

... ich muss mal mehr in der MSDN schmökern...

aber wenn ich so eine Baumstruktur sehe...
MSDN > MSDN Library > Win32 and COM Development > User Interface > Windows User Interface > Windowing > Window Classes > Window Classes Reference > Functions >
komm ich mir vor wie Hänsel und Gretel....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Fenster ändern Normal <-> Borderless

Beitrag von RSBasic »

@Kaeru Gaman
Gibt es einen Nachteil, wenn man ...Ptr benutzt? (Kann ja sein, dass ich was verpasst habe <) )
Dachte eigentlich, es wäre sinnvoller, da es auch 64 Bit-kompatibel ist.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Fenster ändern Normal <-> Borderless

Beitrag von ts-soft »

SetWindowLong_ ist nur für x86
SetWindowLongPtr_ ist dasselbe für x64 und fungiert unter x86 als Makro für SetWindowLong_
Also einfach alle SetWindowLong_ in alten Sourcen durch SetWindowLongPtr_, sowie alle
GetWindowLong_ durch GetWindowLongPtr_ ersetzen!

Gruß
Thomas
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Fenster ändern Normal <-> Borderless

Beitrag von Kiffi »

ist ja schön und gut mit den *Ptr_, aber meine Frage hast Du damit
noch nicht beantwortet:
Kiffi hat geschrieben:
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?
gibt's ne Fehlermeldung? Wird der Rahmen nicht entfernt? Oder was anderes?
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Fenster ändern Normal <-> Borderless

Beitrag von ts-soft »

Kiffi hat geschrieben:ist ja schön und gut mit den *Ptr_, aber meine Frage hast Du damit
noch nicht beantwortet:
Es schaltet wohl 1 oder 2 x um, danach ist das Fenster minimiert. Desweiteren wird die
Position der Controls nicht korrigiert, sind also je nach Zustand verschoben.

Gruß
Thomas
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Fenster ändern Normal <-> Borderless

Beitrag von Kaeru Gaman »

also der maßgebliche Unterschied bei mir ist, dass der code von ts / Toms keinen 1pix-Rahmen übrig läßt, Kiffis aber schon.
ob die controls verschoben werden oder nicht ist nicht so maßgeblich, ich müßte sowieso das Borderless maximieren,
und in beiden Zuständen einen WindowedScreen ohne Randoffsets draufbekommen.

aber die unbenamsten Konstanten gefallen mir nicht.
ich muss mir die beiden mal genauer ansehen.

Also mir geht es darum, einen WindowedScreen von Fensterle auf Vollbild zu vergrößern, da muss ich beim Maximieren natürlich den Rahmen entfernen.

.... ob das den Aufwand wert ist, oder ob er einfacher wäre komplett borderless zu arbeiten und auf dem Screen selber eine Leiste anzubringen mit der man das Fenster verschieben kann (Mausposition tracken und MoveWindow), muss ich noch herausfinden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Fenster ändern Normal <-> Borderless

Beitrag von Kiffi »

ts-soft hat geschrieben:Es schaltet wohl 1 oder 2 x um, danach ist das Fenster minimiert.
kann ich hier nicht nachvollziehen.

@All: Wie sieht's bei Euch aus? (Besonders bei den 64-Bittern)
ts-soft hat geschrieben:Desweiteren wird die Position der Controls nicht korrigiert, sind also je nach Zustand verschoben.
da wird nichts verschoben. Die Position der Gadgets bleibt
in beiden Fällen in Relation zur Arbeitsfläche des Fensters gleich.

Der obere Button hat sowohl mit als auch ohne Rahmen x = 5 und y = 5.

Im übrigen ist kein Problem des Codes, sondern eine
Luxusfunktion, die ich in einem Beispiel-Code natürlich nicht
einbaue, weil ich KG für fähig halte, das alleine umzusetzen
(wenn er die 'Korrektur' überhaupt benötigt).

@KG: hier hast Du noch ein paar Konstanten zum spielen:

Code: Alles auswählen

Procedure WindowBorder(Window, Flag)
  
  If Flag
    
    ; SetWindowLong_(WindowID(Window), #GWL_EXSTYLE, GetWindowLong_(WindowID(Window), #GWL_EXSTYLE) | #WS_EX_CLIENTEDGE ) 
    ; SetWindowLong_(WindowID(Window), #GWL_EXSTYLE, GetWindowLong_(WindowID(Window), #GWL_EXSTYLE) | #WS_EX_WINDOWEDGE ) 
    SetWindowLong_(WindowID(Window), #GWL_STYLE, GetWindowLong_(WindowID(Window), #GWL_STYLE) | #WS_DLGFRAME) 
    ; SetWindowLong_(WindowID(Window), #GWL_STYLE, GetWindowLong_(WindowID(Window), #GWL_STYLE) | #WS_THICKFRAME) 
    SetWindowLong_(WindowID(Window), #GWL_STYLE, GetWindowLong_(WindowID(Window), #GWL_STYLE) | #WS_OVERLAPPED ) 
    SetWindowLong_(WindowID(Window), #GWL_STYLE, GetWindowLong_(WindowID(Window), #GWL_STYLE) | #WS_BORDER) 
    
  Else
    
    ; SetWindowLong_(WindowID(Window), #GWL_EXSTYLE, GetWindowLong_(WindowID(Window), #GWL_EXSTYLE) &~ #WS_EX_CLIENTEDGE ) 
    ; SetWindowLong_(WindowID(Window), #GWL_EXSTYLE, GetWindowLong_(WindowID(Window), #GWL_EXSTYLE) &~ #WS_EX_WINDOWEDGE ) 
    SetWindowLong_(WindowID(Window), #GWL_STYLE, GetWindowLong_(WindowID(Window), #GWL_STYLE) &~ #WS_DLGFRAME) 
    ; SetWindowLong_(WindowID(Window), #GWL_STYLE, GetWindowLong_(WindowID(Window), #GWL_STYLE) &~ #WS_THICKFRAME) 
    SetWindowLong_(WindowID(Window), #GWL_STYLE, GetWindowLong_(WindowID(Window), #GWL_STYLE) &~ #WS_OVERLAPPED ) 
    SetWindowLong_(WindowID(Window), #GWL_STYLE, GetWindowLong_(WindowID(Window), #GWL_STYLE) &~ #WS_BORDER) 
    
  EndIf
  
  SetWindowPos_(WindowID(Window), 0,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE|#SWP_NOZORDER|#SWP_FRAMECHANGED)
  
EndProcedure
        
#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
          WindowBorder(#Window, #True)
          
        Case #Button_NoBorder
          WindowBorder(#Window, #False)
          
      EndSelect
      
  EndSelect
  
Until WWE = #PB_Event_CloseWindow
Das *Ptr_ darfst Du selber dranbasteln :mrgreen:

Grüße ... Kiffi
a²+b²=mc²
Antworten