Frage zu FAQ-Beitrag: Screenshot Methode 2



  • Hallo, WebFrizi hat im FAQ folgenden schönen Code gepostet wie man einen Screenshot machen kann von einem Fenster und dieses in einem TImage ausgibt.

    void __fastcall TForm1::MakeScreenShot(HWND handle, TImage* image)
    {
        TCanvas* canvas = new TCanvas();
        canvas->Handle = GetWindowDC(handle);
    
        TRect Dest   = Image1->ClientRect;
        TRect Source;
        GetWindowRect(handle, (LPRECT)&Source);
        Source = Rect(0, 0, Source.Right - Source.Left, Source.Bottom - Source.Top);
    
        image->Canvas->CopyRect(Dest, canvas, Source);
        delete canvas;
    }
    
    // Das muss dann nur so aufgerufen werden:
    
    MakeScreenShot([Fensterhandle], Image1);
    

    Nun wolle ich Fragen, was ich den für ein Fensterhandle übergeben muss wenn ich den kompletten Bildschirminhalt "screenshooten" will ? und wie ich den gemachten Screenshot dann direkt (ohne ausgabe in einem TImage) als *.jpg sichern kann?

    Vielen Dank,
    Gruß ranger81



  • Wie wäre es mit einem Blick in die Hilfe bzw. die MSDN? GetWindowDC(0) bzw. GetDC(0), wie im anderen Screenshot-Beitrag beschrieben. Ruhig immer wieder mal über den Tellerrand schauen! 😉

    Wegen des Abspeicherns: den FAQ-Beitrag zu JPEG und GIF kennst du? Da solltest du eigentlich alle nötigen Informationen entnehmen können. Statt des TImage benutzt du ggf. halt gleich ein TBitmap.



  • Moin. 🙂

    void SaveScreenShot(HWND hwnd, AnsiString FileName)
    {
       Graphics::TBitmap* bmp = new Graphics::TBitmap;
       TCanvas* canvas = new TCanvas;
    
       canvas->Handle = GetWindowDC(hwnd);   
       RECT rc;
       GetWindowRect(hwnd, &rc);
       bmp->Width = rc.right - rc.left;
       bmp->Height = rc.bottom - rc.top;
       bmp->Canvas->CopyRect(rc, canvas, rc);  
       delete canvas;
    
       bmp->SaveToFile(FileName);
       delete bmp;
    }
    

    Achja, und dann einfach

    SaveScreenShot(GetDesktopWindow(), "C:\\scr.bmp");
    

    [ Dieser Beitrag wurde am 04.02.2003 um 08:52 Uhr von WebFritzi editiert. ]



  • Danke euch ! 😉



  • Hallo,

    habe ein Shape um den gewünschten Fensterbereich zu markieren, den ich erst mal in ein kleines TImage einfügen möchte.
    Soweit funktioniert das ganze, doch leider ist der gewünschte Bereich im TImage nach unten versezt, es sieht so aus als ob die Programmüberschrift das ganze nach unten schiebt.

    Hab schon versucht den TOP Wert des Shapes zu verändern, doch leider ohne erfolg da im MouseDown Event des Shapes der Screenshot ausgeführt wird...

    Bin für jeden Tip dankbar...

    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    Shape1->Visible = true;
    Timer1->Enabled = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    TPoint pt;
    GetCursorPos(&pt);
    ::ScreenToClient(Form1->Handle, &pt);
    Shape1->Left = pt.x ;
    Shape1->Top = pt.y ;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Shape1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
    		  int X, int Y)
    {
    Timer1->Enabled = false;
    Shape1->Visible = false;
    
    TCanvas* Canvas = new TCanvas();
    Canvas->Handle = GetWindowDC(Form1->Handle);
       Image1->Picture->Bitmap->Width = 33;
       Image1->Picture->Bitmap->Height= 33;
    
       TRect Ziel = Image1->ClientRect;
       TRect Quelle = Rect(Shape1->Left,Shape1->Top ,Shape1->Left + 33,Shape1->Top +33);
    
       Image1->Picture->Bitmap->Canvas->CopyRect(Ziel, Canvas, Quelle);
    
       delete Canvas;
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    Form1->WindowState = wsMaximized;
    }
    //---------------------------------------------------------------------------
    

    Grüsse und Danke 😋

    Hoffe es ist ok wenn ich dafür kein neues Thema eröffnet habe...

    Nach paar Std. ist das wohl die lösung...

    Canvas->Handle = GetDC(Form1->Handle);
    

    Wünsche was 🙄


Anmelden zum Antworten