Click here to Skip to main content
Click here to Skip to main content

OpenGL Win32 AppWizard

, 19 May 2003
Rate this:
Please Sign up or sign in to vote.
This Custom AppWizard for VC++ 6.0 or VC++.NET creates an OpenGL enabled Win32 application suitable for demos and simple games.

Sample Image - OGLWiz.gif
An example of a generated application

Installation (VC6 version)

Copy OGLWiz.awx and Oglwiz.hlp to your Custom AppWizard directory (probably "C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Template").

Overview of the generated project (VC6 version)

Projects generated with this AppWizard contains two classes:
  • CApp
  • CMainWnd
There is a global instance of CApp (gApp) that owns an instance of CMainWnd (m_pMainWnd). CApp creates the main window, initializes OpenGL, maintains the message pump and manages screen updates. CMainWnd encapsulates the main window and its OpenGL rendering context. CApp notifies CMainWnd of different phases of the OpenGL RC life cycle (by calling CMainWnd::InitScene(), CMainWnd::KillScene() and CMainWnd::DrawScene()). CMainWnd::Tick() is called (by CApp) each time the windows message queue is empty.

This may not be the most elegant OO solution; some of the code in CApp really belongs in CMainWnd, like window creation and (some of the) message handling. But the idea is to let CApp do the grunt work of Win32API and OpenGL setup and leave CMainWnd free to concentrate on what's displayed in the client area.

Using the wizard

Chose to create a new project, selecting "OpenGL Win32 Application" from the list of project types, enter a project name and press OK.

The following options to customize the project are available:

Application

Menu: Check this box to add a menu to the main window.
Keyboard accelerator: Adds a keyboard accelerator resource and processes accelerator keys.
About box: Creates an about dialog and a dialog callback routine. Also adds an About command to the menu (if available).

Main window

Select appearance of the main window.

Window: Creates an overlapped main window with default size.
Fullscreen: Creates a topmost popup window that occupies the entire screen.
Both: Appearence is determined with a switch: If FULLSCREEN is not #defined, the application runs in a window.
Show FPS in caption: Adds code to show Frames Per Second on regular intervals. (Not available in fullscreen mode)

OpenGL Support

Use OpenGL: Adds code to initialize and maintain an OpenGL RC. If this box is not checked, a plain Win32 application is created.
Sample code: Adds code that renders a simple OpenGL scene (spinning cube).
Double buffering: Creates a double-buffered pixel buffer.
Color depth: Number of color bitplanes in each color buffer.
Z-buffer depth: Bit-depth of the Z-buffer.
Background color: Press the button to select background color for main window.

Notes on the VC++.NET appwizard

In VC++.NET, appwizards are no longer compiled plugins, but rather a collection of scripts and template files, with a HTML-based UI. See Readme.txt for installation instructions.

I took the opportunity to change the object model into something that, IMO, is a bit cleaner. Instead of having one class for the window and one class for the application, there is now one abstract base class, CApp, that takes care of window creation, OpenGL initialization etc. The "meat" of the generated app goes in a derived class that overrides a number of virtual functions of CApp. For example, InitScene(), DrawScene() and KillScene() are virtual.

Other than that, the VC++.NET version of the AppWizard behaves basically the same as the VC++6 version.

History

  • 20 May 2003 - Updated VS.NET download

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Ulf Öhlén

Sweden Sweden
No Biography provided

Comments and Discussions

 
GeneralSimple and elegant - my 5 PinmemberSharjith22-Mar-11 8:32 
GeneralVisual Studio 2008 (9) version? [modified] Pinmemberhain7-Jan-09 6:49 
GeneralglReadPixels() PinmemberJeanFilion12-Aug-07 3:33 
QuestionRe: glReadPixels() PinmemberBilica29-Nov-07 6:02 
AnswerRe: glReadPixels() PinmemberJeanFilion29-Nov-07 8:02 
Questionhow to do real-time image processing using VC++? Pinmemberli zhiyuan25-Jun-07 22:01 
AnswerRe: how to do real-time image processing using VC++? Pinmemberzafersavas8-Jun-08 2:22 
GeneralErrors in script PinmemberBruzak12-Apr-07 4:32 
GeneralStart Maximized Pinmemberrfs671816-Dec-06 14:25 
Questionhow to combine two program?? Pinmembermallie26-Mar-06 19:28 
i have two program that can run..but i can't combine it..
for your information i still studying..
the first program is:
 
