JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=547da240105e4fe18633cfca157f6d1aMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Screenshot während der Laufzeit...

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
homer Jay
Mini JLI'ler



Anmeldedatum: 13.01.2005
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 25.02.2005, 11:21    Titel: Screenshot während der Laufzeit... Antworten mit Zitat

dere alle miteinander

Ich habe aus folgendem Beitrag ( http://www.jliforum.de/board/viewtopic.php?t=3306 ) den Code verwendet um ein Sreenshot zu machen, funktioniert auch toll.

Wenn ich nun diesen code in eine funktion packe, und während der laufzeit ein Screenshot aufnehmen und dieses dann gleich im programm verwenden möchte (in einer oberfläche bilten oder so), wo muss da der funktionsaufruf sein??

Ich nehme an in der WINAPI WinMain vor der erzeugung des Fenster-Handles (hWnd = CreateMainWindow(hInstance)Wink oder?

Ich arbeite mit SDK directX 8.x und VC 6.0 und XP!

Hier der code der WinMain
CPP:
int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                   HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                   LPSTR lpCmdLine,          // Kommandozeile
                   int nCmdShow)             // Art wie das Fenster angezeigt werden soll
{
   makeScreenshot();
   
    // Fenster erzeugen und Handle speichern
    hWnd = CreateMainWindow(hInstance);

    // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
    if(0 == hWnd)
    {
        return Error("Fehler beim Erzeugen des Fenster");
    }

    if(!InitDirectDraw())
    {
        return FALSE;
    }       

   // Struktur, in der Informationen zur Nachricht gespeichert werden
    MSG msg;

   
    // Diese Schleife läuft bis WM_QUIT gesendet wird
    while(GetMessage(&msg,NULL,0,0))
   {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // Rückgabewert an Windows
    return 0;
}


und makeScreenshot()
CPP:
void makeScreenshot()
{
            //********************SREENSHOT**************************
         HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
         HDC hdcCompatible = CreateCompatibleDC(hdcScreen);
 
         int iWidth  = GetDeviceCaps(hdcScreen, HORZRES);
         int iHeight = GetDeviceCaps(hdcScreen, VERTRES);

         HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen,
                                            iWidth,
                                            iHeight);
 
         HBITMAP hbmOldBitmap = (HBITMAP)SelectObject(hdcCompatible, hbmScreen);

         BitBlt(hdcCompatible,
                      0,0,
                    iWidth,
                   iHeight,
                  hdcScreen,
                      0,0,
                  SRCCOPY);

          /* Nun Speicher für einen Puffer reservieren, der die Daten
         der 32-Bit-Bitmap temporär aufnimmt. */

         DWORD dwImageSize = (DWORD)(iWidth * iHeight * 32 / 8 );
         //void *pImage = HeapAlloc(GetProcessHeap(), 0, dwImageSize); // oder so
         void *pImage = new BYTE[dwImageSize];

         /* Als Nächstes Daten der 32-Bit-Bitmap in den Puffer laden. */
         BITMAPINFO bmi =
         {   
         sizeof(BITMAPINFOHEADER),
                iWidth,
               iHeight,
                    1,
                   32,
                BI_RGB,
                    0,
                    0,
                    0,
                    0,
                    0
                     };

         GetDIBits(hdcCompatible, hbmScreen, 0, (UINT)iHeight, pImage, &bmi, DIB_RGB_COLORS);

         /* Neue Datei erstellen. */
         HANDLE hFile = CreateFile(
         "K:\\screenshot.bmp",
         GENERIC_WRITE,
         0,
         NULL,
         CREATE_ALWAYS,
         FILE_ATTRIBUTE_NORMAL,
         NULL);

         if(hFile == INVALID_HANDLE_VALUE)
         {
         /*return */MessageBox(NULL, "CreateFile failed.", "Failure", MB_ICONERROR);
         }

         /* Jetzt Header für Bitmap präparieren. */
         BITMAPFILEHEADER bmpfh =
         {
         'MB',
         sizeof(BITMAPFILEHEADER),
         0,
         0,
         sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
         };

         /* Nun Header für Bitmap in Datei schreiben. */
         DWORD dwWritten;

         if(!WriteFile(hFile, &bmpfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL) || dwWritten != sizeof(BITMAPFILEHEADER))
         {
            /*return*/ MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
         }

         if(!WriteFile(hFile, &bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL) || dwWritten != sizeof(BITMAPINFOHEADER))
         {
            /*return*/ MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
         }

         /* Anschließend Image in Datei schreiben. */
         if(!WriteFile(hFile, pImage, dwImageSize, &dwWritten, NULL) || dwWritten != dwImageSize)
         {
            /*return*/ MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
         }

         SelectObject(hdcCompatible, hbmOldBitmap);
         delete pImage;
         DeleteObject(hbmScreen);
         DeleteDC(hdcScreen);
         DeleteDC(hdcCompatible);
         //*****************************SCREENSHOT-ENDE*************************

}


danke im voraus
homer Jay
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 25.02.2005, 11:57    Titel: Antworten mit Zitat

du meinst vor der Erzeugung des Fensters um ein Bild nur vom Desktop OHNE dein Programm? Naja, vor ShowWindow sollte es reichen, denke ich.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
homer Jay
Mini JLI'ler



Anmeldedatum: 13.01.2005
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 25.02.2005, 16:40    Titel: Antworten mit Zitat

Nunja wie soll ich sagen ich habe niergends in meinem code den aufruf bzw. funktion ShowWindow (oder bin ich zu blöd es zu finden)??

ich habe schon wie oben in meinem codeausschnitt versucht den aufruf meiner funktion in der winMain funktion vor der erzeugung des handles ganz am anfang zu machen aber dann wird zwar der screenshot gemacht aber das programm beendet sofort?

Wenn ich aber nun den funktinonsaufruf am anfang weglasse kann ich auf den Sreenshot zugreifen und ihn verwenden? Question ? Question
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 25.02.2005, 18:36    Titel: Antworten mit Zitat

ShowWindow sollte sich in der CreateMainWindow Funktion befinden.
Und wenn das Programm sofort beendet, wenn du das Screenshot machst, würde ich auf einen Fehler tippen, der das Prog zum crashen bringt.

[Edit]hm, erklär nochmla ganz genau, was das Prog machen soll, ich glabue ich habe dat net gerafft, du greifst auf das Screenshot zu, ohne es erstellt zu haben?[/Edit]
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
homer Jay
Mini JLI'ler



Anmeldedatum: 13.01.2005
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 26.02.2005, 18:24    Titel: Antworten mit Zitat

Also das Programm soll so ablaufen:

Programm wird gestartet
Sreenshot wird erstellt (während der Laufzeit)
erstellter Screenshot soll als hintergrund auf die primäre Oberlflächt geblitet werden (der Sreenshot soll einfach auf dem ganzen Bildschirm angezeit werden)

Ich habe oben bei meinem ersten beitrag die WinMain und mein Sreenshot - Funktion gepostet (ist aber nur ein Teil des gesamten Codes)!
Dort gibt es gleich zu Beginn der WinMain - funktion den aufruf

CPP:
makeScreenshot();


Wenn ich das Programm mit diesem Aufruf kompiliere und ausführe wird zwar der Sreenshot erstellt und er befindet sich auf der Festplatte aber das Preogramm stürzt gleich ab (Screenshot wird nicht als primäre Oberläche angezigt).
Lasse ich nun den Aufruf weg wird aber nun der Sreenshot angeziegt (wenn sich einer auf der Festplatte befindet wenn ich ihn nicht zuvor gelöscht habe)!!

Ich hoffe ich habe das Prog halbwegs verständlich beschrieben
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.02.2005, 18:31    Titel: Antworten mit Zitat

zeig mal wo du das Screenshot einsetzt und anzeigst (oder bin ich zu blöd das zu finden?)
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 26.02.2005, 18:51    Titel: Antworten mit Zitat

Schonmal versucht zu debuggen?
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
homer Jay
Mini JLI'ler



Anmeldedatum: 13.01.2005
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 27.02.2005, 17:30    Titel: Antworten mit Zitat

@Jonathan_Klein
Nein du bist nicht zu blöd, ich hab bis jezt nur noch nicht den ganzen code gepostet hier is der ganze Code:

CPP:
#include <ddraw.h>
#include <stdio.h>


// Bildschirmbreite und -höhe
#define SCR_WIDTH  1024
#define SCR_HEIGHT 768
// Farbtiefe des Videomodus
#define COLOR_DEPTH 16

#define IMAGE_FILE "K:\\screenshot.bmp" //"..\\..\\media\\jli.bmp"
// Prototypen

// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);

//Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);

// DirectDraw-Objekte initialisieren
BOOL InitDirectDraw(void);

// Objekte/Speicher freigeben
void CleanUpDirectDraw(void);

// Ausgabefunktion
void Render(void);

// Fehlermeldung erzeugen
BOOL Error(char* msg);

//Screenshot erstellen
void makeScreenshot();

// Funktion um eine Oberfläche anzulegen,
// als Grundlage dient eine Bitmap-Datei
LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPCTSTR File, int dWidth, int dHeight);

