unerklärlich?
-
Wie gesagt, das ist der selbe Code, nur das er auf einmal nicht funktioniert
-
Schau mal in asd.h ob dort die Klassendefinition mit einem ; abgeschlossen ist. Das ist mir schon mal passiert.
-
dein fehler hat garnichts mit den headern zu tun.
du hast schlicht und einfach ein semikolon vor lpDD7 vergessen.
vielleicht in der zeile vorher.
schau dir die cpp genau durch, dann die header in der umgekehrten reihenfolge, wie du sie eingebunden hast.
aber nur die header, die du selbst geschrieben hast.
-
asd.h gigt es nicht. Das ist alles in einem Stück.
Hier ein kuzer Code:#include "DirectDrawClass.h"
#include "global.h"DirectDrawClass::DirectDrawClass(void)
{
lpDD7 = NULL;
lpDDSPrimary = NULL;
lpDDSBackBuffer = NULL;
}BOOL DirectDrawClass::Init(HWND hWnd)
{
// 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 | DDSD_BACKBUFFERCOUNT;// Es soll eine primäre Oberfläche angelegt werden
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;// Es soll ein Puffer angelegt werden
ddsd.dwBackBufferCount = 1;// Oberfläche anlegen
if(FAILED(lpDD7->CreateSurface(&ddsd,&lpDDSPrimary,NULL)))
{
return Error("Fehler beim Anlegen der primären Oberfläche");
}ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;
// Hintergrundpuffer anlegen
if(FAILED(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBackBuffer)))
{
return Error("Fehler beim Anlegen des Puffers");
}return TRUE;
}LPDIRECTDRAWSURFACE7 DirectDrawClass::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
// wenn 0 übergeben wurde, wird die tatsächliche Höhe verwendet
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;
}BITMAP Bitmap;
GetObject(hBM,sizeof(BITMAP),&Bitmap);// 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 = Bitmap.bmWidth;
SurfDesc.dwHeight = Bitmap.bmHeight;// Oberfläche anlegen
if(FAILED(lpDD7->CreateSurface(&SurfDesc,&lpDDSurface,NULL)))
{
return 0;
}// 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,Bitmap.bmWidth,Bitmap.bmHeight,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;
}void DirectDrawClass::Flip(void)
{
// Puffer anzeigen
lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
}void DirectDrawClass::Clear(int Color)
{
DDBLTFX BlitFX;
ZeroMemory(&BlitFX,0);
BlitFX.dwSize = sizeof(BlitFX);// Hintergrundfarbe setzen
BlitFX.dwFillColor = Color;// Puffer löschen
lpDDSBackBuffer->Blt(NULL,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&BlitFX);
}DirectDrawClass::~DirectDrawClass()
{
if(NULL != lpDDSPrimary)
{
lpDDSPrimary->Release();
lpDDSPrimary = NULL;
}
if(NULL != lpDD7)
{
lpDD7->Release();
lpDD7 = NULL;
}
}
-
_________________________________________________---
___________________________________________---------------
Sorry falscher Code:#include <ddraw.h> #include <stdio.h> // Bildschirmbreite und -höhe #define SCR_WIDTH 800 #define SCR_HEIGHT 600 // Farbtiefe des Videomodus #define COLOR_DEPTH 16 #define IMAGE_FILE "..\\..\\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); // 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 { 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; }
-
Kopiert, eingefügt, libs eingebunden, übersetzt, 0 Fehler
Mfg NoFritz
-
BTW: Flenders hat nicht vom Code gesprochen. Er meinte vielmehr die Einstellungen unter Extras->Optionen auf dem Tab Verzeichnisse.
-
Die Frage von Flenders wurde von Gott dem 2. mit einem klaren Ja beantwortet.
Mfg NoFritz
-
Die Frage von Flenders wurde von Gott dem 2. mit einem klaren Ja beantwortet.
Das ist richtig. Aber er hat die Frage eindeutig nicht verstanden, denn er schreibt auch:
, das ist der selbe Code,
Und vom Code war überhaupt keine Rede, es drehte sich, wie gesagt, um die Verzeichnis-Liste.
-
Da hast Du recht. Die Frage hat er tatsächlich nicht verstanden und ich die 2. Antwort wohl nicht.....
Mfg NoFritz