Lesson 1

Started by
11 comments, last by fencingone 19 years, 6 months ago
If you don't feel like reading all of this just skip to the end. I have been reading this site for quite some time as you can see by how long I've been a member but I've never really done much in game programming. I took a class in MV C++ 6.0 and passed it with flying marks. However the class only focused on MFC which I realized as I was going through Lesson 1 of NeHe's site doesn't help me much (Either that or I'm even dumber than I thought). So I thought I would finally go and actually start doing something. I was following the steps in Lesson 1 I created a Win32 Application, and I created a blank application. I wasn't sure what kind of application to create "Blank, Simple Win32 Application, or A typical "Hello World" Application." But I noticed that in the code I downloaded from the site there is no other code in the source or header or resource files, so I made a Blank application. Next I linked all the libraries like the tutorial says. This is the part where I feel extremely stupid. I don't know where to write the code. So I just clicked on the new text file button and wrote my code there knowing that it wouldn't work when I compiled my code. So now I have that file written but I don't know what to do. [help] I guess my question is, How do write/create the OpenGL window? Thanks for reading all of this I know it was a lot. Thanks in advance for your help. PS. I wasn't sure if I should post this in the OpenGL forum, the Nehe Forum, Beginners Forum, or the Idiots forum. As you can see though, I put it in the OpenGL forum, sorry benjamin bunny if I put it in the wrong one.
veni vidi vici"Be excellent to Each other" Bill and Ted
Advertisement
Instead of text file, you need to create a new C++ file (.cpp) and enter it in there. The compiler won't even look at .txt files when trying to compile your project. You should remove the file from your project, change the .txt extension on the file to .cpp and then add it to your project again.
Basically what you need is a project that includes a source file with a "WinMain" function. I suppose the easiest way is to do "New Project-Win32 App-Simple Win32 App". It will create the source files automatically.
Quote:Original post by fencingone
PS. I wasn't sure if I should post this in the OpenGL forum, the Nehe Forum, Beginners Forum, or the Idiots forum. As you can see though, I put it in the OpenGL forum, sorry benjamin bunny if I put it in the wrong one.


No problem. I've moved it to the right forum. To clarify the situation, for beginners is more appropriate in this instance, because your problem isn't really an OpenGL one. In general though, nehe is the best place to ask questions specifically related to nehe tutorials, and OpenGL is better for general OpenGL questions.

____________________________________________________________www.elf-stone.com | Automated GL Extension Loading: GLee 5.00 for Win32 and Linux

Thanks for the help. I've gotten the code up now. I got some errors but I fixed them, except for these four.

OpenGL Code.cpp(97) : error C2601: 'CreateGLWindow' : local function definitions are illegalOpenGL Code.cpp(259) : error C2601: 'WndProc' : local function definitions are illegalOpenGL Code.cpp(320) : error C2601: 'WinMain' : local function definitions are illegalOpenGL Code.cpp(378) : fatal error C1004: unexpected end of file foundError executing cl.exe.OPENGL 2.exe - 4 error(s), 0 warning(s)


