SDL + OpenGL + WINAPI
-
hallo ich hab ein problem, ich will gerne eine art 3deditor machen. wo ich in einem winapi programm fenster ein Opengl frame hab.
ich habe eine kleines beispiel abgeändert aber es klappt nicht. das programm ist gestartet aber das fenster wird nicht angezeigt. wenn ich aber nun bei m_VideoFlags den flag m_VideoFlags = SDL_OPENGL; weg mache klappt das programm problemlos. woran kann das liegen?
#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <SDL/SDL.h> #include <GL/gl.h> #include <GL/glu.h> #include "Resource.h" static HWND g_hwnd; const SDL_VideoInfo *videoInfo; int done = 0; int m_VideoFlags; int m_ScreenWidth = 800; int m_ScreenHeight = 600; int m_BitsPerPixel = 32; char windowid[100]; WNDCLASSEX wcex; RECT rect; SDL_Surface *screen; SDL_Event event; LRESULT CALLBACK MainProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_COMMAND: if (LOWORD(wParam) == ID_QUIT) { event.type = SDL_QUIT; SDL_PushEvent(&event); } break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); break; } return 1; } void InitializeWin32Window(HINSTANCE hInst, int width, int height) { ZeroMemory(&wcex, sizeof(wcex)); wcex.cbSize = sizeof(wcex); wcex.style = CS_BYTEALIGNCLIENT; wcex.lpfnWndProc = MainProc; wcex.hInstance = hInst; wcex.lpszClassName = "Mainframe"; RegisterClassEx(&wcex); ZeroMemory(&rect, sizeof(RECT)); rect.right = width; rect.bottom = height; AdjustWindowRectEx(&rect, WS_OVERLAPPEDWINDOW, TRUE, 0); g_hwnd = CreateWindowEx( 0, "Mainframe", "SDL+Win32", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, abs(rect.left) + rect.right, abs(rect.top) + rect.bottom, NULL, LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU)), hInst, NULL); strcpy(windowid, "SDL_WINDOWID="); _ltoa((long)g_hwnd, windowid+13, 10); _putenv(windowid); } void handleKey(SDL_keysym *keysym) { switch (keysym->sym) { case SDLK_ESCAPE: SDL_Quit(); exit(1); break; default: break; } } void handleEvent() { while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_KEYDOWN: handleKey(&event.key.keysym); break; case SDL_QUIT: SDL_Quit(); exit(1); break; default: break; } } } int main(int argc, char *argv[]) { InitializeWin32Window(GetModuleHandle(NULL), m_ScreenWidth, m_ScreenHeight); SDL_Init(SDL_INIT_VIDEO); videoInfo = SDL_GetVideoInfo(); m_VideoFlags = SDL_OPENGL; m_VideoFlags |= SDL_GL_DOUBLEBUFFER; m_VideoFlags |= SDL_HWPALETTE; m_VideoFlags |= SDL_RESIZABLE; if (videoInfo->hw_available) m_VideoFlags |= SDL_HWSURFACE; else m_VideoFlags |= SDL_SWSURFACE; if(videoInfo->blit_hw) m_VideoFlags |= SDL_HWACCEL; SDL_SetCursor(0); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); screen = SDL_SetVideoMode(m_ScreenWidth, m_ScreenHeight, m_BitsPerPixel, m_VideoFlags); glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glViewport(0,0,800,600); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)800/(GLfloat)600, .5f ,150.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); while (1) { handleEvent(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); SDL_GL_SwapBuffers(); } SDL_Quit(); exit(1); return 0; }
-
Du solltest Deine Vorgehensweise mal überdenken und bei einem Win32API programm die Sache mit main knicken und die Sache mit SDL.
-
ne die idee ist schon gut. und durch eine kleine änderung hab ichs hinbekommen dass es klappt. also ich habs jetzt so wie ich es wollte. einehäfte programm und die andere hälfte opengl/sdl.
-
sehr sinnvoll isses aber nich oder?
-
Winapi + SDL halte ich für Blödsinn. Entweder du nimmst Winapi, dann hast du ein pures Windowsprogramm, aber das schöne Windows-GUI. Oder du nimmst SDL und das ganze ist weitgehend betriebssystemunabhängig (nicht ganz, aber SDL gibt es für alle gängigen OS).
geloescht