Har gjort ett program för att hantera skins (fick idén från CJs projekt), skulle vilja ha lite synpunkter på det. om du kör med layered windows så kan du få alphablendad antialias på kanterna istället för den taggiga ramen som är nu.. Det där lät intressant! Det där med att hårdkoda sökvägar ! Slarvig programmering Kolla i XML filen, där är det hårdkodat, fast det tog ett tag innan jag kom på att glutta i den. layered windows kan användas i alla språk så länge du kan anropa windowsapier från det. Va f....? hmm det fanns en skitbra artikel om det på codeproject.com (c# artikel) Jag är urusel på grafik och kan inte råda dig om sådan programmering. Ja, jag vet, har tänkt på det, och det löser man lättast med det som roggan föreslår, och det är just därför det är så intressant (och dessutom blir det snyggare och enklare att programmera...). Ett annat förslag på att fixa alphablending är att använda sig av DirectX, stöd för det har jag för mig finns från och med Version 3.0 (Där även direct draw stödjs i NT 4). Att använda GDI't kan nämligen bli lite slött om du har otur... Ja, DirectX är ju också ett rimligt alternativ... men det kan jag inte, så det får jag vänta med i så fall... =) Någon kanske redan klagat på detta (orkar inte läsa tråden) Hej Hmm, det verkar var lite mer avancerat än jag trodde. Sökvägarna är inte hårdkodade i exe-filen utan i xml filen så det är bara att ändra... <b> >Jag hittade en artikel på codeproject, i C++, men det ska väl gå bra. för att sätta ws_ex_blabla så kan du använda setwindowlong apiet om jag inte minns helt fel.. (på ett redan befintligt fönster dvs) Lite tankar angående XML. Först: GetWindowLong api't fär att få tag på redan existerande styles/exstyles... Sedan kör man med följande: >Först: GetWindowLong api't fär att få tag på redan existerande styles/exstyles... ja... men jag skrev bara att man skulle använda de två apierna samt hur man modifierade stylsen... aldrig hur man gör i praktiken... :) >Skall det vara sökbart bör det vara attribut. Gör det mycket lättare att skriva Xpath sökningar. Får tacka för det svaret!Kommentarer på skin-program
För det första: Jag använder 3 olika sätt att lagra information från XML-filerna (attribut, innehåll i noder, undernoder) - någon som har ett bra tips på vad som bör vara vad?
För det andra: Vilka möjligheter bör man kunna ha i skin?
Just nu är det bakgrundsbilden, formen på formen ( hmm... =) får säga på engelska: "The Form's Shape"), bakgrundsfärg, storlek.
Det jag kommer på själv är:
- clipping baserad på angivna former (rektanglar osv.)
- bilder för kontroller
- position för kontroller
- muspekare
PS.
Bara så ni förstår: programmet har ingen egentlig funktion - i alla fall inte än. Och man kan inte byta skin enkelt heller.
PS2. Om ni har kommentarer på bakgrundsbilden vill jag ha det också - blir den otydlig, passar den inte?
PS3. Vet inte varför jag lägger det här i skrivklåda. =)
EDIT: länken!
http://www.pellesoft.se/login/upload/t_view4.asp?tid=730Sv: Kommentarer på skin-program
//RogerSv: Kommentarer på skin-program
Letade lite efter just det, men hittade bara grejer för .NET. Funkar det här i VB6?
Innebär det att min clippingmetod är meningslös?
I så fall låter jag den vara ett "lågprestandaalternativ"... =)Sv: Kommentarer på skin-program
Programmet stupar på dessa rader Jag har inte C:\niklas\VB\...... på min dator
<code>
frmMain.Picture = LoadPicture(Image.Text)
Set Pic.Picture = LoadPicture(Clipping.Text)
</code>
Hittar ingen Image.Text heller.Sv: Kommentarer på skin-program
//Anna-KarinSv: Kommentarer på skin-program
det finns två typer:
1) colorkey, man kan sätta att färgen ff00ff ska vara transparent på ett fönster (obs bara toplevel fönster , inte kontroller) , då får man samma effekt som du har nu , fast massa massa snabbare
2) alphamask , man kan sätta att en viss bitmap ska användas som alphamask , och då används bitmappens alpha pixlar för att beskriva hur genomskinlig en pixel på fönstret ska vara..
//RogerSv: Kommentarer på skin-program
Jag hade ju fixat det med absoluta referenser!
Det enklaste sättet att fixa det är att bara ta bort xml-filen, och köra programmet igen. Då genereras en korrekt xml-fil, och nästa gång man kör programmet så är det rätt. (Och som sagt - det är bara ett test - inte ens en alpha-version)
Vad tycker ni om den här metoden?
Varje skin ligger i en separat mapp, i en undermapp till programmappen.
Ett default-skin skulle då ligga i "...\SkinTest\Skins\Default"
På så sätt så behöver man inte absoluta referenser i xml-filen, utan kan göra rätt ifrån programmet.
<b> >layered windows kan användas i alla språk så länge du kan anropa windowsapier från det.
det finns två typer:
1) colorkey, man kan sätta att färgen ff00ff ska vara transparent på ett fönster (obs bara toplevel fönster , inte kontroller) , då får man samma effekt som du har nu , fast massa massa snabbare
2) alphamask , man kan sätta att en viss bitmap ska användas som alphamask , och då används bitmappens alpha pixlar för att beskriva hur genomskinlig en pixel på fönstret ska vara..</b>
Jepp, tackar... hade hittat lite, men det enda jag har hittat hjälp om är det första, och det var precis det jag tänkte. Jag sparar nog den nuvarande metoden eftersom den bara funkar i Windows 2000 och uppåt. Den andra metoden har jag faktiskt nästan inte hittat nånting om, förutom "UpdateLayeredWindow", men hur funkar det?
Ska man tillhandahålla en separat mask-fil (eller en DC med en mask i), eller ska det vara "inbakat" i filen?
Det är väl nästan bara png-formatet som har en 8-bitars alphakanal?
Du har ingen länk till nån tutorial eller liknande?Sv: Kommentarer på skin-program
men den verkar inte finnas kvar längre..
där gjorde de precis som du sa , de skapade x st formulär med en png fil som mask.
ska kolla igen om den ligger under någon skum kategori.
//RogerSv: Kommentarer på skin-program
Men jag kan berätta hur jag fungerar som användare.
För mig är det viktigt att saker går fort, tar det mer än 1 högst 2 sekunder så blir jag superstressad och upplever applikationen som trög.
Jag vet många med mig som fungerar likadant.
Ditt enkla skin tog 3-4 sekunder på min 750mhz att öppna.
Så mitt tips till dig är att kolla in vad som går att optimera hastighetsmässigt.Sv: Kommentarer på skin-program
Sen är inte skinnet så enkelt som det kanske verkar, jag funderade på om man kunde komma på något bra sätt att få till stora former direkt, men jag har inte kommit på något smart...
(Kan ju förklara varför det blir som det blir: jag måste loopa igenom alla pixlar i en bmp-fil för att se vilka som är svarta och inte, sen måste jag skapa en "region" så fort jag hittar en rad med genomskinliga pixlar. Tänkte lägga en splashscreen för att få folk att lugna sig...)
Att skapa png-filen bör nog inte vara något problem, men jag är osäker på hur man ska skicka in den och använda den. Får försöka leta efter något i stil med "anti-alias api layered window", så borde jag väl kunna hitta något...
(och en annan sak som är bra är ju att jag kan fixa en slimmad skugga också... =) )
Tack för alla kommentarer och all hjälp hittills!
Efterlyser kommentarer på XML-metoden; vilka metoder är lämpliga när?Sv: Kommentarer på skin-program
Ytterliggare ett sätt är att skriva en egen rutin för att hantera alphablending, och en sådtan borde gå att få i realtid på 300+...Sv: Kommentarer på skin-program
En egen rutin är förmodligen svår att skriva. Läste en ganska bra förklaring: Även om man lyckas göra en grymt snabb blendning (svårt om man ska ha 8-bitars), så kommer man inte kunna använda den tillfredsställande i en multitaskande miljö. Enda metoden man skulle kunna använda är ju att kolla på alla pixlar bakom formen för att räkna ut nya pixelvärdet. Men eftersom de bakomliggande fönstrena kan ritas om precis när som helst så kan programmet inte veta när det ska kolla.
Skulle krävas någon hook av varje paint-event, och frågan är om det är en rimlig metod i sammanhanget... Sv: Kommentarer på skin-program
tänkte testa programmet, när jag dubbelklickar på EXE-filen så får jag ett meddelande om att bilden ej kan hittas, pga dålig kodning :p *rycka och slita i örat* FYY!! *fnissar*
att "hårdkoda" sökvägar är icke bra, "delete" direktSv: Kommentarer på skin-program
Jag hittade en artikel på codeproject, i C++, men det ska väl gå bra.
http://www.codeproject.com/gdi/pxalphablend.asp
Väldigt intressant. Varför har jag inte hört om det förut. Har gjort en del med regions och clipping, men det här är ju 100ggr enklare.
/JörgenSv: Kommentarer på skin-program
För det första: Hur sätter jag WS_EX_LAYERED på ett fönster i t.ex. VB el. C#. Det borde väl finnas nåt api som fixar detta.
Annars är det väl bara att ladda hem källkoden och skumläsa lite.
/JörgenSv: Kommentarer på skin-program
Dock kan jag inte förstå varför du hade hela sökvägen till bilderna där? Fungerar ju lika bra med bara filnamnet efter som allt ligger i samma katalog.Sv: Kommentarer på skin-program
http://www.codeproject.com/gdi/pxalphablend.asp </b>
Tackar för det, nu ska här kodas! =)
<b>>Väldigt intressant. Varför har jag inte hört om det förut. Har gjort en del med regions och clipping, men det här är ju 100ggr enklare.</b>
Minst sagt!
Enklare, snabbare och snyggare. Enda problemet är ju för folk med windows <2000. Då får man behålla den gamla koden.
<b>>Hmm, det verkar var lite mer avancerat än jag trodde.
För det första: Hur sätter jag WS_EX_LAYERED på ett fönster i t.ex. VB el. C#. Det borde väl finnas nåt api som fixar detta.
Annars är det väl bara att ladda hem källkoden och skumläsa lite.</b>
Jepp, det har jag sett någonstans, men man kan göra på ett annat sätt i VB. (man skickar ett argument till en annan API-funktion). När programmet är utvecklat kan du ju kolla där t.ex.
<b> >Sökvägarna är inte hårdkodade i exe-filen utan i xml filen så det är bara att ändra...
</b>
Precis, och det genereras nya (korrekta) om xml-filen saknas.
<b> >Dock kan jag inte förstå varför du hade hela sökvägen till bilderna där? Fungerar ju lika bra med bara filnamnet efter som allt ligger i samma katalog.</b>
Jo, jag hade lite olika funderingar på vad som var bäst att göra, men eftersom det mest var ett försök, så hade jag inte riktigt klart för mig hur man bör lägga upp det. Ska varje skin ha en egen mapp, osv?
Det enklaste just då var att ha hela sökvägen, så att LoadPicture-delen kunde göras enkel.
Och man får ju ta i beräkning att jag knappt kunde något om varken XML eller Regions innan jag började. Och jag har inte lagt mer än totalt två-tre timmar på det (tentor...=( ).
Och än igen: tack för all konstruktiv kritik hittills!
Ingen som har kommentarer på vilken XML-metod som är lämplig?
(kanske bättre ställa en generell fråga i XML-forumet...?)Sv: Kommentarer på skin-program
//RogerSv: Kommentarer på skin-program
Skall det vara sökbart bör det vara attribut. Gör det mycket lättare att skriva Xpath sökningar.
Skall det vara varierande information under en nod kan det vara lämpligt att använda element. Är enkelt att hämta alla noder under en nod och loopa igenom dem.Sv: Kommentarer på skin-program
För att lägga till en style:
st = st or STYLEN
För att ta bort en style:
st = st or STYLEN
st = st XOR stylen
sedan skickar man in det igen med SetWindowLongSv: Kommentarer på skin-program
>Sedan kör man med följande:
>För att lägga till en style:
>st = st or STYLEN
>För att ta bort en style:
>st = st or STYLEN
>st = st XOR stylen
>sedan skickar man in det igen med SetWindowLong
Ok, men då måste man ha nånting som säger vilken long man ska geta och seta. typ som GWL_WNDSTYLE.
/JörgenSv: Kommentarer på skin-program
Sv: Kommentarer på skin-program
Attribut ska helst inte innehålla för mycket data annars blir det inte så överskådligt.
>Jo, jag hade lite olika funderingar på vad som var bäst att göra, men eftersom det mest var ett försök, så hade jag inte riktigt klart för mig hur man bör lägga upp det. Ska varje skin ha en egen mapp, osv? Det enklaste just då var att ha hela sökvägen, så att LoadPicture-delen kunde göras enkel.
Om allt ligger i undermappar till programmets katalog så tror jag att det fungerar alldeles utmärkt att bara använda relativa sökvägar.
>Jag använder 3 olika sätt att lagra information från XML-filerna (attribut, innehåll i noder, undernoder) - någon som har ett bra tips på vad som bör vara vad?
Attribut - lite information samt om det ska vara sökbart.
Innehåll i noder samt undernoder - ska du ha en lista med t.ex. sökvägar under en eller flera olika noder så ska det vara undernoder med attribut eller innehåll i noden, om du ska ha det som attribut eller innehåll beror på, som jag ser det, på hur mycket information du ska ha.
ungefär så här tycker jag din configfil skulle ha sett ut ;-)
<skin name="Default">
<background color="&H8000000F&" image="Background.bmp" />
<size width="500" height="300" />
<clipping src="Mask.bmp" />
</skin>
alternativt så här:
<skin name="Default">
<background color="&H8000000F&" image="Background.bmp" mask="Mask.bmp" />
<size width="500" height="300" />
</skin>Sv: Kommentarer på skin-program
<b>>Om allt ligger i undermappar till programmets katalog så tror jag att det fungerar alldeles utmärkt att bara använda relativa sökvägar.</b>
Ja, men om man skulle kunna ha skins i andra mappar kan det vara dumt. (kanske lite väl överambitiöst att tänka så...)
Men, men, det kan jag köpa, och det är ju knappast ett stort problem.
Angående XML-filen kan jag beskriva ungefär hur jag tänker mig det:
1. Bakgrunden ska antingen kunna ha en bild eller ha en bakgrundsfärg. Anges båda så kommer bilden visas, men om något fel uppstår kan man ta bakgrundsfärgen istället. Ditt förslag med attribut verkar rimligt där.
2. Storleken ska kunna anges om clippingen av någon anledning inte fungerar. Att kunna lägga in den i clippingen kanske är logiskt?
Man skulle kunna kalla det Shape, och ha storleken som attribut.
3. Clippingen kan vara av två typer: antingen en bild som man baserar det ifrån (med eller utan alpha-blending), eller ett antal enkla former (Typ: en rektangel och en cirkel).
Därför tänkte jag att man kunde tänka sig en lista med såna clip-shapes, typ
<Clipping Mask="Mask.bmp">
<!-- Om mask-filen inte finns eller av annan anledning inte används: -->
<Rectangle X1="0" Y1="0" X2="100" Y2="200"/>
<Circle X1="100" Y1="0" X2="300" Y2="200"/>
</Clipping>
Eller
<Clipping Mask="Mask.bmp">
<!-- Om mask-filen inte finns eller av annan anledning inte används: -->
<Shape Type="rect" X1="0" Y1="0" X2="100" Y2="200"/>
<Shape Type="circ" X1="100" Y1="0" X2="300" Y2="200"/>
</Clipping>
(Och eventuellt i kombination med det jag tänkte på i 2.)
Är det rimligt?