// Das Fensterhandle
HWND hWnd = 0;

// Zeiger auf das DirectDraw Interface
LPDIRECTDRAW7        lpDD7           = NULL;
LPDIRECTDRAWSURFACE7 lpDDSPrimary    = NULL;
LPDIRECTDRAWSURFACE7 lpDDSurface     = NULL;

// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                   HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                   LPSTR lpCmdLine,          // Kommandozeile
                   int nCmdShow)             // Art wie das Fenster angezeigt werden soll
{
   //makeScreenshot();
   
    // Fenster erzeugen und Handle speichern
    hWnd = CreateMainWindow(hInstance);

    // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
    if(0 == hWnd)
    {
        return Error("Fehler beim Erzeugen des Fenster");
    }

    if(!InitDirectDraw())
    {
        return FALSE;
    }       

   // Struktur, in der Informationen zur Nachricht gespeichert werden
    MSG msg;

   
    // Diese Schleife läuft bis WM_QUIT gesendet wird
    while(GetMessage(&msg,NULL,0,0))
   {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // Rückgabewert an Windows
    return 0;
}


HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass;                                   // WNDCLASSEX Struktur
 
    // Struktur initialisieren
    wndClass.cbSize        = sizeof(WNDCLASSEX);           // Größe angeben (nie vergessen!)
    wndClass.style         = CS_DBLCLKS | CS_OWNDC |
                             CS_HREDRAW | CS_VREDRAW;      // Standard Stile
    wndClass.lpfnWndProc   = WindowFunc;                   // Die Callback Funktion angeben

    wndClass.cbClsExtra    = 0;                            // Zusätzliche Angaben, wird nicht benötigt
    wndClass.cbWndExtra    = 0;                            // Zusätzliche Angaben, wird nicht benötigt
    wndClass.hInstance     = hInstance;                    // Anwendungsinstanz

    wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // Schwarzer Pinsel
    wndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);  // Normaler Cursor
    wndClass.lpszMenuName  = NULL;                         // Das Fenster hat kein Menü
    wndClass.lpszClassName = "WindowClass";                // Der Name der Klasse
    wndClass.hIcon         = LoadIcon(NULL, IDI_WINLOGO);  // Windows Logo
    wndClass.hIconSm       = LoadIcon(NULL, IDI_WINLOGO);  // Windows Logo

    RegisterClassEx(&wndClass);

    return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                          "WindowClass",          // Klassenname
                          "DDSurface",            // Fenstertitel
                          WS_POPUP |              // Fenster
                          WS_VISIBLE,             // Eigenschaften
                          0, 0,                   // Anfangsposition
                          SCR_WIDTH, SCR_HEIGHT,  // und Größe  des Fensters
                          NULL,                   // Handle des Elternfensters
                          NULL,                   // Handle des Menüs
                          hInstance,              // Anwendungsinstanz
                          NULL);                  // wird nicht benötigt
}