And here is my (or Nehe's) code
#include <windows.h>#include <gl\gl.h>#include <gl\glu.h>#include <gl\glaux.h>HGLRC		hRC=NULL;HDC		hDC=NULL;HWND		hWnd=NULL;HINSTANCE	hInstance;bool		keys[256];bool		active=TRUE;bool		fullscreen=TRUE;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);GLvoid ReSizeGLScene(GLsizei width, GLsizei height){	if (height==0)	{		height =1;	}	glViewport(0, 0, width, height);	glMatrixMode(GL_PROJECTION);	glLoadIdentity();	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);	glMatrixMode(GL_MODELVIEW);	glLoadIdentity();}int InitGL(GLvoid){	glShadeModel(GL_SMOOTH);	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);	glClearDepth(0.1f);	glEnable(GL_DEPTH_TEST);	glDepthFunc(GL_LEQUAL);	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	return TRUE;}int DrawGLScene(GLvoid){	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	glLoadIdentity();	return TRUE;}GLvoid KillGLWindow(GLvoid){	if (fullscreen)	{		ChangeDisplaySettings(NULL,0);		ShowCursor(TRUE);	}	if (hRC)	{		if (!wglMakeCurrent(NULL,NULL))		{				MessageBox(NULL,"Realease of DC and RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		}		if (!wglDeleteContext (hRC))		{			MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		}		hRC=NULL;	}	if (hDC && !ReleaseDC(hWnd,hDC))	{		MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		hDC=NULL;	}	if (hWnd && !DestroyWindow(hWnd))	{		MessageBox(NULL, "Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		hWnd=NULL;	{	if (!UnregisterClass("OpenGL",hInstance))	{		MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		hInstance=NULL;	}	BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)	{		Gluint			PixelFormat;		WNDCLASS		wc;		DWORD		dwExStyle;		DWORD		dwStyle;		RECT WindowRect;		WindowRect.left=(long)0;		WindowRect.right=(long)width;		WindowRect.top=(long)0;		WindowRect.bottom=(long)height;		fullscreen=fullscreenflag;		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,"Failed To Register The Window Class.","ERROR", MB_OK | MB_ICONEXCLAMATION);			return FLASE;		}		if (fullscreen)		{			DEVMODE dmScreenSettings;			memset(&dmScreenSettings,0,sizeof(dmScreenSettings));			dmScreenSettings.dmSize=sizeof(dmScreenSettings);			dmScreenSettings.dmPelsWidth	= width;			dmScreenSettings.dmPelsHeight	= height;			dmScreenSettings.dmBitsPerPel	= bits;			dmScreenSettings.dmFields=DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIHGT;			if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN) !=DISP_CHANGE_SUCCESFUL)				{					if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)				{					fullscreen=FALSE;				}				else				{					MessageBox(NULL,"Program Will Not Close.","ERROR",MB_OK | MB_ICONSTOP);					return=FALSE;				}			}		}				if (fullscreen)		{			dwExStyle=WS_EX_APPWINDOW;			dwStyle=WS_OVERLAPPEDWINDOW;		}		AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);				if(!(hWnd=CreateWindowEx(	dwExStyle,						"OpenGL",						title,						WS_CLIPSIBLINGS | 						WS_CLIPCHILDREN |						dwStyle,						0, 0,						WindowRect.right-WindowRect.left,						windowRect.bottom-WindowRect.top,						NULL,						NULL,						hINstance,						NULL)))		{			KillGlWindow();			MessageBox(NULL,"Window Creation Error.","ERROR", MB_OK | MB_INCONEXCLAMATION);			return 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  (1(hDC=GetDC(hWnd)))		{			KillGLWINDOW();			MessageBox(NULL,"Can't Create GL Device COntext.","ERROR", MB_OK | MB_ICONCLAMATION);			return FALSE;		}			if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))		{			KillGLWindow();			MessageBox(NULL,"Can't A Suitable PixelFormat,","ERROR", MB_OK | MB_ICONEXCLAMATION);			return FALSE;		}		if(!SetPixelFormat(hDC,PixelFormat,&pfd))		{			KillGLWindow();			MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);			return FALSE;		}		if (!(hRC=wglCreateContext(hDC)))		{			KillGLWindow();				(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);			return FALSE;		}		if(!wglMakeCurrent(hDC,hRC))		{			KillGLWindow();				MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);			return FALSE;		}				ShowWindow(hWnd,SW_SHOW);		SetForegroundWindow(hWnd);		SetFocus(hWnd);		ReSizeGLScene(width, height);				if (!InitGL())		{			KillGLWindow();			MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);			return FALSE;		}		return TRUE;	}			LRESULT CALLBACK WndProc(	HWND	hWnd,							UINT	uMsg,							WPARAM	wParam,							LPARAM	lParam){	switch (uMsg)	{		case WM_ACTIVATE:		{			if (!HIWORD(wParam))			{				active=TRUE;			}			else			{				active=FALSE;			}						return 0;		}				case WM_SYSCOMMAND:		{			switch (wParam)			{				case SC_SCREENSAVE:				case SC_MONITORPOWER:				return 0;			}			break;		}				case WM_CLOSE:		{			PostQuitMessage(0);			return 0;		}				case WM_KEYDOWN:		{			keys[wParam] = TRUE;			return 0;		}				case WM_KEYUP:		{			keys[wParam] = FALSE;			return 0;		}				case WM_SIZE:		{			ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));			return 0;		}			}		return DefWindowProc(hWnd,uMsg,wParam,lParam);}int WINAPI WinMain(			HINSTANCE	hInstance,							HINSTANCE	hPrevInstance,							LPSTR		lpCmdLine,							int		nCmdShow){		MSG	msg;	BOOL	done=FALSE;		if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)	{		fullscreen=FALSE;	}		if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))	{		return 0;	}		while(!done)	{		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))		{				if (msg.message==WM_QUIT)			{				done=TRUE;			}			else			{				TranslateMessage(&msg);				DispatchMessage(&msg);			}		}		else		{			if (active)			{				if (keys[VK_ESCAPE])				{					done=TRUE;				}				else				{					DrawGLScene();					SwapBuffers(hDC);				}			}			if (keys[VK_F1])			{				keys[VK_F1]=FALSE;				KillGLWindow();				fullscreen=!fullscreen;				if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))				{					return 0;				}			}		}	}	KillGLWindow();							return (msg.wParam);}


Thanks again for all the help!

[Edited by - fencingone on September 28, 2004 12:42:48 PM]
veni vidi vici"Be excellent to Each other" Bill and Ted
Your missing a '}' before the line BOOL CreateGLWindow...
I should probably be working now...
Quote:Original post by stu_pb
Your missing a '}' before the line BOOL CreateGLWindow...


Thanks, I made that change. But I'm still getting the same errors. Unless I misunderstood what you were saying. I compared it to the NeHe tutorial and it looks right though.

#include <windows.h>#include <gl\gl.h>#include <gl\glu.h>#include <gl\glaux.h>HGLRC		hRC=NULL;HDC		hDC=NULL;HWND		hWnd=NULL;HINSTANCE	hInstance;bool		keys[256];bool		active=TRUE;bool		fullscreen=TRUE;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);GLvoid ReSizeGLScene(GLsizei width, GLsizei height){	if (height==0)	{		height =1;	}	glViewport(0, 0, width, height);	glMatrixMode(GL_PROJECTION);	glLoadIdentity();	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);	glMatrixMode(GL_MODELVIEW);	glLoadIdentity();}int InitGL(GLvoid){	glShadeModel(GL_SMOOTH);	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);	glClearDepth(0.1f);	glEnable(GL_DEPTH_TEST);	glDepthFunc(GL_LEQUAL);	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	return TRUE;}int DrawGLScene(GLvoid){	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	glLoadIdentity();	return TRUE;}GLvoid KillGLWindow(GLvoid){	if (fullscreen)	{		ChangeDisplaySettings(NULL,0);		ShowCursor(TRUE);	}	if (hRC)	{		if (!wglMakeCurrent(NULL,NULL))		{				MessageBox(NULL,"Realease of DC and RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		}		if (!wglDeleteContext (hRC))		{			MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		}		hRC=NULL;	}	if (hDC && !ReleaseDC(hWnd,hDC))	{		MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		hDC=NULL;	}	if (hWnd && !DestroyWindow(hWnd))	{		MessageBox(NULL, "Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		hWnd=NULL;	{	if (!UnregisterClass("OpenGL",hInstance))	{		MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);		hInstance=NULL;	}	BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)	{		Gluint			PixelFormat;		WNDCLASS		wc;		DWORD		dwExStyle;		DWORD		dwStyle;		RECT WindowRect;		WindowRect.left=(long)0;		WindowRect.right=(long)width;		WindowRect.top=(long)0;		WindowRect.bottom=(long)height;		fullscreen=fullscreenflag;		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,"Failed To Register The Window Class.","ERROR", MB_OK | MB_ICONEXCLAMATION);			return FLASE;		}		if (fullscreen)		{			DEVMODE dmScreenSettings;			memset(&dmScreenSettings,0,sizeof(dmScreenSettings));			dmScreenSettings.dmSize=sizeof(dmScreenSettings);			dmScreenSettings.dmPelsWidth	= width;			dmScreenSettings.dmPelsHeight	= height;			dmScreenSettings.dmBitsPerPel	= bits;			dmScreenSettings.dmFields=DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIHGT;			if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN) !=DISP_CHANGE_SUCCESFUL)				{					if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)				{					fullscreen=FALSE;				}				else				{					MessageBox(NULL,"Program Will Not Close.","ERROR",MB_OK | MB_ICONSTOP);					return=FALSE;				}			}		}				if (fullscreen)		{			dwExStyle=WS_EX_APPWINDOW;			dwStyle=WS_OVERLAPPEDWINDOW;		}		AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);				if(!(hWnd=CreateWindowEx(	dwExStyle,						"OpenGL",						title,						WS_CLIPSIBLINGS | 						WS_CLIPCHILDREN |						dwStyle,						0, 0,						WindowRect.right-WindowRect.left,						windowRect.bottom-WindowRect.top,						NULL,						NULL,						hINstance,						NULL)))		{			KillGlWindow();			MessageBox(NULL,"Window Creation Error.","ERROR", MB_OK | MB_INCONEXCLAMATION);			return 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  (1(hDC=GetDC(hWnd)))		{			KillGLWINDOW();			MessageBox(NULL,"Can't Create GL Device COntext.","ERROR", MB_OK | MB_ICONCLAMATION);			return FALSE;		}			if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))		{			KillGLWindow();			MessageBox(NULL,"Can't A Suitable PixelFormat,","ERROR", MB_OK | MB_ICONEXCLAMATION);			return FALSE;		}		if(!SetPixelFormat(hDC,PixelFormat,&pfd))		{			KillGLWindow();			MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);			return FALSE;		}		if (!(hRC=wglCreateContext(hDC)))		{			KillGLWindow();				(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);			return FALSE;		}		if(!wglMakeCurrent(hDC,hRC))		{			KillGLWindow();				MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);			return FALSE;		}				ShowWindow(hWnd,SW_SHOW);		SetForegroundWindow(hWnd);		SetFocus(hWnd);		ReSizeGLScene(width, height);				if (!InitGL())		{			KillGLWindow();			MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);			return FALSE;		}		return TRUE;	}			LRESULT CALLBACK WndProc(	HWND	hWnd,							UINT	uMsg,							WPARAM	wParam,							LPARAM	lParam){	switch (uMsg)	{		case WM_ACTIVATE:		{			if (!HIWORD(wParam))			{				active=TRUE;			}			else			{				active=FALSE;			}						return 0;		}				case WM_SYSCOMMAND:		{			switch (wParam)			{				case SC_SCREENSAVE:				case SC_MONITORPOWER:				return 0;			}			break;		}				case WM_CLOSE:		{			PostQuitMessage(0);			return 0;		}				case WM_KEYDOWN:		{			keys[wParam] = TRUE;			return 0;		}				case WM_KEYUP:		{			keys[wParam] = FALSE;			return 0;		}				case WM_SIZE:		{			ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));			return 0;		}			}		return DefWindowProc(hWnd,uMsg,wParam,lParam);}int WINAPI WinMain(			HINSTANCE	hInstance,							HINSTANCE	hPrevInstance,							LPSTR		lpCmdLine,							int		nCmdShow){		MSG	msg;	BOOL	done=FALSE;		if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)	{		fullscreen=FALSE;	}		if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))	{		return 0;	}		while(!done)	{		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))		{				if (msg.message==WM_QUIT)			{				done=TRUE;			}			else			{				TranslateMessage(&msg);				DispatchMessage(&msg);			}		}		else		{			if (active)			{				if (keys[VK_ESCAPE])				{					done=TRUE;				}				else				{					DrawGLScene();					SwapBuffers(hDC);				}			}			if (keys[VK_F1])			{				keys[VK_F1]=FALSE;				KillGLWindow();				fullscreen=!fullscreen;				if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))				{					return 0;				}			}		}	}	KillGLWindow();							return (msg.wParam);}
veni vidi vici"Be excellent to Each other" Bill and Ted
EDIT: total crap. I guess I should not try to act like a clever boy when I'm obviously not a clever boy :|


You forgot another "}" before LRESULT CALLBACK WndProc.

To answer you base question, unless I am totally dumb (and since I'm ill, this may be true) your code will probably end up in the bloc (in WinMain()) :

  if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {	    // system code - handle the Windows messages  } else {    // ...    // YOUR GAME CODE GOES HERE    // ...  }


Regards,


[Edited by - Emmanuel Deloget on September 28, 2004 5:43:49 PM]
Thanks for your help Emmanuel Deloget, but I'm not sure what you mean about my code ending up in the WinMain(). I found that part of the code in the tutorial and compared it with mine and they look identical (as far as I can tell at least). I also checked about that "}" before. LRESULT CALLBACK WndProc. The tutorial doesn't show that but I put it in anyway becuase it doesn't add any errors.
veni vidi vici"Be excellent to Each other" Bill and Ted
Hi,
My apologies, I misunderstood what you tried to do. I assumed that when you spoke about not knowing where to put yoour code, you were speaking of you game (or demo) related code. And it seems that you are speaking of all your code.

  if (hWnd && !DestroyWindow(hWnd))  {    MessageBox(NULL, "Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);    hWnd=NULL;    { // <- should be "}"


A couple of lines after that...

    hInstance=NULL;  }} // <-- add this oneBOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)


All other accolades are corrects (ie my previous post was crap). Once you'll done that, you'll have only 18 more compilation error (mostly typos). Good luck ;)

Regards,

This topic is closed to new replies.

Advertisement