Getting started with OpenGL in C++

Started by
5 comments, last by Kambiz 17 years, 6 months ago
So, I recently decided to open up Beginning OpenGL Game Programming yesterday in order to learn OpenGL. After reading the first few dozen pages, I tried to compile the first sample program from the book using Visual C++ 2005. However, I got a few compile errors. I have everything linked correctly, and since I copied-and-pasted the code, there shouldn't be any errors in the code.
#define WIN32_LEAN_AND_MEAN
#define WIN32_EXTRA_LEAN

#include "stdafx.h"
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

#include "CGfxOpenGL.h"

bool exiting = false;
long windowWidth = 800;
long windowHeight = 600;
long windowBits = 32;
bool fullscreen = false;
HDC hDC;

CGfxOpenGL *g_glRender = NULL;

void SetupPixelFormat(HDC hDC)
{
    int pixelFormat;

    PIXELFORMATDESCRIPTOR pfd =
    {   
        sizeof(PIXELFORMATDESCRIPTOR),  // size
            1,                          // version
            PFD_SUPPORT_OPENGL |        // OpenGL window
            PFD_DRAW_TO_WINDOW |        // render to window
            PFD_DOUBLEBUFFER,           // support double-buffering
            PFD_TYPE_RGBA,              // color type
            32,                         // prefered color depth
            0, 0, 0, 0, 0, 0,           // color bits (ignored)
            0,                          // no alpha buffer
            0,                          // alpha bits (ignored)
            0,                          // no accumulation buffer
            0, 0, 0, 0,                 // accum bits (ignored)
            16,                         // depth buffer
            0,                          // no stencil buffer
            0,                          // no auxiliary buffers
            PFD_MAIN_PLANE,             // main layer
            0,                          // reserved
            0, 0, 0,                    // no layer, visible, damage masks
    };

    pixelFormat = ChoosePixelFormat(hDC, &pfd);
    SetPixelFormat(hDC, pixelFormat, &pfd);
}

LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HDC hDC;
    static HGLRC hRC;
    int height, width;

    // dispatch messages
    switch (uMsg)
    {   
    case WM_CREATE:         // window creation
        hDC = GetDC(hWnd);
        SetupPixelFormat(hDC);
        //SetupPalette();
        hRC = wglCreateContext(hDC);
        wglMakeCurrent(hDC, hRC);
        break;

    case WM_DESTROY:            // window destroy
    case WM_QUIT:
    case WM_CLOSE:                  // windows is closing

        // deselect rendering context and delete it
        wglMakeCurrent(hDC, NULL);
        wglDeleteContext(hRC);

        // send WM_QUIT to message queue
        PostQuitMessage(0);
        break;

    case WM_SIZE:
        height = HIWORD(lParam);        // retrieve width and height
        width = LOWORD(lParam);

        g_glRender->SetupProjection(width, height);

        break;

    case WM_ACTIVATEAPP:        // activate app
        break;

    case WM_PAINT:              // paint
        PAINTSTRUCT ps;
        BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
        break;

    case WM_LBUTTONDOWN:        // left mouse button
        break;

    case WM_RBUTTONDOWN:        // right mouse button
        break;

    case WM_MOUSEMOVE:          // mouse movement
        break;

    case WM_LBUTTONUP:          // left button release
        break;

    case WM_RBUTTONUP:          // right button release
        break;

    case WM_KEYUP:
        break;

    case WM_KEYDOWN:
        int fwKeys;
        LPARAM keyData;
        fwKeys = (int)wParam;    // virtual-key code
        keyData = lParam;          // key data

        switch(fwKeys)
        {
        case VK_ESCAPE:
            PostQuitMessage(0);
            break;
        default:
            break;
        }

        break;

    default:
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    WNDCLASSEX windowClass;     // window class
    HWND       hwnd;            // window handle
    MSG        msg;             // message
    DWORD      dwExstyle;       // Window Extended style
    DWORD      dwstyle;         // Window style
    RECT       windowRect;

    g_glRender = new CGfxOpenGL;

    windowRect.left=(long)0;                        // Set Left Value To 0
    windowRect.right=(long)windowWidth; // Set Right Value To Requested Width
    windowRect.top=(long)0;                         // Set Top Value To 0
    windowRect.bottom=(long)windowHeight;   // Set Bottom Value To Requested Height

    // fill out the window class structure
    windowClass.cbSize          = sizeof(WNDCLASSEX);
    windowClass.style           = CS_HREDRAW | CS_VREDRAW;
    windowClass.lpfnWndProc     = MainWindowProc;
    windowClass.cbClsExtra      = 0;
    windowClass.cbWndExtra      = 0;
    windowClass.hInstance       = hInstance;
    windowClass.hIcon           = LoadIcon(NULL, IDI_APPLICATION);  // default icon
    windowClass.hCursor         = LoadCursor(NULL, IDC_ARROW);      // default arrow
    windowClass.hbrBackground   = NULL;                             // don't need background
    windowClass.lpszMenuName    = NULL;                             // no menu
    windowClass.lpszClassName   = "GLClass";
    windowClass.hIconSm         = LoadIcon(NULL, IDI_WINLOGO);      // windows logo small icon

    // register the windows class
    if (!RegisterClassEx(&windowClass))
        return 0;

    if (fullscreen)                             // fullscreen?
    {
        DEVMODE dmScreenSettings;                   // device mode
        memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
        dmScreenSettings.dmSize = sizeof(dmScreenSettings);
        dmScreenSettings.dmPelsWidth = windowWidth;         // screen width
        dmScreenSettings.dmPelsHeight = windowHeight;           // screen height
        dmScreenSettings.dmBitsPerPel = windowBits;             // bits per pixel
        dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

        //
        if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
        {
            // setting display mode failed, switch to windowed
            MessageBox(NULL, "Display mode failed", NULL, MB_OK);
            fullscreen = FALSE;
        }
    }

    if (fullscreen)                             // Are We Still In Fullscreen Mode?
    {
        dwExstyle=WS_EX_APPWINDOW;                  // Window Extended style
        dwstyle=WS_POPUP;                       // Windows style
        ShowCursor(FALSE);                      // Hide Mouse Pointer
    }
    else
    {
        dwExstyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;   // Window Extended style
        dwstyle=WS_OVERLAPPEDWINDOW;                    // Windows style
    }

    AdjustWindowRectEx(&windowRect, dwstyle, FALSE, dwExstyle);     // Adjust Window To True Requested Size

    // class registered, so now create our window
    hwnd = CreateWindowEx(NULL,                                 // extended style
        "GLClass",                          // class name
        "BOGLGP - Chapter 2 - OpenGL Application",      // app name
        dwstyle | WS_CLIPCHILDREN |
        WS_CLIPSIBLINGS,
        0, 0,                               // x,y coordinate
        windowRect.right - windowRect.left,
        windowRect.bottom - windowRect.top, // width, height
        NULL,                               // handle to parent
        NULL,                               // handle to menu
        hInstance,                          // application instance
        NULL);                              // no extra params

    hDC = GetDC(hwnd);

    // check if window creation failed (hwnd would equal NULL)
    if (!hwnd)
        return 0;

    ShowWindow(hwnd, SW_SHOW);          // display the window
    UpdateWindow(hwnd);                 // update the window

    g_glRender->Init();

    while (!exiting)
    {
        g_glRender->Prepare(0.0f);
        g_glRender->Render();
        SwapBuffers(hDC);

        while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
        {
            if (!GetMessage (&msg, NULL, 0, 0))
            {
                exiting = true;
                break;
            }

            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    }

    delete g_glRender;

    if (fullscreen)
    {
        ChangeDisplaySettings(NULL,0);          // If So Switch Back To The Desktop
        ShowCursor(TRUE);                       // Show Mouse Pointer
    }

    return (int)msg.wParam;
}

------ Build started: Project: test2, Configuration: Debug Win32 ------ Compiling... test2.cpp c:\documents and settings\jennifer\my documents\visual studio 2005\projects\test2\test2\test2.cpp(166) : error C2440: '=' : cannot convert from 'const char [8]' to 'LPCWSTR' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast c:\documents and settings\jennifer\my documents\visual studio 2005\projects\test2\test2\test2.cpp(187) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [20]' to 'LPCWSTR' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast c:\documents and settings\jennifer\my documents\visual studio 2005\projects\test2\test2\test2.cpp(218) : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [8]' to 'LPCWSTR' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast Build log was saved at "file://c:\Documents and Settings\Jennifer\My Documents\Visual Studio 2005\Projects\test2\test2\Debug\BuildLog.htm" test2 - 3 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Help is appreciated. [Edited by - Mr Pastry on October 19, 2006 1:43:07 PM]
Advertisement
Project -> Properties... -> Character Set : change to "Use Multi-Byte Character Set"
Compile again...

[and please use source tags]
Quote:Original post by Kambiz
Project -> Properties... -> Character Set : change to "Use Multi-Byte Character Set"
Compile again...

[and please use source tags]


I don't see "Character Set" anywhere.


Alternatively you can add a L before your string :
MessageBox(NULL, L"Display mode failed", NULL, MB_OK);
------ Build started: Project: test3, Configuration: Debug Win32 ------
Compiling...
test3.cpp
Compiling manifest to resources...
Linking...
test3.obj : error LNK2019: unresolved external symbol __imp__SetPixelFormat@12 referenced in function "void __cdecl SetupPixelFormat(struct HDC__ *)" (?SetupPixelFormat@@YAXPAUHDC__@@@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__ChoosePixelFormat@8 referenced in function "void __cdecl SetupPixelFormat(struct HDC__ *)" (?SetupPixelFormat@@YAXPAUHDC__@@@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__DefWindowProcA@16 referenced in function "long __stdcall MainWindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainWindowProc@@YGJPAUHWND__@@IIJ@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__EndPaint@8 referenced in function "long __stdcall MainWindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainWindowProc@@YGJPAUHWND__@@IIJ@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__BeginPaint@8 referenced in function "long __stdcall MainWindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainWindowProc@@YGJPAUHWND__@@IIJ@Z)
test3.obj : error LNK2019: unresolved external symbol "public: void __thiscall CGfxOpenGL::SetupProjection(int,int)" (?SetupProjection@CGfxOpenGL@@QAEXHH@Z) referenced in function "long __stdcall MainWindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainWindowProc@@YGJPAUHWND__@@IIJ@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__PostQuitMessage@4 referenced in function "long __stdcall MainWindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainWindowProc@@YGJPAUHWND__@@IIJ@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__wglDeleteContext@4 referenced in function "long __stdcall MainWindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainWindowProc@@YGJPAUHWND__@@IIJ@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__wglMakeCurrent@8 referenced in function "long __stdcall MainWindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainWindowProc@@YGJPAUHWND__@@IIJ@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__wglCreateContext@4 referenced in function "long __stdcall MainWindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainWindowProc@@YGJPAUHWND__@@IIJ@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__GetDC@4 referenced in function "long __stdcall MainWindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MainWindowProc@@YGJPAUHWND__@@IIJ@Z)
test3.obj : error LNK2019: unresolved external symbol __imp__DispatchMessageA@4 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__TranslateMessage@4 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__GetMessageA@16 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__PeekMessageA@20 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__SwapBuffers@4 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol "public: void __thiscall CGfxOpenGL::Render(void)" (?Render@CGfxOpenGL@@QAEXXZ) referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol "public: void __thiscall CGfxOpenGL::Prepare(float)" (?Prepare@CGfxOpenGL@@QAEXM@Z) referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol "public: bool __thiscall CGfxOpenGL::Init(void)" (?Init@CGfxOpenGL@@QAE_NXZ) referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__UpdateWindow@4 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__ShowWindow@8 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__CreateWindowExA@48 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__AdjustWindowRectEx@16 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__ShowCursor@4 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__MessageBoxA@16 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__ChangeDisplaySettingsA@8 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__RegisterClassExA@4 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__LoadCursorA@8 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol __imp__LoadIconA@8 referenced in function _WinMain@16
test3.obj : error LNK2019: unresolved external symbol "public: __thiscall CGfxOpenGL::CGfxOpenGL(void)" (??0CGfxOpenGL@@QAE@XZ) referenced in function _WinMain@16
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
C:\Documents and Settings\Jennifer\My Documents\Visual Studio 2005\Projects\test3\Debug\test3.exe : fatal error LNK1120: 31 unresolved externals
Build log was saved at "file://c:\Documents and Settings\Jennifer\My Documents\Visual Studio 2005\Projects\test3\test3\Debug\BuildLog.htm"
test3 - 32 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
If you're having trouble linking, then it's because you haven't included your libraries. You can do this under your project options, or with a pragma directive. Are you familiar with those?
We''re sorry, but you don''t have the clearance to read this post. Please exit your browser at this time. (Code 23)
First of all I think your project is not a Win32 Application project because of linking errors like this:
unresolved external symbol __imp__CreateWindowExA@48 referenced in function _WinMain@16

To fix this you have to link to the User32.lib library but in a Win32 project this is done automatically so create a new project : File -> New -> Project... -> VC++ -> Win32 -> Win32 Project , Click next in the Wizard Then choose “Windows application”, check Empty project and click on Finish. After that copy your files to the project directory and add them to your project.
(Right click on your project name in the Solution Explorer -> Add.. -> Existing Items...)

After that add this line to your source (to the fist line for example):
#pragma comment(lib,"OpenGL32.lib")

Compile...

This topic is closed to new replies.

Advertisement