Home Page  All Courses  Computer Science  AP Physics B  Electronics  Astronomy  Summer Session  Sandia Cameras  About
                                                       

OpenGl with Microsoft Windows Example

Note: we wil not start in this detail - included only ot illustrate the added complexity and the required initial lines of code

//see pragma directives discussion in chapter 1 of this manual

#pragma comment(lib, "opengl32.lib")

#pragma comment(lib, "glu32.lib")

#include <windows.h>                            //must include this before GL/gl.h

#include <GL/gl.h>                                //OpenGL header file

#include <GL/glu.h>                              //OpenGL utilities header file

#include <stdio.h>

void

display()

{

    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_TRIANGLES);

    glColor3f(1.0f, 0.0f, 0.0f);

    glVertex2i(0,  1);

    glColor3f(0.0f, 1.0f, 0.0f);

    glVertex2i(-1, -1);

    glColor3f(0.0f, 0.0f, 1.0f);

    glVertex2i(1, -1);

    glEnd();

    glFlush();

}

LONG WINAPI

WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

    static PAINTSTRUCT ps;

 

    switch(uMsg)

     {

     case WM_PAINT:

               display();

               BeginPaint(hWnd, &ps);

               EndPaint(hWnd, &ps);

               return 0;

 

    case WM_SIZE:

               glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));

               PostMessage(hWnd, WM_PAINT, 0, 0);

               return 0;

 

    case WM_CHAR:

            switch (wParam)

            {

            case 27:                                  /* ESC key */

                PostQuitMessage(0);

                break;

            }

            return 0;

 

    case WM_CLOSE:

            PostQuitMessage(0);

            return 0;

    }

 

    return DefWindowProc(hWnd, uMsg, wParam, lParam);

}

 

HWND

CreateOpenGLWindow(char* title, int x, int y, int width, int height, BYTE type, DWORD flags)

{

    int         pf;

    HDC         hDC;

    HWND        hWnd;

    WNDCLASS    wc;

    PIXELFORMATDESCRIPTOR pfd;

    static HINSTANCE hInstance = 0;

 

   //only register the window class once - use hInstance as a flag.

    if (!hInstance)

    {

            hInstance = GetModuleHandle(NULL);

            wc.style         = CS_OWNDC;

            wc.lpfnWndProc   = (WNDPROC)WindowProc;

            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, "RegisterClass() failed:  "

                               "Cannot register window class.", "Error", MB_OK);

                return NULL;

            }

    }

 

    hWnd = CreateWindow("OpenGL", title, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,

                                    x, y, width, height, NULL, NULL, hInstance, NULL);

 

    if (hWnd == NULL)

    {

            MessageBox(NULL, "CreateWindow() failed:  Cannot create a window.", "Error", MB_OK);

            return NULL;

    }

 

    hDC = GetDC(hWnd);

 

    //there is no guarantee that the contents of the stack that become the pfd are zeroed, therefore _make sure_ to clear these bits.

    memset(&pfd, 0, sizeof(pfd));

    pfd.nSize        = sizeof(pfd);

    pfd.nVersion     = 1;

    pfd.dwFlags      = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | flags;

    pfd.iPixelType   = type;

    pfd.cColorBits   = 32;

 

    pf = ChoosePixelFormat(hDC, &pfd);

    if (pf == 0)

     {

            MessageBox(NULL, "ChoosePixelFormat() failed:  "

                           "Cannot find a suitable pixel format.", "Error", MB_OK);

            return 0;

    }

 

    if (SetPixelFormat(hDC, pf, &pfd) == FALSE)

            {

               MessageBox(NULL, "SetPixelFormat() failed:  " "Cannot set format specified.", "Error", MB_OK);

            return 0;

    }

 

    DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);

    return hWnd;

}   

 

int APIENTRY

WinMain(HINSTANCE hCurrentInst, HINSTANCE hPreviousInst,

            LPSTR lpszCmdLine, int nCmdShow)

{

    HDC hDC;                                      //device context

    HGLRC hRC;                                 //opengl context

    HWND  hWnd;                               //window

    MSG   msg;                                   //message

 

    hWnd = CreateOpenGLWindow("minimal", 0, 0, 256, 256, PFD_TYPE_RGBA, 0);

    if (hWnd == NULL)

            exit(1);

 

    hDC = GetDC(hWnd);

    hRC = wglCreateContext(hDC);

    wglMakeCurrent(hDC, hRC);

 

    ShowWindow(hWnd, nCmdShow);

 

    while(GetMessage(&msg, hWnd, 0, 0))

            {

               TranslateMessage(&msg);

               DispatchMessage(&msg);

    }

    wglMakeCurrent(NULL, NULL);

    wglDeleteContext(hRC);

    DestroyWindow(hWnd);

    return msg.wParam;

}