Skocz do zawartości

[C++][WinAPI] Okno nie reaguje na kliknięcia


raV

Polecane posty

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

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 :D 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

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

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...