#include
#include
 
GLfloat vertices [][3] = {{-0.3, -0.3, 0.3}, {-0.23,0.3,0.3} ,
{0.3,0.3,0.3}, {0.3,-0.3,0.3}, {-0.3,-0.3,-0.3} ,
{-0.3,0.3,-0.3}, {0.3,0.3,-0.3},{0.3,-0.3,-0.3}};
 
GLfloat colors[][3] = {
{1.0,0.0,0.0},{0.0,1.0,1.0},
{1.0,1.0,0.0}, {0.0,1.0,0.0},
{0.0,0.0,1.0}, {1.0,0.0,1.0},
{0.0,0.0,0.0}, {1.0,1.0,1.0}};
 

void polygon (int a, int b, int c, int d)
{
 
glBegin(GL_POLYGON);
glColor3fv(colors[a]);
glTexCoord2f(0.0,0.0);
glVertex3fv(vertices[a]);
 
glColor3fv(colors[b]);
glTexCoord2f(0.0,1.0);
glVertex3fv(vertices[b]);
 
glColor3fv(colors[c]);
glTexCoord2f(1.0,1.0);
glVertex3fv(vertices[c]);
 
glColor3fv(colors[d]);
glTexCoord2f(1.0,0.0);
glVertex3fv(vertices[d]);
glEnd();
}
 
void colorcube()
{
 
polygon(0,3,2,1);
polygon(2,3,7,6);
polygon(3,0,4,7);
polygon(1,2,6,5);
polygon(4,5,6,7);
polygon(5,4,0,1);
}
 
static GLfloat theta[]={0.0,0.0,0.0};
static GLint axis = 2 ;
 
void display (void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(theta[0],1.0,0.0,0.0);
glRotatef(theta[1],0.0,1.0,0.0);
glRotatef(theta[2],0.0,0.0,1.0);
 
colorcube();
glutSwapBuffers();
}
 
void spinCube()
{
theta [axis] += 5.0; //speed for cube
if (theta[axis] > 360.0) theta[axis] -= 360.0;
glutPostRedisplay();
}
 
void mouse (int btn, int state, int x, int y)
{
if(btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
axis = 0;
if (btn == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
axis = 1;
if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
axis = 2;
}
 
void myReshape(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w <= h)
glOrtho(-2.0,2.0,-2.0 * (GLfloat) h /(GLfloat)
w,2.0 * (GLfloat)h / (GLfloat) w,
-10.0,10.0);
 
else
glOrtho(-2.0 * (GLfloat)w /(GLfloat)h,
2.0 * (GLfloat) w / (GLfloat)h,-2.0,2.0,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);
}
 
int main(int argc, char **argv)
{
GLubyte image [64][64][3];
int i,j,r,c;
for (i =0; i<64; i++)
{
for (j=0; j<64; j++)
{
c = (((i&0x8) == 0)^((j&0x8)==0))*255;
image[i][j][0] = (GLubyte) c;
image[i][j][1] = (GLubyte) c;
image[i][j][2] = (GLubyte) c;
}
}
 
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("color cube");
 
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
glutIdleFunc(spinCube);
glutMouseFunc(mouse);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
 
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,64,64,0,GL_RGB,GL_UNSIGNED_BYTE, image);
 
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glClearColor(1.0,0.5,1.0,1.0);
glColor3f(1.0,1.0,1.0);
glutMainLoop();
}
 

and the second program is:
 
/* field.c - by Tom McReynolds, SGI */
 
/* Using the accumulation buffer for depth of field (camera focus blur). */
 
#include
#include
#include
 
const GLdouble FRUSTDIM = 100.f;
const GLdouble FRUSTNEAR = 320.f;
const GLdouble FRUSTFAR = 660.f;
 
/*
** Create a single component texture map
*/
GLfloat *make_texture(int maxs, int maxt)
{
int s, t;
static GLfloat *texture;
 
texture = (GLfloat *)malloc(maxs * maxt * sizeof(GLfloat));
for(t = 0; t < maxt; t++) {
for(s = 0; s < maxs; s++) {
texture[s + maxs * t] = ((s >> 4) & 0x1) ^ ((t >> 4) & 0x1);
}
}
return texture;
}
 
