HDC in PaintBox kopieren



  • Hi, wie kann ich den Inhalt von einem HDC auf eine PaintBox zeichnen? Ich kriegs nicht hin...



  • http://msdn.microsoft.com/en-us/library/windows/desktop/dd183370(v=vs.85).aspx

    BitBlt nennt sich die Funktion. Dort gibst du die zwei HDCs und ein paar Abmessungen an.

    Das Handle der Paintbox ist meines wissens PaintBox->Canvas->Handle ( das wäre dann dein Zielhandle.

    für Transparentes "kopieren" gibts dann auch noch die Funktion "AlphaBlend" die im Prinzip fast genauso funktioniert.



  • danke! Ich würde jetzt gerne zuerst in einen temporären HDC zeichnen und diesen dann in die PaintBox kopieren,
    aber irgendwas funktioniert nicht. Auf dem Bildschirm erscheint einfach nichts.

    void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
    {
        HDC memdc;
        TCanvas* canvas = new TCanvas();
        canvas->Handle = memdc;
    
        //... Zeichenvorgaenge mit canvas
    
        BitBlt(PaintBox1->Canvas->Handle, 0, 0, PaintBox1->Width, PaintBox1->Height, canvas->Handle, 0, 0, SRCCOPY);
        ReleaseDC(0,memdc);
        delete canvas;
    }
    


  • zumindest mit den WinApi Funktionen geht es ungefähr so:
    Du nimmst den Zielhandle HZiel.
    Du erstellt zu diesem HZiel einen kompatiblen MemoryDC: CreateCompatibleDC
    Außerdem erstellst du zu diesem HZiel eine kompatible Bitmap: CreateCompatibleBitmap
    Du führst Attach aus, sodass die Bitmap zu dem MemoryDC hinzugefügt wird.
    Du zeichnest nun in den MemoryDC.
    Wenn du schließlich fertiggezeichnet hast, führst du BitBlt aus, welches dir die Pixel in dein HZiel kopiert.

    Danach nicht vergessen, Bitmap und MemDC wieder freizugeben.

    Wie das ganze mit VCL geht weiß ich nicht, aber ich denke ein Problem könnte sein, dass dein MemDC nicht initialisiert ist - eben mit CreateCompatibleDC.


Anmelden zum Antworten