// Diese Funktion wird von Windows aufgrufen, wenn eine Nachricht
// für Ihr Programm vorliegt
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // testen, um welche Nachticht es sich handelt
    switch(msg)
    {
        case WM_KEYDOWN:
         switch(wParam)
         {
            case VK_ESCAPE:                     
                    DestroyWindow(hWnd);
                break;
            }
        break;

        case WM_DESTROY:
            CleanUpDirectDraw();
         PostQuitMessage(0);
      break;

        case WM_PAINT:
            PAINTSTRUCT ps;
            BeginPaint(hWnd,&ps);
            Render();
            EndPaint(hWnd,&ps);
      break;       
    }

    // Wenn wir uns nicht um die Nachricht gekümmert haben wird sie
    // an die Standardnachrichtenverarbeitung von Windows geschickt
    return (DefWindowProc(hwnd, msg, wParam, lParam));
}


// DirectDraw initialisieren
BOOL InitDirectDraw(void)
{
    // DirectDrawObjekt anlegen   
    if(FAILED(DirectDrawCreateEx(NULL,(void**)&lpDD7,IID_IDirectDraw7,NULL)))
    { 
        return Error("Fehler beim Anlegen des DirectDraw-Objekts");
    }

    // Kooperationsebene setzen
    if(FAILED(lpDD7->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN)))
    {
        return Error("Fehler beim Setzen des Kooperationsebene");   
    }

    // Auflösung und Farbtiefe setzen
    if(FAILED(lpDD7->SetDisplayMode(SCR_WIDTH,SCR_HEIGHT,COLOR_DEPTH,0,0)))
    {
        return Error("Fehler beim Setzen des Kooperationsebene");   
    }

    // Struktur zur Beschreibung einer Oberfläche
    DDSURFACEDESC2 ddsd;

    // Initialisieren und Größe festlegen
    ZeroMemory(&ddsd,sizeof(ddsd));
    ddsd.dwSize = sizeof(ddsd);
   
    // Die Angabe wdCaps soll berücksichtigt werden
    ddsd.dwFlags = DDSD_CAPS;
   
    // Es soll eine primäre Oberfläche angelegt werden
    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
                         
    // Oberfläche anlegen
    if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
    {
        return Error("Fehler beim Anlegen der primären Oberfläche");
    }

    // Oberfläche laden
    lpDDSurface = CreateSurfaceFromBitmap(IMAGE_FILE,SCR_WIDTH,SCR_HEIGHT);
   
    if(!lpDDSurface)
    {
        return FALSE;
    }   

    return TRUE;
}


