ich hab nen komisches prob.
Ich progge momentan ne Dynamische Skin Engine auf Basis von TBitmapLayer´n.
Bisher funzte das ganze einwandfrei, Buttons, Progressbars, Backgrounds...
Ich benutze eine TForm, welche ich momentan noch die Layer auf ein TImage32 lege, welches das komplette Form ausfüllt.
Aktiviere noch einen API Transparenz befehl, so das Eine Farbe Masked wird.
Buttons, Progressbars, Backgrounds kommen mit einem Layer prima aus.
Aber Trackbars nicht, diese bestehen aus 2 Layern: Background und Bar
Am liebsten wäre mir wenn ichs nur mit einem Layer mache, aber dann bekomm ich es nicht hin die Bar mit AlphaMaske auf den Hintergrund zu zeichnen. Deswegen 2 Layer, Background mit seiner eigenen Transparenzmaske und Bar mit seiner eigener
Die Grafiken für die Trackbar sind in der TTrackbar struktur integriert, welche aber nicht abgeleitet von "TTrackbar" ist!
Gibt da 5 Grafiken:
Code:
TTrackbar =class(TObject)
private
...
X,Y,W,H,
BarW, BarH :Integer;
LayerBg,
LayerBar : TXLayer;
BitmapsBg :array[0..1]of TBitmap;
{
0 Alphamask Background
1 Background
}
BitmapsBar :array[0..1]of TBitmap;
{
0 Alphamask Bar
1 Bar
2 Bar gedrückt
}
Min,
Max,
Position :Int64;
...
public
procedure Render;
end;
Soweit so gut, im grunde sollte das ganz easy laufen und so sieht meine render routine für TTrackbar momentan aus.
Code:
// TTrackbar
procedure TTrackbar.Render;
var
ProgressPixel :Integer;
begin
LayerBg.Bitmap.DrawMode:= dmBlend;
LayerBg.Location:= FloatRect(X,Y,X+W,Y+H);
LayerBg.Bitmap.SetSize(W,H);
LayerBg.Bitmap.Assign(BitmapsBg[1]);
AddBitmap32Alpha(LayerBg.Bitmap, BitmapsBg[0]);
LayerBar.Bitmap.DrawMode:= dmBlend;
LayerBar.Bitmap.SetSize(BarW,BarH);
case Orientation of
tbo_left_to_right:
begin
ProgressPixel := XValuesToPixels(Min,Max, Position, W - BarW);
Als erstes wird der background layer mit seiner AlphaMaske gezeichnet.
X und Y sind die Koordinaten wo der Layer positioniert werden soll auf dem TImage32.
W und H sind die Width und Height des Backgrounds.
Danach Wird der Bar Layer gezeichnet:
- Grösse festgelegt SetSite()
- Pixel Position berechnet, wo die trackbar betreffend der position steht XValuesToPixels()
- und dann die Position auf dem TImage32 festgelegt.
Und genau hier liegt das problem, die Bar ist 12x10 Pixel gross.
Aber es wird irgendwie voll komisch gestretched und ich raffs nicht wieso.
siehe screenie:
und so sollte es eher aussehen, ohne die Grüne farbe natürlich
Es liegt an dem Location, da stimmt was nicht... sollte aber nach meiner meinung korrekt sein.
Left = Trackbar X Position + Fortschritt in Pixel
Top = Trackbar Y Position
Right = (Trackbar X Position + Fortschritt in Pixel) + Bar Width
Bottom = (Trackbar Y Position) + Bar height
So, dat wars wenn jemand eine idee hat wäre sehr dankbar.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hmmm. Na gut. Dann kann ich ja mein bereits getipptes wieder löschen. Aber ein Tipp am Rande. Für solche Probleme gibt es einen Debugger und der ist Gold wert. Wenn man ihn den benutzt.
Aber etwas anderes was mir nicht ganz sinnvoll erscheint. In der Methode Render. Tut es not, dass du dort deine Bilder erstellst? Zum Beispiel LayerBg. Du setzte eine Reihe von Eigenschaften und rufst diverse Methoden (Bitmap.Assign, AddBitmap32Alpha,...) auf. Ist es nicht sinnvoller diese zu Begin zu machen? Oder ändert sich die Bilder ständig. Denn wenn sie es nicht tun verschwendest du enorm viel Zeit.
So jetzt kommt noch TEdit, TListbox und TCheckbox dran
*Edit:
Betreffend geschwindigkeit hab ichs optimiert, das Backgrounds,sachen welche sich niciht ändern nur einmal gerender werden, am anfang.
hab da einfach ne variable erstellt FirstDraw : Boolean diese auf false gesetzt beim initialisieren.
und in der zeichen routine steht einfach ob FirstDraw = false is, wenn ja dann wird background usw, alles was sich nciht ändern gezeichet und Firstdraw auf true gesetzt.
Beim nächsten zeichenvorgang, bleibt das dann weg
aber das geht leider nur bei Trackbars Bei allen anderen ausser Backgrounds funzt diese methode nicht.
Naja, zeichen routine lass eh nur aufrufen wenn sich was ändert.
Zuletzt geändert von Finalspace am Mi Jun 30, 2004 09:17, insgesamt 2-mal geändert.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ah. Okay. jetzt sehe ich auch die kleinen Bilder. Die waren gerade irgendwie nicht da.
Jetzt glaube ich zu verstehen was sich ändert. Evtl wäre es an der Stelle ja sinnvoll die einzelnen Layer schon vorzuberechnen und je nach Status dann den einen oder anderen Layer zu verwenden. Allerdings weiß ich nicht ob das so einfach möglich ist und vor allem (viel wichtiger) wie oft das Render überhaupt aufgerufen wird. Wenn es nur bei Veränderungen aufgerufen wird, dann kann man sich das auch sparen. Allerdings wenn es in regelmäßigen Abständen aufgerufen wird sieht das schon wieder ein wenig anders aus. Aber das kannst du besser beurteilen als ich.
Hm,
Problem an den TBitmap32 Layern ist wirklich die Performance.
Sobald du auch nur ein bisschen an dem Layer änderst(Position,größe,drauf zeichnen) wird das gesammte TImage32 neu gezeichnet.
Deshalb wirklich verdammt gut aufpassen wie oft du irgendwas an den Layern änderst.
am besten zu Beginn der Render Routine immer TImage32.BeginUpdate und am Ende TImage32.EndUpdate aufrufen. Wird dazwischen irgendwas am Layer gemacht so wird das TImage32 nicht jedesmal neu gezeichnett.
Ah Billi-san haste dir ma Talisman Desktop angeguckt?
Ist echt nich schlecht, aber supported leider kein unicode deshalb unbrauchbar für mich Kannst dir da ja paar sachen abgucken oder so sind echt nette sachen drin
;) Ah Billi-san haste dir ma Talisman Desktop angeguckt? Ist echt nich schlecht, aber supported leider kein unicode deshalb unbrauchbar für mich Kannst dir da ja paar sachen abgucken oder so sind echt nette sachen drin
Ich bin ständig dabei mir auf diversen Art/Skin/Theme Seiten wie DeviantArt oder Wincustomize die ganzen Screenshots und Themes anzusehen Meine beste Quelle für neue Ideen war aber bis jetzt das XFCE4 Shell unter Linux
[Edit] Zur Zeit verzweifle ich recht stark am JPEG laden mit TBitmap32. Das ist bei mir einfach nur dermaßen abartig langsam. 10 Sekunden um ein 1024x768 bild zu laden Vielleicht mach ich irgendwas falsch, aber in der GR32 Mailingliste hab ich auch schon mehrfach was gelesen wo es Leuten nicht anders ging... Hat jemand ne Idee wie ich das irgendwie beschleunigen kann?
Also ich weiss ja nicht... ich würde JPEG standmässig mit TBitmap laden, oder sogar gleich eigenen JPEG loader nehmen.
Im bereich OpenGL gibts ja unmengen an loader, da einfach an der JPEG-Lade routine orientieren oder so.
Und dann direkt per Bitmap32.Pixels oder so zuweisen.
Ok, ich hab mein Problem gefunden...
Es ist nicht direkt das JPEG laden, (Jpeg laden dauert ~ 310 ms)
sondern das TBitmap32 auf das TPNGImage zuweisen damit ich es dann als .png Datei Speichern kann.
Problem ist das ich das TBitmap32 nicht direkt auf das TPNGImage zuweisen kann sondern hier noch über ein extra TBitmap gehen muß. Eine Idee wie ich das direkt machen kann?
Wenn das irgendwie direkt mit einem TJPegImage geht würde ich auch das nehmen (obwohl mir .png wesentlich lieber wäre).
TBitmap32 unterstützt aber soweit ich weiß kein direktes .jpg speichern, oder Irre ich mich da?
[Edit]
Wie es scheint ist es nur das als PNG Speichern was so verdammt langsam ist,
hab das ganze Zuweisen jetzt auf 90 ms hinbekommen...
Werde dann wohl doch .jpg nehmen müssen
[Edit2]
Als PNG Speichern dauert 4,6 sekunden,
als JPEG dauerts 1,3 sekunden.
Ich glaub ich steige auf .jpg um =)
Wieso nich gleich tga Im Bereich OpenGL ist es sowieso unschlagbar, weshalb nicht dann auch für anwendungen nehmen ?
Yeah ich habs geschafft zum ersten mal eine Japanische File anzeigen und abspielen zu lassen Jetzt muss ich nur noch ne gescheite verwaltung von Threads programmieren, damit ich OSD`s, Progressbars, Scrolllabels usw perfect machen kann
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.