raV Napisano Październik 29, 2010 Zgłoś Share Napisano Październik 29, 2010 Cześć! Kolejny post i kolejne pytanie. Mam taki oto kod programiku z OpenGL. Kompiluję to w DevCPP, Windows 7 32bit. W opcjach konsolidatora musiałem dodać kombinację "-lopengl32 -lglu32 -mwindows", inaczej się nic nie skompiluje (w Dev + Vista nic nie musiałem dodawać). Problem polega na tym, że nie mogę zamknąć okienka zaraz po otwarciu. Nie reaguje na "X". Muszę je np. przesunąć i dopiero wtedy mogę je zamknąć. Każdemu kto pomoże wytropić robaka, postawię wirtualne piwo ;-) #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <gl/gl.h> #include <gl/glu.h> HDC g_hDC; //------------------------------------------------------------------------------------------------- void SetupPixelFormat(HDC hDC){ int nPixelFormat; static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW + PFD_SUPPORT_OPENGL + PFD_DOUBLEBUFFER + PFD_TYPE_RGBA, 32, 0,0,0,0,0,0, 0, 0, 0, 0,0,0,0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0,0,0 }; nPixelFormat = ChoosePixelFormat(hDC, &pfd); SetPixelFormat(hDC, nPixelFormat, &pfd); } //------------------------------------------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static HDC hDC; static HGLRC hRC; int width, height; switch(message){ case WM_CREATE: hDC = GetDC(hwnd); g_hDC = hDC; SetupPixelFormat(hDC); hRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hRC); break; case WM_CLOSE: wglMakeCurrent(hDC, NULL); wglDeleteContext(hRC); PostQuitMessage(0); break; case WM_SIZE: height = HIWORD(lParam); width = LOWORD(lParam); if(height==0) height = 1; glViewport(0,0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, (GLfloat)width/(GLfloat)height, 1.0f, 1000.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } //------------------------------------------------------------------------------------------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ WNDCLASSEX windowClass; HWND hwnd; MSG msg; bool done; windowClass.cbSize = sizeof(WNDCLASSEX); windowClass.style = CS_HREDRAW | CS_VREDRAW; windowClass.lpfnWndProc = WndProc; windowClass.cbClsExtra = 0; windowClass.cbWndExtra = 0; windowClass.hInstance = hInstance; windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); windowClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); windowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); windowClass.lpszMenuName = NULL; windowClass.lpszClassName = "VisualiserWindowClass"; if(! RegisterClassEx(&windowClass)) return 0; hwnd = CreateWindowEx( 0, "VisualiserWindowClass", "Visualiser", WS_OVERLAPPEDWINDOW+ WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, HWND_DESKTOP, NULL, hInstance, NULL ); if(!hwnd) return 0; ShowWindow(hwnd, SW_SHOW); //te dwie linijki niekonieczne, bo jest WS_VIS.. UpdateWindow(hwnd); done = false; //---init-------------------------------------- glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CCW); glShadeModel(GL_SMOOTH); glMatrixMode(GL_MODELVIEW); float mat1[] = {1,1,1,1}; float ambient[] = {0.7, 0.7, 0.7, 1}; float diffuse[] = {0.7, 0.7, 0.7, 1}; float pos[] = {5,1,0, 1}; glMaterialfv(GL_FRONT, GL_AMBIENT, mat1); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat1); glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_POSITION, pos); float spotdir[] = {-1,0,-1}; glLightf( GL_LIGHT0, GL_SPOT_CUTOFF, 40); glLightf( GL_LIGHT0, GL_SPOT_EXPONENT, 30); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spotdir); glMaterialfv(GL_FRONT, GL_SPECULAR, mat1); glMaterialf (GL_FRONT, GL_SHININESS, 40); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); float angle; while(!done){ PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE); if(msg.message == WM_QUIT) done = true; angle+=0.1f; if(angle>=360) angle=0; glClear(GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,-1,-3); glRotatef(angle,0,1,0); glColor3f(1.0,0.0,0.0); glBegin(GL_QUADS); glVertex3f(0.0,0.0,0.0); glVertex3f(1.0,0.0,0.0); glVertex3f(1.0,0.0,-1.0); glVertex3f(0.0,0.0,-1.0); glEnd(); SwapBuffers(g_hDC); TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } Link do komentarza Udostępnij na innych stronach More sharing options...
Jason Napisano Październik 30, 2010 Zgłoś Share Napisano Październik 30, 2010 DevC++ to już zabytek dawnej epoki. Używa starego mingw i gcc. A pisanie z użyciem WinAPI programów używających OpenGL to jeszcze większe wykroczenie Jest wiele bibliotek pod które można podpiąć kontekst OpenGL, polecam SDL. Jeśli problem będzie dalej występował to daj znać. Link do komentarza Udostępnij na innych stronach More sharing options...
raV Napisano Październik 31, 2010 Autor Zgłoś Share Napisano Październik 31, 2010 Problem rozwiązałem i pod Dev'em. @Jason: wiem, że Dev jest stary i naprawdę słaby, ale nic innego nie znam. Polecisz coś darmowego, lekkiego, używającego GCC? Link do komentarza Udostępnij na innych stronach More sharing options...
xevil21 Napisano Październik 31, 2010 Zgłoś Share Napisano Październik 31, 2010 Problem rozwiązałem i pod Dev'em. @Jason: wiem, że Dev jest stary i naprawdę słaby, ale nic innego nie znam. Polecisz coś darmowego, lekkiego, używającego GCC? Podaj rozwiązanie problemu. Pozdrawiam! Link do komentarza Udostępnij na innych stronach More sharing options...
Jason Napisano Październik 31, 2010 Zgłoś Share Napisano Październik 31, 2010 Problem rozwiązałem i pod Dev'em. @Jason: wiem, że Dev jest stary i naprawdę słaby, ale nic innego nie znam. Polecisz coś darmowego, lekkiego, używającego GCC? Do projektow polecam Code::Blocks, do prostych programikow konsolowych (gdzie nie potrzebujesz linkowac i uzywasz biblioteki standardowej - iostream, cmath itp.) polecam Geany IDE - do uzywania pod Windowsem chyba potrzebujesz oddzielnie sciagnac GCC, bo Geany jest IDE do wszystkiego (Python, Pascal, C, PHP itd.), wiec twórcy nie dołączają kompilatorów, pod Linuksem też trzeba zainstalować odpowiednie kompilatory do używania ich z poziomu Geany. Link do komentarza Udostępnij na innych stronach More sharing options...
raV Napisano Listopad 6, 2010 Autor Zgłoś Share Napisano Listopad 6, 2010 Podaj rozwiązanie problemu. Pozdrawiam! No cóż, nie wiem czy to do końca działa, ale: w "case WM_CLOSE" jako pierwsze dopisałem done=true, co ma przerwać pętlę programu. W zasadzie działa. Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.