//enum {SPHERE = 1, CONE};
 
void
render(void)
{
/* material properties for objects in scene */
static GLfloat wall_mat[] = {1.f, 1.f, 1.f, 1.f};
 
glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
 
/*
** Note: wall verticies are ordered so they are all front facing
** this lets me do back face culling to speed things up.
*/

glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
 
/* floor */
/* make the floor textured */
glEnable(GL_TEXTURE_2D);
 
/*
** Since we want to turn texturing on for floor only, we have to
** make floor a separate glBegin()/glEnd() sequence. You can't
** turn texturing on and off between begin and end calls
*/
glBegin(GL_QUADS);
glNormal3f(0.f, 1.f, 0.f);
glTexCoord2i(0, 0);
glVertex3f(-100.f, -100.f, -320.f);
glTexCoord2i(1, 0);
glVertex3f( 100.f, -100.f, -320.f);
glTexCoord2i(1, 1);
glVertex3f( 100.f, -100.f, -640.f);
glTexCoord2i(0, 1);
glVertex3f(-100.f, -100.f, -640.f);
glEnd();
 
glDisable(GL_TEXTURE_2D);
 
/* walls */
 
glBegin(GL_QUADS);
/* left wall */
glNormal3f(1.f, 0.f, 0.f);
glVertex3f(-100.f, -100.f, -320.f);
glVertex3f(-100.f, -100.f, -640.f);
glVertex3f(-100.f, 100.f, -640.f);
glVertex3f(-100.f, 100.f, -320.f);
 
/* right wall */
glNormal3f(-1.f, 0.f, 0.f);
glVertex3f( 100.f, -100.f, -320.f);
glVertex3f( 100.f, 100.f, -320.f);
glVertex3f( 100.f, 100.f, -640.f);
glVertex3f( 100.f, -100.f, -640.f);
 
/* ceiling */
glNormal3f(0.f, -1.f, 0.f);
glVertex3f(-100.f, 100.f, -320.f);
glVertex3f(-100.f, 100.f, -640.f);
glVertex3f( 100.f, 100.f, -640.f);
glVertex3f( 100.f, 100.f, -320.f);
 
/* back wall */
glNormal3f(0.f, 0.f, 1.f);
glVertex3f(-100.f, -100.f, -640.f);
glVertex3f( 100.f, -100.f, -640.f);
glVertex3f( 100.f, 100.f, -640.f);
glVertex3f(-100.f, 100.f, -640.f);
glEnd();
 

glPushMatrix();
glTranslatef(-80.f, -60.f, -420.f);
// glCallList(SPHERE);
glPopMatrix();
 

glPushMatrix();
glTranslatef(-20.f, -80.f, -600.f);
// glCallList(CONE);
glPopMatrix();
 
if(glGetError()) /* to catch programming errors; should never happen */
printf("Oops! I screwed up my OpenGL calls somewhere\n");
 
glFlush(); /* high end machines may need this */
}
 
enum {NONE, FIELD};
 
int rendermode = NONE;
 
void
menu(int selection)
{
rendermode = selection;
glutPostRedisplay();
}
 
GLdouble focus = 420.;
 
/* Called when window needs to be redrawn */
void redraw(void)
{
int i, j;
int min, max;
int count;
GLfloat scale, dx, dy;
 
switch(rendermode) {
case NONE:
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-FRUSTDIM, FRUSTDIM, -FRUSTDIM, FRUSTDIM, FRUSTNEAR, FRUSTFAR);
glMatrixMode(GL_MODELVIEW);
render();
break;
case FIELD:
min = -2;
max = -min + 1;
count = -2 * min + 1;
count *= count;
 
scale = 2.f;
 
glClear(GL_ACCUM_BUFFER_BIT);
 
for(j = min; j < max; j++) {
for(i = min; i < max; i++) {
dx = scale * i * FRUSTNEAR/focus;
dy = scale * j * FRUSTNEAR/focus;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-FRUSTDIM + dx,
FRUSTDIM + dx,
-FRUSTDIM + dy,
FRUSTDIM + dy,
FRUSTNEAR,
FRUSTFAR);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(scale * i, scale * j, 0.f);
render();
glAccum(GL_ACCUM, 1.f/count);
}
}
glAccum(GL_RETURN, 1.f);
break;
}
 