void Render(void)
{
    // die Oberfläche, die das geladene Bild enthält
    // auf die primäre Oberfläche Blitten   
    if(FAILED(lpDDSPrimary->Blt(NULL,lpDDSurface,NULL,DDBLT_WAIT,NULL)))
    {
        Error("Blt ist fehlgeschlagen");
    }
}

LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPCTSTR File, int dWidth, int dHeight)
{
   // Device Context für das Bild und die DirectDraw-Oberfläche anlegen
    HDC hBmDC,hSurfDC;

    // Handle der zu ladenden Bitmap
    HBITMAP hBM;                   
   
    // Oberflächenbeschreibung
    DDSURFACEDESC2 SurfDesc; 
   
    // Zeiger auf die Oberfläche
   LPDIRECTDRAWSURFACE7 lpDDSurface;   
   
   // Bild laden
    hBM = (HBITMAP)LoadImage(NULL,File,IMAGE_BITMAP,dWidth,dHeight,LR_LOADFROMFILE);

    // testen ob ein Fehler während des Ladens aufgetreten ist
    if(NULL == hBM)
    {
        return 0;
    }

   // Oberflächenbeschreibung initialisieren
    ZeroMemory(&SurfDesc, sizeof(SurfDesc));
   SurfDesc.dwSize = sizeof(SurfDesc);
   
    // Caps, Höhe und Breite sollen berücksichtigt werden
    SurfDesc.dwFlags =   DDSD_CAPS   | DDSD_HEIGHT | DDSD_WIDTH;

    SurfDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
   SurfDesc.dwWidth  = dWidth;
   SurfDesc.dwHeight = dHeight;
   
    // Oberfläche anlegen
    if(FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL)))
    {
        return 0;
    }

    ZeroMemory(&SurfDesc,sizeof(SurfDesc));
    SurfDesc.dwSize = sizeof(SurfDesc);

    lpDDSurface->GetSurfaceDesc(&SurfDesc);


    // wo befindet sich die erzeugt Oberfläche ?
    if(SurfDesc.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)
    {
       if(SurfDesc.ddsCaps.dwCaps & DDSCAPS_LOCALVIDMEM)
       {
           OutputDebugString("Oberfläche befindet sich im LOCALVIDMEM (Grafikspeicher)\n");
       }
       else
       {
           OutputDebugString("Oberfläche befindet sich im NONLOCALVIDMEM (AGP-Speicher)\n");
       }
    }
    else
    {
        OutputDebugString("Oberfläche befindet sich im SYSTEMSPEICHER\n");   
    }

   // Device Context der Oberfläche holen
    lpDDSurface->GetDC(&hSurfDC);

    // Compatiblen Device Context für das Bild anlegen
    hBmDC = CreateCompatibleDC(hSurfDC);

    // Bild in den Device Context holen
    SelectObject(hBmDC,hBM);

    // Bild in die Oberfläche kopieren
    BitBlt(hSurfDC,0,0,dWidth,dHeight,hBmDC,0,0,SRCCOPY);

   // Device Context freigeben
    lpDDSurface->ReleaseDC(hSurfDC);
   
    // Device Context und Bild löschen
    DeleteDC(hBmDC);
   DeleteObject(hBM);

    // Zeiger auf die Oberfläche zurückgeben
    return lpDDSurface;
}


