win32 opengl example - 01

http://www.gamedev.net/page/resources/_/technical/opengl/example-of-the-minimal-win32-opengl-program-r540

 

Notes:  This example isn't Double Buffer,

Therefore in WM_PAINT

 display();
 BeginPaint(hWnd, &ps); 

 EndPaint(hWnd, &ps);

is ok.

 

 

if enable Double Buffer,

followings codes are ok.

 

HDC hDC;     // global

 

   // glFlush();
  SwapBuffers(hDC);


 BeginPaint(hWnd, &ps); 

 display();

 EndPaint(hWnd, &ps);

 

pfd.dwFlags      = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | flags;

 


/* An example of the minimal Win32 & OpenGL program.  It only works in
   16 bit color modes or higher (since it doesn't create a
   palette). */


#include    /* must include this before GL/gl.h */
#include    /* OpenGL header file */
#include    /* OpenGL utilities header file */
#include

// HDC hDC;     

void
display()
{
    /* rotate a triangle around */
    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();
 // SwapBuffers(hDC);
}


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);

    ReleaseDC(hWnd, hDC);

    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);
    ReleaseDC(hWnd, hDC);
    wglDeleteContext(hRC);
    DestroyWindow(hWnd);

    return msg.wParam;
}

 

你可能感兴趣的:(OS/Win,Graphics,Image/OpenGL)