wo ist hier der fehler?
lima-city → Forum → Programmiersprachen → C/C++ und D
absturz
anmerkung
beitrag
benutzt beitrag
break
compiler
definition
eigene schleife
fenster
funktion
globalen fensters
inhalt
klammern
kommentiert hast
message
null
operation
phase
schleifen
titelleiste
- 
    
    ich wei? nicht ob sich das jetzt jemand antut und alles durguckt aber ich f?nds wirklich cool von euch!
 
 //Frame.cpp
 
 //INCLUDES////////////////////////////////////////
 
 #include <windows.h>
 #include "Frame.h"
 
 //GLOBALS/////////////////////////////////////////
 
 BOOL done;
 int Spiel_Zustand;
 HWND hwnd;
 
 //FUNKTIONEN//////////////////////////////////////
 
 //CALLBACK FUNKTION
 
 LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
 {
 switch(message)
 {
 case WM_DESTROY:
 {
 done = TRUE;
 PostQuitMessage(0);
 return(0);
 } break;
 case WM_KEYDOWN:
 switch (wparam)
 {
 case VK_ESCAPE:
 {
 PostMessage(hwnd, WM_CLOSE, 0, 0);
 return 0;
 } break;
 } break;
 default:break;
 } //switch zu Ende
 return (DefWindowProc(hwnd, message, wparam, lparam));
 } //Window Proc zu Ende
 
 //Startfunktionen
 
 int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst, LPSTR lpcmdline, int ncmdshow)
 {
 
 WNDCLASSEX winclass;
 MSG message;
 const char szclassname[] = "Klassenname";
 DWORD loop_start_time;
 
 winclass.cbSize = sizeof(WNDCLASSEX);
 winclass.style = CS_HREDRAW | CS_VREDRAW;
 winclass.lpfnWndProc = WindowProc;
 winclass.cbClsExtra = 0;
 winclass.cbWndExtra = 0;
 winclass.hInstance = hinst;
 winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 winclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 winclass.lpszClassName = szclassname;
 winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 
 if (!RegisterClassEx(&winclass))
 return(0);
 
 // Handle zum erzeugen des globalen Fensters
 
 if (!(hwnd = CreateWindowEx(NULL, szclassname, "3D Spieleprogrammierung - Titelleiste", WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 400, 300, NULL, NULL, hinst, NULL)))
 return(0);
 
 ShowWindow(hwnd, ncmdshow);
 UpdateWindow(hwnd);
 
 done = FALSE;
 Spiel_Zustand = SPIEL_AUSWAHL;
 
 //Phase1:
 Spiel_Intialisieren();
 
 //Phase2:
 //HAUPTSCHLEIFE///////////////////////////////////////////////
 while(!done)
 {
 while(GetMessage(&message,NULL,0,0))
 {
 TranslateMessage(&message);
 DispatchMessage(&message);
 } //PEEKMESSAGE
 
 //Startzeit der Hauptschleife
 loop_start_time = GetTickCount();
 
 switch(Spiel_Zustand)
 {
 case SPIEL_AUSWAHL:
 {
 //code
 Spiel_Zustand = SPIEL_START;
 } break;
 case SPIEL_LAUEFT:
 {
 //Alles f?rs Game...
 } break;
 case SPIEL_NEUSTART:
 {
 //code
 Spiel_Zustand = SPIEL_START;
 } break;
 default:break;
 } //switch zu Ende
 
 //Framebremse
 
 while ( (GetTickCount() - loop_start_time) < 20);
 } //Hauptschleife zu Ende
 
 //Phase 3:
 Spiel_Beenden();
 
 return message.wParam;
 
 } // WinMain zu Ende
 
 //Phase1:
 int Spiel_Intialisieren(void)
 {
 //zu Erledigen:
 //Intialisierungen
 return 1;
 }
 
 //Phase3:
 int Spiel_Beenden(void)
 {
 //zu Erledigen:
 //Speicher freigeben etc.
 return 1;
 }
 
 
 
 //Frame.h
 
 //DEFINITIONEN////////////////////////////////////
 
 #define WIN32_LEAN_AND_MEAN
 #define SPIEL_AUSWAHL 0
 #define SPIEL_START 1
 #define SPIEL_LAUEFT 2
 #define SPIEL_NEUSTART 3
 
 //MAKROS//////////////////////////////////////////
 
 //noch keine vorhanden
 
 //PROTOTYPEN//////////////////////////////////////
 
 int Spiel_Intialisieren(void);
 int Spiel_Beenden(void);
 
 
 Beitrag ge?ndert am 24.11.2005 16:17 von andieo
