[Frage]Bild aus GUI Objekt erzeugen



  • hast du das mal gegooglet und gesehen was da raus kommt? ich schreib doch keinen beitrag befor ich nicht gegooglet habe 🙄



  • Und wie sieht es mit der Suche hier im Forum bzw. der zugehörigen FAQ aus?



  • blub1991 schrieb:

    hast du das mal gegooglet und gesehen was da raus kommt? ich schreib doch keinen beitrag befor ich nicht gegooglet habe 🙄

    Jau, habe ich. Unter den ersten fünf Treffern sind mindestens zwei funktionierende Lösungen. Ich schreib doch keinen Beitrag, bevor ich ich den nicht überprüft habe 🙄



  • aus der forum suche kommt auch nichts brauchbares raus, wofür haltet ihr mich eigentlich?



  • Hallo

    Zumindestens hast du nicht in die FAQ hier im Builder-Forum geschaut, denn dort gibt es Beiträge zum Thema Screenshot.

    bis bald
    akari



  • Alter Schwede.... hier das kombinierte Ergebnis aus Let me google that for you, search the results and copy/paste the solution:

    void SaveScreen(HWND pScreen, char Path[])
    {
    	int     Width  = /*GetSystemMetrics(SM_CXSCREEN)*/1280;
    	int     Height = /*GetSystemMetrics(SM_CYSCREEN)*/1024;
    
        HDC hdcScreen;
        HBITMAP hbmScreen;
    
        //---------------Bitmap Informationen
        BITMAPINFO infobmp;
        infobmp.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        infobmp.bmiHeader.biWidth = Width;
        infobmp.bmiHeader.biHeight = Height;
        infobmp.bmiHeader.biPlanes = 1;
        infobmp.bmiHeader.biBitCount = 24;
        infobmp.bmiHeader.biCompression = 0;
        infobmp.bmiHeader.biSizeImage = 0;
        infobmp.bmiHeader.biXPelsPerMeter = 0;
        infobmp.bmiHeader.biYPelsPerMeter = 0;
        infobmp.bmiHeader.biClrUsed = 0;
        infobmp.bmiHeader.biClrImportant = 0;
    
        int* bitmap = new int[Width*Height*3];
    
        BITMAPFILEHEADER bfheader;
    
        bfheader.bfType = 19778;
        bfheader.bfSize = sizeof(BITMAPFILEHEADER) + Width*Height*3 + sizeof(BITMAPINFOHEADER);
        bfheader.bfReserved1 = 0;
        bfheader.bfReserved2 = 0;
        bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
        //Bitmap -----------------------      Informationen
    
        hdcScreen = GetWindowDC(pScreen);
        hbmScreen = CreateCompatibleBitmap(hdcScreen, Width, Height);
    
        // temporärer DC
        HDC hdcTemp = CreateCompatibleDC(hdcScreen);
    
        // Bitmap reinselektieren
        HBITMAP hbmOld = (HBITMAP)SelectObject(hdcTemp, hbmScreen);
    
        // Inhalt von Desktop übertragen
        BitBlt(hdcTemp, 0, 0, Width, Height, hdcScreen, 0, 0, SRCCOPY);
    
        int iResult = GetDIBits(hdcTemp, hbmScreen, 0, Height, bitmap, &infobmp, DIB_RGB_COLORS);
    
        // aufräumen
        SelectObject(hdcTemp, hbmOld);
        DeleteObject(hbmScreen);
        DeleteDC(hdcTemp);
    
        HANDLE hfile = CreateFile(Path, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
    
        //Datei Schreiben
        DWORD word;
        WriteFile(hfile, &bfheader, 14, &word, NULL);
        WriteFile(hfile, &infobmp, 40,& word, NULL);
        WriteFile(hfile, bitmap, Width*Height*3, &word,NULL);
    
        ReleaseDC(pScreen, hdcScreen);
        CloseHandle(hfile);
        delete[] bitmap;
    }
    

    Hab´s weder kompiliert noch ausprobiert, aber irgendwas soll ja für dich auch noch übrigbleiben... z.B. die Portierung von C nach C++.



  • Um die FAQ's hier im Forum nicht zu kurz kommen zu lassen auch der Link

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39305.html

    und zwischen den Gruppen
    Schnittstellen
    Scrollbalken

    kommt
    Screenshot
    Version 1
    Version 2

    Bitte die Seite
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39305.html
    ansurfen um auf Version 1 und Version 2 klicken zu können 😉



  • Hallo,

    hier noch was VCL-Nahes :

    HWND hWnd = GetDesktopWindow();
       if (!hWnd) {
          return;
       }
       RECT rect;
       GetWindowRect(hWnd,	&rect);
    
       Graphics::TBitmap* bmp = new Graphics::TBitmap;
       bmp->Height = rect.bottom;
       bmp->Width  = rect.right;
       BitBlt(bmp->Canvas->Handle, 0 , 0 , bmp->Width, bmp->Height, GetDC(hWnd), 0, 0, SRCCOPY);
       bmp->SaveToFile("C:/test.bmp");
    
       delete bmp;
    

    Mit Kenntnis des Fenster-Handle (s.zB. FindWindow) lässt sich so jedes sichtbare Fenster screenshoten.

    MfG
    kpeter



  • blub1991 schrieb:

    [...] wofür haltet ihr mich eigentlich?

    Das willst du nicht wirklich beantwortet haben, oder? 😉



  • Lies dir mal das Form->PaintTo mal in der Hilfe durch.

    Damit kann mal von einen Steuerelement ein Bild machen und an einen TCanvas schicken. Und mit Form->PaintTo dann eben von der ganzen Form....


Anmelden zum Antworten