Frage zur PaintBox



  • Soweit ich sehe, ist's das Problem!

    Du malst praktisch in die Form und die merkt sich nicht was? Nach Groessenaenderung / Ueberdeckung des Fensters weis die Form nicht was darzustellen ist!

    Also:

    Spieldarstellung in (unsichtbare) Bitmap, Zum Aktualisieren Paint() rufen - da d'rin mit Draw- Methode Inhalt von Bitmap in PaintBox (Form) 'kopieren.

    WINDOWS mueste bei Bedarf Paint auch rufen (z.B.: nach Ueberdeckung) ?



  • @ZzetT: Der Altenburger versteht wohl nicht so ganz, dass du noch ein Noob bist. Kein Problem, dafür gibt's ja den Doc. Schau mal in der Hilfe nach TBitmap. Du wirst sehen, dass diese Klasse auch eine Eigenschaft Canvas (wie die PaintBox) hat. Darin kannst du dann ebenso malen. Wenn du also an deinem Bild etwas ändern willst, dann male dies zuerst in ein Bitmap und male dies dann wiederum in das Image (du brauchst keine PaintBox). Das hat den Vorteil, dass es weniger flackert. Ein Bitmap erstellst du (z.B.) so:

    Graphics::TBitmap* bmp = new Graphics::TBitmap;
    bmp->Width = 200;
    bmp->Height = 200;
    

    Malen tust du dann z.B. so:

    bmp->Canvas->LineTo(100, 100);
    

    Und vergiss bitte nicht, das Bitmap am Ende (wenn es nicht mehr gebraucht wird) wieder zu löschen:

    delete bmp;
    


  • @DOC:

    So in etwa war mein 2. Tip 😃

    Wie kommt DEIN gemaltes Bitmap auf den Schirm! 🕶
    (Haste da nicht was vergessen? 😕

    PS: So bringt man NOOB's auch durcheinander!

    [ Dieser Beitrag wurde am 03.03.2003 um 07:37 Uhr von DerAltenburger editiert. ]



  • Ach ja, ich mach es am besten ganz anders. Da ich jetzt keinen neuen Thread aufmachen möchte(es sei denn es ist erwünscht), würde ich gerne wissen, ob ich überprüfen kann ob das Fenster überdeckt, minimiert oder nicht aktiv ist. Das Event OnDeactive habe ich leider erfolglos ausprobiert.

    Übrigens mit 2 Spielern, ist das Spiel gar net mal so schlecht als zeitvertreib 🙂



  • Original erstellt von DerAltenburger:
    @DOC:
    Wie kommt DEIN gemaltes Bitmap auf den Schirm?

    Das hat der Doc doch gesagt:

    Wenn du also an deinem Bild etwas ändern willst, dann male dies zuerst in ein Bitmap und male dies dann wiederum in das Image (du brauchst keine PaintBox).

    Ich denke, das ist klar ausgedrückt! Außerdem finde ich den Beitrag des Docs doch um einiges pädagogisch wertvoller als deinen. Er ist ja nicht umsonst Psychologe.

    @ZzetT:

    Ach ja, ich mach es am besten ganz anders

    Nein, du wirst es genauso machen wie der Doc es dir gesagt hat!



  • Ja, ja und im Code hat er's weggelassen (sehr pädagigisch!) 😕



  • Stimmt.

    @ZzetT: Du kannst ein Bitmap in ein Image malen per TImage::Canvas::Draw() oder TImage::Canvas::CopyRect(). Schau dir das mal in der Hilfe an.



  • Ok, ich hab das jetzt so hinbekommen wie ihr es mir gesagt habt. Aber im Endeffekt hat es mich nun auch nicht weitergebracht, da das Bild immer noch sehr stark flackert. (Timerintervall liegt bei 10). Weil dann hätte ich ja auch gleich in eine Image Komponente malen können ohne diese zwischenspeicherung in ein unsichtbares Bitmap!

    Das jetzt nur mal als Beispiel da das Programm nach dem ähnlichem Prinzip funktioniert:

    Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
    
    ...
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    x++;
    pBitmap->Canvas->Pixels[x] [5]=clRed;;
    Image1->Canvas->Draw(0,0,pBitmap);
    }
    

    Und Änderungen geschehen leider bei jedem Timeraufruf!!!

    [ Dieser Beitrag wurde am 03.03.2003 um 17:09 Uhr von ZzetT editiert. ]



  • schreib deine Anweisung in das onPaint Ereignis deiner Form dann bleibt das Bild auch nach minimieren erhalten



  • @ZzetT: Du solltest natürlich auch nur den Teil des Bitmaps in das Image malen, das neu ist. Dann flackert's auch nicht mehr so dolle. SChau dir dazu mal TCanvas::CopyRect() an.
    Außerdem ist TCanvas::Pixels schlecht, denn es ist sehr langsam. Es ist ratsam, bei größeren Zeichenoperationen Graphics::TBitmap::ScanLine zu benutzen. Aber da du ja nur kleine Zeichenoperationen durchführst, kannst du ruhig Pixels[][] benutzen.


Anmelden zum Antworten