Fenster Vista-like schließen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hallo!

Habe beide Codes getestet.
Mir gefällt Scarabol's Code besser, da Milan's Fenster schwarz gefüllt wird beim Schließen. Das wirkt unschön. Milan's Fenster wird außerdem zu schnell geschlossen, das Delay(1) ist einfach zu kurz.

Dagegen läuft Scarabol's Code zu langsam, sein Delay auf 15 oder gar 10 ms zu reduzieren schadet nicht. Das ist aber auch sein einziger Nachteil und den kann man leicht korrigieren.


Noch etwas: Ich habe es noch nicht wirklich gesehen, aber ich gehe davon aus, dass unter Vista auch die Gadgets im Fenster mitverkleinert werden, oder? Kann man das hier auch realisieren?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Ich glaube kaum dass das ruckelfrei zu realisieren wäre, du müsstest ja alle
Gadgets in einer Schleife durchgehen und sie prozentual verkleinern. Und das
mehrere Male (soll ja eine Animation sein).
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Kann man nicht einen ScreenShot vom Fensterinhalt machen, und diesen dann auf einem eigenen ImageGadget von Windows resizen lassen?

Ich frag mich nur grad:
Wie kann man einen ScreenShot nur vom jeweiligen Fenster erstellen?
(manuell gehts mit Shift+Druck)

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Das ist eigentlich keine schlechte Idee, irgentwo im engl. Forum hab ich da mal was gesehen *kram kram* <)
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Ich schau mir gerad DC an...

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Scarabol hat geschrieben:Kann man nicht einen ScreenShot vom Fensterinhalt machen, und diesen dann auf einem eigenen ImageGadget von Windows resizen lassen?

Ich frag mich nur grad:
Wie kann man einen ScreenShot nur vom jeweiligen Fenster erstellen?
(manuell gehts mit Shift+Druck)
Falsch, es geht mit ALT+DRUCK... :wink:

Die Bildmethode halte ich auch für die (bisher) geeigneste Methode. Nachdem man aber den Screenshot hat, sollte man aber alle Gadgets, die das Fenster enthält, freigeben, damit diese nicht versehentlich über dem ImageGadget() dargestellt werden oder die Animation verlangsamen.

P. S.: Was ist eigentlich dieses DC? Ist mir schon öfter über den Weg gelaufen, aber was genau ist das eigentlich?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Ist glaub ich son WindowedSceen auf dem die Gadgets dargestellt werden...

[Edit]
Wenn ich das Resize ganz langsam ablaufen lasse sieht man das das Resize nicht korrekt ausgeführt wird. Der Rahmen des Fensters verschwindet einfach...
[/Edit]

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Kann man nicht tricksen?

Soll das Fenster geschlossen werden, wenn es versteckt, minimiert oder vollstädig von anderen Fenstern überlappt ist (GetForegroundWindow_(), isIconic_(), ...), dann wird einfach nur CloseWindow() angewendet.

Andernfalls ist das Fenster doch auf jeden Fall sichtbar oder hat sogar den Fokus! Und wenn es den Fokus hat, kann man mit ALT+DRUCK nen Screenshot machen; das könnte man doch notfalls sogar mit keybd_event_() simulieren, oder nicht?

Dann bräuchte man sich den Screenshot nur mit Hilfe von GetClipboardImage() holen und zack! das war's.

Siehe hier: Screenshot speichern in drei Zeilen
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Es geht auch einfacher:

Code: Alles auswählen

Procedure TRound(Number.f)
  If Number-Int(Number) < 0.5
    ProcedureReturn Int(Number)
  Else
    ProcedureReturn Int(Number)+1
  EndIf
EndProcedure

Procedure Vista_CloseWindow(win, time)
  Protected x, y, w, h, t, winid, d
  winid = WindowID(win)
  x = WindowX(win)
  y = WindowY(win)
  w = WindowWidth(win)
  h = WindowHeight(win)
  t = 255
  s = 255/15
  d = TRound(time/15)
  CreateImage(0, w, h)
  hdc = StartDrawing(ImageOutput(0))
    BitBlt_(hdc,0,0,w,h,GetDC_(winid),0,0,#SRCCOPY)
  StopDrawing()
  UseGadgetList(winid)
    ImageGadget(1, 0, 0, w, h, ImageID(0))
  SetWindowLong_(winid,#GWL_EXSTYLE,GetWindowLong_(winid,#GWL_EXSTYLE)|#WS_EX_LAYERED)
  For i = 1 To 15
    ;Delay(d)
    Delay(500)
    SetLayeredWindowAttributes_(winid,0,t,#LWA_ALPHA)
    ResizeGadget(1, 0, 0, TRound(w*0.99), TRound(h*0.99))
    ResizeWindow(win, x+TRound(w*0.01), y+TRound(h*0.01), TRound(w*0.99), TRound(h*0.99))
    x+TRound(w*0.005)
    y+TRound(h*0.005)
    w = TRound(w*0.99)
    h = TRound(h*0.99)
    t - s
  Next
  CloseWindow(win)
EndProcedure

OpenWindow(1, #PB_Ignore, #PB_Ignore, 400, 300, "test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
CreateGadgetList(WindowID(1))
  ButtonGadget(1, 10, 10, 80, 20, "test")

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Vista_CloseWindow(1, 200)
Nur werden die Gadgets nicht refresht...

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Scarabol hat geschrieben:Ist glaub ich son WindowedSceen auf dem die Gadgets dargestellt werden...
Naja, ist sehr abstrakt, aber ganz ungefähr. Nennt sich DeviceContext, und kann mit CreateDC_() und CreateCompatibleDC_() erstell werden.

Ist auf jeden Fall ganzganz blöd gesagt ne Art Malfläche ^^
@AND: Aber das muss ich überdurchschnittl...äh, egal *fg*


Edit:
Vielleicht kann man das Flackern mit einem UpdateWindow_(winID) oder einem InvalidateRect_(winID, #NULL, #FALSE) verbessern? Kanns gerade nicht ausprobieren- das "LockWindow_()" muss dann aber raus.
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Antworten