Seconda parte del programma:
GLvoid UccidiFinestraGL(GLvoid) // Uccide la finestra
{
if (schermopieno)
{
ChangeDisplaySettings(NULL,0);
ShowCursor(TRUE);
}
if (hRC) // Abbiamo il contesto di rendering
{
if (!wglMakeCurrent(NULL,NULL))
{
MessageBox(NULL,"Rilascio fallito di DC e RC .","ERRORE SHUTDOWN",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC))
{
MessageBox(NULL,"Rilascio fallito del contesto di rendering.","ERRORE SHUTDOWN",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL; // Imposta RC a NULL
}
if (hDC && !ReleaseDC(hWnd,hDC)) // Possiamo impostare il DC
{
MessageBox(NULL,"Rilascio fallito del Dispositivo Contesto.","ERRORE SHUTDOWN",MB_OK | MB_ICONINFORMATION);
hDC=NULL; // Imposta DC a NULL
}
if (hWnd && !DestroyWindow(hWnd)) // Possiamo distruggere la finestra?
{
MessageBox(NULL,"Non riesce a rilasciare hWnd.","ERRORE SHUTDOWN",MB_OK | MB_ICONINFORMATION);
hWnd=NULL; // Set hWnd To NULL
}
if (!UnregisterClass("OpenGL",hInstance)) // Are We Able To Unregister Class
{
MessageBox(NULL,"Non riesce a cancellare la classe.","ERRORE SHUTDOWN",MB_OK | MB_ICONINFORMATION);
hInstance=NULL; // Set hInstance To NULL
}
}
BOOL CreaFinestraGL(char* titolo, int larghezza, int altezza, int bits, bool schermopienoflag)
{
GLuint PixelFormat;
WNDCLASS wc;
DWORD dwExStyle;
DWORD dwStyle;
RECT WindowRect;
WindowRect.left=(long)0;
WindowRect.right=(long)larghezza;
WindowRect.top=(long)0;
WindowRect.bottom=(long)altezza;
schermopieno=schermopienoflag;
hInstance = GetModuleHandle(NULL);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "OpenGL";
if (!RegisterClass(&wc))
{
MessageBox(NULL,"Classe Window fallito rilascio.","ERRORE",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if (schermopieno) // Prova schermopieno?
{
DEVMODE dmScreenSettings; // Modalità del dispositivo
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize=sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth = larghezza;
dmScreenSettings.dmPelsHeight = altezza;
dmScreenSettings.dmBitsPerPel = bits;
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// Try To Set Selected Mode And Get Results. NOTE: CDS_schermopieno Gets Rid Of Start Bar.
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
// If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode.
if (MessageBox(NULL,"La scheda video non supporta modalita' a pieno schermo. Usare modalita' finestra?","Open GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
schermopieno=FALSE; // Windowed Mode Selected. schermopieno = FALSE
}
else
{
// Pop Up A Message Box Letting User Know The Program Is Closing.
MessageBox(NULL,"Programa chiudera' ora.","ERRORE",MB_OK|MB_ICONSTOP);
return FALSE; // Return FALSE
}
}
}
if (schermopieno) // Siamo ancora a pieno schermo?
{
dwExStyle=WS_EX_APPWINDOW;
dwStyle=WS_POPUP; // Stile finestra
ShowCursor(FALSE);
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Stile finestra estesa
dwStyle=WS_OVERLAPPEDWINDOW;
}
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
// Crea la finestra
if (!(hWnd=CreateWindowEx( dwExStyle,
"OpenGL",
titolo,
dwStyle |
WS_CLIPSIBLINGS |
WS_CLIPCHILDREN,
0, 0,
WindowRect.right-WindowRect.left,
WindowRect.bottom-WindowRect.top,
NULL,
NULL, // No Menu
hInstance, // Instanza
NULL))) //
{
UccidiFinestraGL(); // Resetta lo schermo
MessageBox(NULL,"Errore creazione finestra.","ERRORE",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Ritorna FALSE
}
static PIXELFORMATDESCRIPTOR pfd= {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
bits,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
16,
0,
0,
PFD_MAIN_PLANE,
0,0, 0, 0
};
if (!(hDC=GetDC(hWnd))) // Abbiamo contesto del dispositivo?
{
UccidiFinestraGL();
MessageBox(NULL,"Non crea un dispositivo di Contento GL.","ERRORE",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))
{
UccidiFinestraGL();
MessageBox(NULL,"Non trova un Formato Pixel.","ERRORE",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Possiamo impostare il formato pixel?
{
UccidiFinestraGL();
MessageBox(NULL,"Non riesce ad impostare un Formato Pixel.","ERRORE",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if (!(hRC=wglCreateContext(hDC)))
{
UccidiFinestraGL();
MessageBox(NULL,"Non riesce a creare un Contesto GL.","ERRORE",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if(!wglMakeCurrent(hDC,hRC))
{
UccidiFinestraGL();
MessageBox(NULL,"Non attiva un Contesto di rendering GL.","ERRORE",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
ShowWindow(hWnd,SW_SHOW);
SetForegroundWindow(hWnd);
SetFocus(hWnd);
RidimensioneScenaGL(larghezza, altezza);
if (!InizGL())
{
UccidiFinestraGL();
MessageBox(NULL,"Inizializzazione fallita.","ERRORE",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Restituisci FALSO
}
return TRUE; // Successo
}
LRESULT CALLBACK WndProc( HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg) // Controlla i messaggi
{
case WM_ACTIVATE:
{
if (!HIWORD(wParam))
{
attivo=TRUE; // Programma attivo
}
else
{
attivo=FALSE; // Program non più attivo
}
return 0;
}
case WM_SYSCOMMAND: // Intercetta Comandi di sistema
{
switch (wParam)
{
case SC_SCREENSAVE:
case SC_MONITORPOWER:
return 0;
}
break; // Uscita
}
case WM_CLOSE:
{
PostQuitMessage(0);
return 0;
}
case WM_KEYDOWN:
{
tasti[wParam] = TRUE;
return 0;
}
case WM_KEYUP:
{
tasti[wParam] = FALSE;
return 0;
}
case WM_SIZE: // Ridimensiona finestra OpenGL
{
RidimensioneScenaGL(LOWORD(lParam),HIWORD(lParam));
return 0;
}
}
// Passa i messaggi non gestiti DefWindowProc
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int WINAPI WinMain( HINSTANCE hInstance, // Instance
HINSTANCE hPrevInstance, // Previous Instance
LPSTR lpCmdLine, // Command Line Parameters
int nCmdShow) // Window Show State
{
MSG msg; // Windows Message Structure
BOOL fatto=FALSE; // Bool Variable To Exit Loop
// Chiede all'utente quale modlità schermo preferisce
if (MessageBox(NULL,"Vuoi eseguire modalita' a pieno schermo?", "Pieno Schermo?",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
schermopieno=FALSE; // Modalità finestra
}
// Crea la finestra OpenGL
if (!CreaFinestraGL("Tutorial Oggetti Solidi",800,600,16,schermopieno))
{
return 0; // Quit se la finestra non viene creata
}
while(!fatto) // Loop del programma
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
fatto=TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else // Se non ci sono messaggi
{
// Disegna la scena. E controlla ESC e DisegnaScenaGL()
if ((attivo && !DisegnaScenaGL()) || tasti[VK_ESCAPE])
{
fatto=TRUE; // ESC o DisegnaScenaGL Segnala Quit
}
else
{
SwapBuffers(hDC); // Swap Buffers (Doppio buffer)
}
if (tasti[VK_F1])
{
tasti[VK_F1]=FALSE;
UccidiFinestraGL();
schermopieno=!schermopieno; // Toggle schermopieno / modalità finestra
// Ricrea la finestra OpenGL
if (!CreaFinestraGL("Tutorial oggetti solidi",800,600,32,schermopieno))
{
return 0; // Esce dal progrmma se la finestra non viene creata
}
}
}
}
// Spegnimento
UccidiFinestraGL(); // Cancella la finstra
return (msg.wParam); // Esce dal programma
}
Nessun commento:
Posta un commento