- 
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden! lima-city: Gratis werbefreier Webspace für deine eigene Homepage 
- 
    
    ich hab durchgeguckt, es sind alles klammernpaare, das hei?t, es fehlt keine klammer.
 
 Beitrag ge?ndert am 24.11.2005 16:22 von ruehrer
- 
    
    Hmmm ich hab's mal getestet (unter BCB und VC++) es wird richtig kompiliert und auch ausgef?hrt ohne Probs also kein Absturz.
 Aber man sollte mal anmerken das frame.h nen Header ist der im Includeverzeichnis schon besteht also gib dem mal nen anderen Namen und um mehrmaliges includen zu verhindern solltest den Inhalt von frame.h mal so ?ndern
 
 #ifndef frameH
 #define frameH frameH
 //Frame.h
 
 //DEFINITIONEN////////////////////////////////////
 
 #define WIN32_LEAN_AND_MEAN
 #define SPIEL_AUSWAHL 0
 #define SPIEL_START 1
 #define SPIEL_LAUEFT 2
 #define SPIEL_NEUSTART 3
 
 //MAKROS//////////////////////////////////////////
 
 //noch keine vorhanden
 
 //PROTOTYPEN//////////////////////////////////////
 
 int Spiel_Intialisieren(void);
 int Spiel_Beenden(void);
 #endif //frameH
 
 
 Zu deinem eigentlichen Prob guck mal alle Compiler/Linkereinstellung Flags etc. durch ob da nicht was falsch eingestellt ist und der was falsch Link
 
 Aso w?re sch?n zu wissen welchen Compiler du benutzt.
 
 Beitrag ge?ndert am 24.11.2005 17:49 von funkdoobiest
- 
    
    Das Problem liegt an der Stelle, wo du deinen Quelltext mit "Phase 2\r\nHauptschleife" kommentiert hast. Dein Programm l?uft so lange in der "while (GetMessage(&message,NULL,0,0))"-Schleife, bis es die Nachricht WM_QUIT bekommt (also beendet werden soll). Der Rest deiner "while (!done)"-Schleife ist also v?llig nutzlos.
 
 Deine "Hauptschleife" darf also eigentlich nur so aussehen:
 while(GetMessage(&message,NULL,0,0))
 {
   TranslateMessage(&message);
   DispatchMessage(&message);
 }
 
 und gleich danach das Ende des Programmes mit
 return message.wParam; // Ende von WinMain
 
 Eine eigene Schleife musst du woanders einbauen. Du k?nntest das in die WindowProc einbauen, was aber fast immer eine schlechte Idee ist, da dein Fenster bei l?ngeren Operationen dann "einfriert". Du musst f?r deine eigene Schleife einen neuen Thread starten.
 
 
 ?brigens sieht deine WindowProc schlimm aus 
 Hier mal eine saubere Version (einfacher lesbar, l?st aber dein Problem nicht):
 LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
 {
    switch(message)
    {
    case WM_DESTROY:
       done = TRUE;
       PostQuitMessage(0);
       return(0);
 
    case WM_KEYDOWN:
       switch (wparam)
       {
       case VK_ESCAPE:
          PostMessage(hwnd, WM_CLOSE, 0, 0);
          return 0;
       }
    } //switch zu Ende
 
    return (DefWindowProc(hwnd, message, wparam, lparam));
 }
 
 
 
 Beitrag ge?ndert am 25.11.2005 12:31 von 0-checka
 
 Beitrag ge?ndert am 25.11.2005 12:32 von 0-checka
- 
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden! lima-city: Gratis werbefreier Webspace für deine eigene Homepage 
