ProgressBar selbst erstellen
-
~DoubleBuffered schrieb:
Ich glaube, die Eigenschaft DoubleBuffered gab es beim BCB3 noch nicht, oder?
Leider tatsächlich nichts gefunden, also nix DoubleBuffered.
~DoubleBuffered schrieb:
Ansonsten zeichne erst auf ein Bitmap und kopiere es dann auf den Panel (d.h. Doppelpufferung von Hand).
Klingt gut, werde ich versuchen. Dankeschön
Immernoch zum Thema ProgressBar: Ich wollte den Text etwas fülliger haben und dachte mir, ich setzt einfach die Schrift auf Fett. In der Hilfe steht, die Schrift mit der TCanvas zeichnet ist in ein TFont-Objekt gekapselt (ich hoffe ich drücke das richtig aus). TFont-Objekte haben eine Eigenschaft Style, die laut Hilfe zB. Fettschrift ermöglicht. Also habe ich ganz mutig Folgendes zu meinem Code hinzugefügt (pFont ist ein Zeiger auf das entsprechende Objekt):
pFont->Style= fsBold;
Ergebnis:
[C++Fehler] Fernbedienung.cpp(681): Cannot convert 'Graphics::TFontStyle' to 'System::SetGraphics::TFontStyle,0,3'.
Dann kam mir das mit dem "Set" komisch vor, da auch in der Hilfe sowas stand. Folglich hab ich ein wenig im Forum gelesen und bin auf Folgendes gekommen:
pFont->Style << fsBold;
Ergebnis: Der Compiler meckert nicht, aber die Schrift ist auch nicht fett...
(1) Ist es von der Schriftart abhängig, ob fett möglich ist?
(ich habe "Arial", "Courier" und "Comic Sans MS" getestet, keine wurde fett)
(2) Ist der Code mit dem ich die Fettschrift setzen will falsch? Wenn ja, wie gehts richtig?
-
Hallo
Wie es auch in der FAQ steht : Bei Set-Eigenschaften klappt der einfache <<-Operator nicht. Du must es nochmal zuweisen
pFont->Style = pFont->Style << fsBold;
bis bald
akari
-
Hey, Danke akari
Hab es auch grad hier gefunden, also sry für die voreilige Frage
Edit: Warum ist das so?
-
Hallo
Weil die Eigenschaften vortäuschen direkt mit echten Variablen zu agieren, aber in Wirklichkeit sind es nur Kopien. Der <<-Operator wird also nur auf eine temporäre Kopie angewendet, die sofort wieder verworfen wird wenn sie nicht noch extra einem L-Value zugewiesen wird, in dem Fall die Eigenschaft selber.
Weder Set noch der <<-Operator sind also dafür schuldig, hier triit derselbe Effekt auf
Label1->Caption += "Hallo";
bis bald
akari
-
Ich hasse "vortäuschen"
Danke für die Erklärung, leuchtet ein! Rechts die temporäre Kopie, die zu links zugewiesen und dann verworfen wird:Label1->Caption= Label1->Caption + "Hallo";
Sauber!
-
Und weiter gehts:
Ich hab mich jetzt mal ans Bitmap gemacht (Stichwort: DoubleBuffering). Einfach mal drauflos-erstellt / -gezeichnet und dann per SaveToFile abgespeichert. Es existiert sogar hinterher die Datei und der Compiler meckert auch nicht rum, aber: die Datei ist leer!
Nun ist die Frage: Was habe ich falsch gemacht? Hier mal der Code mit Erklärung, was ich mir da gedacht habe:void __fastcall TFormFernbedienung::BtnTestProgBarClick(TObject *Sender) { // die Laufvariable für den ProgressBar auf einen mittleren Wert gesetzt: usSub= 125; // ein Bitmap erstellt und Zeiger zum Zeichnen angelegt: Graphics::TBitmap *pBuffBmp1= new Graphics::TBitmap(); TCanvas *pBmp1Canvas= pBuffBmp1->Canvas; TFont *pBmp1Font= pBuffBmp1->Canvas->Font; // Schriftformatierung (schwarz & fett): pBmp1Font->Color= clBlack; pBmp1Font->Style= pBmp1Font->Style << fsBold; // weiß gefülltes Hintergrund-Rechteck gezeichnet (Breite: 294, Höhe: 19): TRect REck= Rect(0, 0, 294, 19); pBmp1Canvas->Brush->Color= clWhite; pBmp1Canvas->FillRect(REck); // Hintergrundtext gezeichnet: pBmp1Canvas->TextOut(REck.Left + 60, REck.Top + 1, "Fortschritt schreitet fort..."); // blau gefülltes ProgressBar-Rechteck gezeichnet (Breite: 169, Höhe: 19): TRect ProgBar2= Rect(REck.Left, REck.Top, REck.Right - usSub, REck.Bottom); pBmp1Canvas->Brush->Color= clNavy; pBmp1Canvas->FillRect(ProgBar2); // Text-Rechteck mit weißem Text auf blaues ProgressBar-Rechteck gezeichnet: TRect Bmp1TxtRect= Rect(0, 0, REck.Right - usSub, REck.Bottom - 1); pBmp1Canvas->Font->Color= clWhite; pBmp1Canvas->TextRect(Bmp1TxtRect, REck.Left + 60, REck.Top + 1, "Fortschritt schreitet fort..."); // fertiges Bild gespeichert: pBuffBmp1->SaveToFile("BufferBitmap.bmp"); // TBitmap-Objekt gelöscht: delete pBuffBmp1; } //---------------------------------------------------------------------------
-
Hallo
Du weist dem neu erstellen TBitmap nirgends eine Größe in Pixel zu, also hat es auch keine Pixel die du mit den Canvas-Methoden bearbeiten kannst.
bis bald
akari
-
Ohne Zeichenfläche, keine Zeichnung... Ich sollte mehr schlafen
Vielen Dank!Jetzt muss ich nur noch das Bitmap auf das Panel "kleben", aber das sollte zu schaffen sein!
-
Edit: Sry, Doppelpost...
-
Edit: Dreifachpost???
Was ist hier los???
Edit2: Dann nehm ich das hier gleich zum Posten. Ich hab das Ganze jetzt mal mit
Image1->Picture->LoadFromFile("BufferBitmap.bmp"); Application->ProcessMessages(); Sleep(100);
in einer Schleife (für die Laufvariable) getestet, ohne es auf das Panel zu tun... Es "blitzt" leider immernoch
War der ganze Bitmap-Kram jetzt umsonst?Edit3: Ergänzungen