 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
HomeLess_PunkDrummer JLI Master Trainee

Alter: 36 Anmeldedatum: 28.11.2004 Beiträge: 583 Wohnort: Alter Joghurtbecher an der A4 Medaillen: Keine
|
Verfasst am: 21.02.2005, 17:35 Titel: |
|
|
Hui, ich hab jetzt auch TGA...das ist fein, jetzt wo ich die Codierung gesehen hab muss man sagen: Irgendwie gehts doch kaum besser?
Aber als TGA speichern und RLE codieren dürfte doch _etwas_ langsam sein... _________________ "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 |
|
 |
mfc++ JLI'ler
Alter: 40 Anmeldedatum: 18.02.2004 Beiträge: 163 Wohnort: Bettlä Medaillen: Keine
|
Verfasst am: 21.02.2005, 19:09 Titel: |
|
|
bei mir klappts wunderbar sogar mit nummerierung danke für die hilfe  _________________ www.teslasystems.ch
 |
|
Nach oben |
|
 |
homer Jay Mini JLI'ler
Anmeldedatum: 13.01.2005 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 23.02.2005, 20:23 Titel: |
|
|
hi leuz
ich möchte ein prog schreiben, dass einen Sreenshot erstellt und ihn dann als prog startet (also den screen als hintergund)!!
das ist der code den ich habe:
CPP: | #include <ddraw.h>
#include <stdio.h>
// Bildschirmbreite und -höhe
#define SCR_WIDTH 1024//800
#define SCR_HEIGHT 768//600
// 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();
/*char buf[255];
sprintf(buf,"Dieses Programm lädt das Bild %s in eine Oberfläche"
"und blittet es auf die primäre Oberfläche",IMAGE_FILE);
MessageBox(NULL,buf,"Beschreibung",MB_OK);*/
// 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*************************
}; |
das prog macht zwar den screen aber startet das prog dann nicht, aber wenn ich den funktions aufruf makeSreenshot(); weglasse (vorausgesetzt die bmp existiert bereits auf der festplatte) fuktioniert es!!
Ich hoffe es kann mir jemand helfen
danke im voraus homer Jay |
|
Nach oben |
|
 |
mfc++ JLI'ler
Alter: 40 Anmeldedatum: 18.02.2004 Beiträge: 163 Wohnort: Bettlä Medaillen: Keine
|
Verfasst am: 25.02.2005, 18:33 Titel: |
|
|
ich hätte ne andere frage (sorry) im eigene dateien ordner sind ja (in xp) meine musik, eigene bilder und so. ich möchte die screenshots in meine screenshots speichern (wie man den ordner macht weiss ich) aberwie ich dahinkomme weiss ich nicht. also wie ich zu den eigenen dateien komme weiss ich nit. manche haben es auf c: manche auf d: u.s.w
danke im voraus _________________ www.teslasystems.ch
 |
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 25.02.2005, 19:00 Titel: |
|
|
Es gibt da einige Registrierungseinträge unter:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders _________________ »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 |
|
 |
C++Builder Senior JLI'ler

Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
|
Nach oben |
|
 |
PeaceKiller JLI Master

Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
|
Nach oben |
|
 |
|
|
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
|