glutSwapBuffers();
}
 
/* ARGSUSED1 */
void key(unsigned char key, int x, int y)
{
if(key == '\033')
exit(0);
}
 

const int TEXDIM = 256;
/* Parse arguments, and set up interface between OpenGL and window system */
int
main(int argc, char *argv[])
{
GLfloat *tex;
static GLfloat lightpos[] = {50.f, 50.f, -320.f, 1.f};
static GLfloat sphere_mat[] = {1.f, .5f, 0.f, 1.f};
static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};
GLUquadricObj *sphere, *cone, *base;
 
glutInit(&argc, argv);
glutInitWindowSize(512, 512);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_ACCUM|GLUT_DOUBLE);
(void)glutCreateWindow("depth of field");
glutDisplayFunc(redraw);
glutKeyboardFunc(key);
 
glutCreateMenu(menu);
glutAddMenuEntry("Normal", NONE);
glutAddMenuEntry("Depth of Field", FIELD);
glutAttachMenu(GLUT_RIGHT_BUTTON);
 
/* turn on features */
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
 
/* place light 0 in the right place */
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
 
/* remove back faces to speed things up */
glCullFace(GL_BACK);
 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 
// glNewList(SPHERE, GL_COMPILE);
/* make display lists for sphere and cone; for efficiency */
sphere = gluNewQuadric();
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
gluSphere(sphere, 20.f, 20, 20);
gluDeleteQuadric(sphere);
glEndList();
 
// glNewList(CONE, GL_COMPILE);
cone = gluNewQuadric();
base = gluNewQuadric();
glRotatef(-90.f, 1.f, 0.f, 0.f);
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
gluDisk(base, 0., 20., 20, 1);
gluCylinder(cone, 20., 0., 60., 20, 20);
gluDeleteQuadric(cone);
gluDeleteQuadric(base);
glEndList();
 
/* load pattern for current 2d texture */
tex = make_texture(TEXDIM, TEXDIM);
glTexImage2D(GL_TEXTURE_2D, 0, 1, TEXDIM, TEXDIM, 0, GL_RED, GL_FLOAT, tex);
free(tex);
 
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}
 

please help..thanksBlush | :O
 

QuestionVisual Studio 2005 Pinmemberjpummill23-Nov-05 7:02 
AnswerRe: Visual Studio 2005 Pinmemberbrianpoteat24-Aug-07 10:01 
GeneralAbout coding a simple human face PinsussAnonymous26-Sep-05 8:46 
GeneralI need help on using this for an MDI app Pinmembersardaukar_siet12-Feb-05 12:18 
GeneralGetting an error when trying to start a project PinmemberTheTroll12310-Oct-04 10:49 
GeneralRe: Getting an error when trying to start a project Pinmembergulumulu7-Oct-05 23:07 
QuestionHow to run 2 different(or same) OpenGL objects in one DialogBox? Pinmemberwerter13-May-04 21:11 
GeneralA suggestion. PinmemberSevenCat15-Dec-03 23:49 
Questionhow can i add my own class to application Pinsusswuling1291-Dec-03 14:07 
GeneralAll I get is a Blank form when I select this as a project PinmemberMike_in_Paradise26-May-03 6:12 
GeneralRe: All I get is a Blank form when I select this as a project Pinmemberdpaquc22-Oct-03 5:19 
GeneralRe: All I get is a Blank form when I select this as a project Pinmemberwebbsk24-Nov-03 9:34 
GeneralRe: All I get is a Blank form when I select this as a project PinmemberSevenCat15-Dec-03 23:44 
Generalbug fix with Microsoft Visual Studio .NET 2003 Pinmembermarkthecoder15-May-03 21:01 
GeneralListen to this guy! PinsussAnonymous4-Jul-03 4:33 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web02 | 2.8.140821.2 | Last Updated 20 May 2003
Article Copyright 2001 by Ulf Öhlén
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid