Grafik einbinden oder so
-
hi erstmal, ich bin hier total neu und habe vor kurzem mit der WinAPI programmierung in Visuals C++ angefangen
nach vielen SDK und Direct x SDK downloads kann ich nun anfangen zu programmierenich kenne mich mit anderne programmiersprachen wie z..b java gut aus und habe schon so einige spiele damit hergestellt (und auch andere programme)
ein freund mir bei c++ anfangs geholfen
#include <stdio.h> #include <windows.h> #include <ddraw.h> #include <dsound.h> #include "ddutil.h" #include "dsutil.h" #pragma comment(lib,"user32.lib") /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; class display { private: CDisplay dsply; CSurface *background; public: display(); void free_all(); ~display() { free_all(); }; void hintergrund() {dsply.Blt(0, 0, background);} HRESULT init(HWND hwnd); HRESULT restore(); HRESULT present(); void update() { dsply.UpdateBounds(); }; }; display::display() { background = 0; }; void display::free_all() { if(background) delete background; }; HRESULT display::init(HWND hwnd) { HRESULT hr; hr = dsply.CreateWindowedDisplay(hwnd,640,480); if(hr<0) return hr; hr = dsply.CreateSurfaceFromBitmap(&background,"gfx\\stein.bmp",32,32); if(hr<0) return hr; return S_OK; }; HRESULT display::restore() { HRESULT hr; hr = dsply.GetDirectDraw()->RestoreAllSurfaces(); if(hr<0) return hr; hr = background->DrawBitmap("gfx\\stein.bmp",32,32); if(hr<0) return hr; return S_OK; }; HRESULT display::present() { HRESULT hr; hr = dsply.Present(); if(hr==DDERR_SURFACELOST) return restore(); return hr; }; display spiel_display; class test { public: void start(); void display(); }; void test::display() { spiel_display.hintergrund(); spiel_display.present(); }; test mein_spiel; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_SYSMENU | WS_MINIMIZEBOX, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 640, /* The programs width */ 480, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); if(spiel_display.init(hwnd) < 0) { MessageBox(hwnd,"Die Grafik konnte nicht initialisiert werden.","Grafikfehler", MB_ICONERROR | MB_SETFOREGROUND); return 0; ;} /* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_PAINT: mein_spiel.display(); return 0; case WM_MOVE: spiel_display.update(); return 0; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }doch was jetzt nicht klappt ist das hier CSurface *background;
also irgendwie will er das windowsfenster nicht anzeigen
und gibt den fehler ausVerknüpfen...
Test2Projekt1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: long __thiscall CDisplay::Blt(unsigned long,unsigned long,class CSurface *,struct tagRECT *)" (?Blt@CDisplay@@QAEJKKPAVCSurface@@PAUtagRECT@@@Z)" in Funktion ""public: void __thiscall display::hintergrund(void)" (?hintergrund@display@@QAEXXZ)".
Test2Projekt1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: long __thiscall CDisplay::UpdateBounds(void)" (?UpdateBounds@CDisplay@@QAEJXZ)" in Funktion ""public: void __thiscall display::update(void)" (?update@display@@QAEXXZ)".
Test2Projekt1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall CDisplay::CDisplay(void)" (??0CDisplay@@QAE@XZ)" in Funktion ""public: __thiscall display::display(void)" (??0display@@QAE@XZ)".
Test2Projekt1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall CSurface::~CSurface(void)" (??1CSurface@@QAE@XZ)" in Funktion ""public: void * __thiscall CSurface::`scalar deleting destructor'(unsigned int)" (??GCSurface@@QAEPAXI@Z)".
Test2Projekt1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: long __thiscall CDisplay::CreateSurfaceFromBitmap(class CSurface * *,char *,unsigned long,unsigned long)" (?CreateSurfaceFromBitmap@CDisplay@@QAEJPAPAVCSurface@@PADKK@Z)" in Funktion ""public: long __thiscall display::init(struct HWND_ *)" (?init@display@@QAEJPAUHWND__@@@Z)".
Test2Projekt1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: long __thiscall CDisplay::CreateWindowedDisplay(struct HWND__ *,unsigned long,unsigned long)" (?CreateWindowedDisplay@CDisplay@@QAEJPAUHWND__@@KK@Z)" in Funktion ""public: long __thiscall display::init(struct HWND__ *)" (?init@display@@QAEJPAUHWND__@@@Z)".
Test2Projekt1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: long __thiscall CSurface::DrawBitmap(char *,unsigned long,unsigned long)" (?DrawBitmap@CSurface@@QAEJPADKK@Z)" in Funktion ""public: long __thiscall display::restore(void)" (?restore@display@@QAEJXZ)".
Test2Projekt1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: long __thiscall CDisplay::Present(void)" (?Present@CDisplay@@QAEJXZ)" in Funktion ""public: long __thiscall display::present(void)" (?present@display@@QAEJXZ)".
Test2Projekt1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall CDisplay::~CDisplay(void)" (??1CDisplay@@QAE@XZ)" in Funktion ""public: __thiscall display::~display(void)" (??1display@@QAE@XZ)".
C:\Dokumente und Einstellungen\Andreas\Eigene Dateien\Visual Studio 2005\Projects\Test2Projekt\Debug\Test2Projekt.exe : fatal error LNK1120: 9 nicht aufgelöste externe Verweise.
Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Andreas\Eigene Dateien\Visual Studio 2005\Projects\Test2Projekt\Test2Projekt\Debug\BuildLog.htm" gespeichert.
Test2Projekt - 10 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========beim ersten mal wo ich anfangen wollte ein spiel zu programmieren habe ich es agnz ohne display und so versucht, sondern nur mit der normalen WM_PAINT und bildschrim clearen
es ging auch und ich konnte schon nen spieler programmieren, nur das blöde war das es immer geflackert hat und nach ner zeit alles schwarzweiß wurde
es war ja auch nciht die beste art um etwas zu programmieren
deswegen wollte ich es jetzt auf diese art versuchen, was bei meinem freund auch ohne probleme funktioniert, bei mir aber leider nicht
ich hoffe jemand kann mir irgendwie helfen
-
Hast du die nötigen Libs für DirectX eingebunden? Sieht nicht so aus...
Versuchs mal damit!gruß
Martin
-
eigentlich schon
mein freund hat mir mal sein tetris spiel gegeben und seins klappt einwandfrei
er hat die selben libs und include dateien wie ich
es muss irgendwas am code nicht stimmen aber ich finde den fehler nicht
-
Am Beispiel Visualstudio 2005:
Vergleich mal unter Projekt/Eigenschaften im Abschnitt Linker/Eingabe was bei zusätzliche Abhängigkeiten steht zwischen denem Projekt und dem funktionierenden Projekt deines Freundes.
-
bei meinem freund stand da
winmm.lib dxguid.lib dxerr9.lib ddraw.lib dsound.lib Kernel32.lib user32.lib comdlg32.lib gdi32.lib shell32.lib
hab das bei mir eingebunden, aber es klappt nicht
dafür klappt bei einem anderen projekt damit aber die normalen zeichenfunktionen um z.b. ein rechteck oder text zu zeichnen
-
Was heißt "klappt nicht"? Gleicher Fehler? Oder ein anderer? Hast du die richtigen Verzeichnisse unter Projekt -> Eigenschaften -> Linker -> Allgemein -> Zusätzliche Bibliotheksverzeichnisse angegeben?
-
Der Fehler sagt aus dass eine Referenz auf die Klasse CDisplay fehlt. Hast Du die .cpp Datei in der die Klasse definiert ist ins Projekt geladen? Oder wenn es eine Bibliothek ist, sie eingebunden? Den Header hast Du auf jedenfall eingebunden, denn sonst würde der Compiler motzen, nicht der Linker.