Seite 1 von 2
SkinWindow (optimierte Methode)
Verfasst: 19.12.2005 02:37
von Mischa
Hab' mich heute Nacht mal (wieder) mit den WindowSkins
beschäftigt,weil ich eventuell gDesign auch damit ausstatten will.
Das Problem ist immer die Geschwindigkeit gewesen.
(bei größeren Fenstern) Daher hatte ich damals den SkinGenerator gemacht
und Danilo (aus den gleichen Gründen nehme ich an) die
SkinWinFast lib. In beiden Fällen müssen dafür aber die Maskendaten
gespeichert werden, sind also schon vorberechnet.
Mit dieser kleinen Mini-Lib (1,8 KB)
Download:
http://www.thinkrelative.de/skin.zip
geht es auch in den meisten Fällen ohne, denke ich.
Wenn ich mich an SkinWin orientiere, und das muß ich, da ja die
meisten damit arbeiten werden, ist meine 'etwas andere' Routine
bis zu 8 mal schneller.
Testet doch bitte mal.
Gruß,
Mischa
Verfasst: 19.12.2005 03:05
von MLK
Verfasst: 19.12.2005 03:16
von Mischa
@MLK??
Was ist das jetzt? Ein Schliereneffekt beim verschieben?
Wenn ich das Beispiel-Fenster etwas durch die Gegend schiebe
und schnell mal die Drucktaste drücke kriege ich auch so
ein schönes Bild. (Mit SkinWin übrigens auch

)
Etwas genauer bitte? Ist das Fenster jetzt in Bewegung während der
Aufnahme, oder steht es still. Rekonstruiert JaPBe ordentlich seinen
eigenen Hintergrund?
Fehler, oder nicht?

Verfasst: 19.12.2005 03:32
von MLK
das fenster war natürlich in bewegung als ich den screenshot machte. verhalten auf anderen hintergrundfenstern ähnlich.
Verfasst: 19.12.2005 03:37
von ts-soft
Hab zum testen mal das example erweitert:
Code: Alles auswählen
Enumeration
#SkinWindow
#SkinWin
#SkinWinFast
EndEnumeration
#FLAG = #SkinWindow ;
winflags=#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible
CompilerSelect #FLAG
CompilerCase #SkinWinFast
image = LoadFastSkin("test.PBS")
OpenWindow(0,0,0,FastSkinWidth(image),FastSkinHeight(image),winflags,"SkinWindow")
SkinWinFast(WindowID(),Image)
CompilerCase #SkinWin
image=LoadImage(#PB_Any,"test.bmp")
OpenWindow(0,0,0,ImageWidth(),ImageHeight(),winflags,"SkinWindow")
SkinWin(WindowID(),ImageID())
CompilerCase #SkinWindow
image=LoadImage(#PB_Any,"test.bmp")
OpenWindow(0,0,0,ImageWidth(),ImageHeight(),winflags,"SkinWindow")
SkinWindow(WindowID(),ImageID())
CompilerEndSelect
HideWindow(0,0)
Repeat
event=WaitWindowEvent()
If event=#WM_LBUTTONDOWN
SendMessage_(WindowID(),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
EndIf
Until GetAsyncKeyState_(#VK_ESCAPE)
CompilerIf #FLAG = #SkinWindow
FreeWindowSkin(WindowID())
CompilerEndIf
Mein Eindruck:
Mischas Lib ist wesentlich schneller als SkinWin und in etwa gleich mit
SkinWinFast. Wie man das messen könnte, ist mir nichts zu eingefallen
Verfasst: 19.12.2005 03:39
von Mischa
@MLK: Aha. Danke!
Das ist normal. Wie bereits erwähnt, ist das bei SkinWin nicht anders.
Abgesehen davon ist das Ding 1024 * 768 und hat sicherlich ein paar
Zacken und Lücken mehr als so ziemlich jedes sinnvoll geskinnte
Fenster jemals hätte.
Ist nur ein Beispiel, das die Kalkulation-Geschwindigkeit zeigen soll.
Schlieren-Effekte hat man ansonsten bei eingeschalteter Fensteranimation
aber bei so ziemlich jedem geskinnten Fenster.
(Mehr, oder weniger, je nach Größe und Form)
Gruß,
Mischa
Verfasst: 20.12.2005 20:51
von rayman1970
Hi Mischa !
Dein optimiertes SkinWin ist echt super genial schnell !! Mein Kompliment !!!
Ich werde es selbstverständlich in meine Programme einbauen .
Mir ist aufgefallen das beim original SkinWin die transparente Farbe , ohne Eingabe der Koordinaten , in der linken , oberen Ecke definiert wird . Bei dir passiert das in der rechten , oberen Ecke . Ich hatte meinen alten SkinWin gegen deinen Neuen ausgetauscht und hatte dadurch zuerst Kompatibilitätsprobleme .
Aber alles in allem kann ich nur sagen : PERFEKT !!!
Gruss Rayman
Verfasst: 20.12.2005 21:35
von Hroudtwolf
Wenn ihr gerne sehen wollt wie man sowas selbst machen kann...
http://www.purebasic-lounge.de/viewtopic.php?t=1657
Verfasst: 20.12.2005 22:36
von Mischa
@Hroudtwolf
Du meinst wie 'SetLayeredWindowAttributes_()' also Windows
das selbst macht, gell?
Und übrigens ist Windows erst ab 2000 erwachsen genug das selber
tun zu können. (Hättest Du evtl. dabei schreiben können?)
Mit 98/Me muß man das dann wirklich selber machen, oder aber
z.B. meine Lib verwenden.
Ansonsten, nettes Beispiel HW.
Gruß,
Mischa
Verfasst: 20.12.2005 23:02
von Hroudtwolf
Danke.
Habs auch, wie dort geschrieben, nur unter XP getestet.
Wie genau funktioniert der Vorgang bei deiner Hausgemachten Methode ?