Seite 2 von 8
Verfasst: 04.10.2007 22:09
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?
Verfasst: 04.10.2007 22:13
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).
Verfasst: 04.10.2007 22:17
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
Verfasst: 04.10.2007 22:24
von milan1612
Das ist eigentlich keine schlechte Idee, irgentwo im engl. Forum hab ich da mal was gesehen *kram kram*

Verfasst: 04.10.2007 22:31
von Scarabol
Ich schau mir gerad DC an...
Gruß
Scarabol
Verfasst: 04.10.2007 22:53
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...
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?
Verfasst: 04.10.2007 23:08
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
Verfasst: 04.10.2007 23:35
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
Verfasst: 04.10.2007 23:47
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
Verfasst: 05.10.2007 10:12
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.