// Objekte/Speicher freigeben
void CleanUpDirectDraw(void)
{
    if(NULL != lpDDSurface)
    {
        lpDDSurface->Release();
        lpDDSurface = NULL;   
    }
    if(NULL != lpDDSPrimary)
    {
        lpDDSPrimary->Release();
        lpDDSPrimary = NULL;
    }
    if(NULL != lpDD7)
    {
        lpDD7->Release();
        lpDD7 = NULL;
    }
}



// Fehlermeldung ausgeben
BOOL Error(char* msg)
{
    // als MessageBox
    MessageBox(0,msg,"Error",MB_OK);
   
    // und in das Ausgabefenster
    OutputDebugString(msg);
    OutputDebugString("\n");
    return FALSE;
}


void makeScreenshot()
{
            //+++++++++++++++++++SREENSHOT+++++++++++++++++++++++         
HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
         HDC hdcCompatible = CreateCompatibleDC(hdcScreen);
 
         int iWidth  = GetDeviceCaps(hdcScreen, HORZRES);
         int iHeight = GetDeviceCaps(hdcScreen, VERTRES);

         HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen,
                                            iWidth,
                                            iHeight);
 
         HBITMAP hbmOldBitmap = (HBITMAP)SelectObject(hdcCompatible, hbmScreen);

         BitBlt(hdcCompatible,
                      0,0,
                    iWidth,
                   iHeight,
                  hdcScreen,
                      0,0,
                  SRCCOPY);

          /* Nun Speicher für einen Puffer reservieren, der die Daten
         der 32-Bit-Bitmap temporär aufnimmt. */

         DWORD dwImageSize = (DWORD)(iWidth * iHeight * 32 / 8 );
         //void *pImage = HeapAlloc(GetProcessHeap(), 0, dwImageSize); // oder so
         void *pImage = new BYTE[dwImageSize];

         /* Als Nächstes Daten der 32-Bit-Bitmap in den Puffer laden. */
         BITMAPINFO bmi =
         {   
         sizeof(BITMAPINFOHEADER),
                iWidth,
               iHeight,
                    1,
                   32,
                BI_RGB,
                    0,
                    0,
                    0,
                    0,
                    0
                     };

         GetDIBits(hdcCompatible, hbmScreen, 0, (UINT)iHeight, pImage, &bmi, DIB_RGB_COLORS);

         /* Neue Datei erstellen. */
         HANDLE hFile = CreateFile(
         "K:\\screenshot.bmp",
         GENERIC_WRITE,
         0,
         NULL,
         CREATE_ALWAYS,
         FILE_ATTRIBUTE_NORMAL,
         NULL);

         if(hFile == INVALID_HANDLE_VALUE)
         {
         /*return */MessageBox(NULL, "CreateFile failed.", "Failure", MB_ICONERROR);
         }

         /* Jetzt Header für Bitmap präparieren. */
         BITMAPFILEHEADER bmpfh =
         {
         'MB',
         sizeof(BITMAPFILEHEADER),
         0,
         0,
         sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
         };

         /* Nun Header für Bitmap in Datei schreiben. */
         DWORD dwWritten;

         if(!WriteFile(hFile, &bmpfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL) || dwWritten != sizeof(BITMAPFILEHEADER))
         {
            /*return*/ MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
         }

         if(!WriteFile(hFile, &bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL) || dwWritten != sizeof(BITMAPINFOHEADER))
         {
            /*return*/ MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
         }

         /* Anschließend Image in Datei schreiben. */
         if(!WriteFile(hFile, pImage, dwImageSize, &dwWritten, NULL) || dwWritten != dwImageSize)
         {
            /*return*/ MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
         }

         SelectObject(hdcCompatible, hbmOldBitmap);
         delete pImage;
         DeleteObject(hbmScreen);
         DeleteDC(hdcScreen);
         DeleteDC(hdcCompatible);
         //*****************************SCREENSHOT-ENDE*************************

}


Edit:
In meiner IDE ist der anfang der funktion nicht als kommentar (nur hier im Forum Smile ) Aber guter Tipp das mit "+++" statt *** Wink


Zuletzt bearbeitet von homer Jay am 02.03.2005, 18:41, insgesamt 4-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 27.02.2005, 17:42    Titel: Antworten mit Zitat

Frage: von WAS wollt ihr nen screenshot? Von dem desktop? von einem Fenster, von einer Direct3D oder DirectDraw anwendung?
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 27.02.2005, 17:43    Titel: Antworten mit Zitat

Wahg bist du wahnsinnig...!

Also...du willst erst ein Screenshot der Umgebung machen, bevor das Fenster angezeigt wird, und dann quasi das Programm _scheinbar_ auf dem Desktop erscheinen lassen. Richtig?
Dann denke ich steckt makeScreenshot an der richtigen Stelle. Du musst aber den Screenshot glaub ich noch laden, oder du lässt MakeScreenshot einen Zeiger auf die gespeicherte Oberfläche zurückgeben...darf dann aber nicht lokal sein, also mit new, am besten, und dann returnen.
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
homer Jay
Mini JLI'ler



Anmeldedatum: 13.01.2005
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 01.03.2005, 20:48    Titel: Antworten mit Zitat

HomeLess_PunkDrummer hat geschrieben:
Zitat:
Du musst aber den Screenshot glaub ich noch laden, oder du lässt MakeScreenshot einen Zeiger auf die gespeicherte Oberfläche zurückgeben...


Wie meinst du das laden??
In der Funktion:
CPP:
void makeScreenshot();

wird ja der Screen erstellt (auf der HD ist dann die bmp vorhanden) und in der Funktion:
CPP:
LPDIRECTDRAWSURFACE7 CreateSurfaceFromBitmap(LPCTSTR File, int dWidth, int dHeight);

(die ich auch gepostet habe) wird mit LoadImage() ja diese (zuvor erstellte bmp geladen)!

Oder wei meinst du das??

PS: Das prog soll von dem Screen ein Screenshot machen in bzw. bei dem es ausgeführt wird!! (also wenn zB gerade am Desktop ist dann vom Desktop...)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
mfc++
JLI'ler


Alter: 40
Anmeldedatum: 18.02.2004
Beiträge: 163
Wohnort: Bettlä
Medaillen: Keine

BeitragVerfasst am: 02.03.2005, 11:57    Titel: Antworten mit Zitat

die bmp ist ja in dem zeitpunkt ja noch garnicht gespeichert (dauert ja ne sekunde bis die fest auf der dh ist) oder irre ich mich? und bei der funktion makescreenshot würd ich keine sterne verwenden ist ja sonst kommentar also keine funktion. ich mach immer + also //********************SREENSHOT**************************
in //++++++++++++++++++ Screenshot ++++++++++++++++++
Wink nur ein tipp

gruss
_________________
www.teslasystems.ch
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 02.03.2005, 14:21    Titel: Antworten mit Zitat

Hi, ich schließe mich dem Tipp von mfc++ an...

...Ist es eigentlich Absicht, dass der erste Teil deiner makeScreenshot-Funktion als Kommentar steht? Shocked Smile ...

Du hast nämlich nicht(unabsichtlich) // für den Kommentar, sondern /* benutzt. Denn /* hat eine höhere Priorität als //; und als du

/* Nun Speicher für einen Puffer reservieren, der die Daten
der 32-Bit-Bitmap temporär aufnimmt. */

geschrieben hast, wurde der ganze Kommentar mit */ beendet

Gruß DirectXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 02.03.2005, 15:29    Titel: Antworten mit Zitat

das wäre allerdings ein seltener fehler *lol*
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum