0
votes

my code still returns a error on line 324 with error C2065: 'WndProc': undeclared identifier. I just start learn with visual studio but i have no idea how to fix this... any idea ?? I use this tutorial http://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/

here is my code with error line :

     BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
    GLuint      PixelFormat;            // Holds The Results After Searching For A Match
    WNDCLASS    wc;                     // Windows Class Structure
    DWORD       dwExStyle;              // Window Extended Style
    DWORD       dwStyle;                // Window Style
    RECT        WindowRect;             // Grabs Rectangle Upper Left / Lower Right Values
    WindowRect.left = (long)0;          // Set Left Value To 0
    WindowRect.right = (long)width;     // Set Right Value To Requested Width
    WindowRect.top = (long)0;               // Set Top Value To 0
    WindowRect.bottom = (long)height;       // Set Bottom Value To Requested Height

    fullscreen = fullscreenflag;            // Set The Global Fullscreen Flag

    hInstance = GetModuleHandle(NULL);              // Grab An Instance For Our Window
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;  // Redraw On Size, And Own DC For Window.
    wc.lpfnWndProc = (WNDPROC)WndProc;  //ERROR LINE 
    wc.cbClsExtra = 0;                                  // No Extra Window Data
    wc.cbWndExtra = 0;                                  // No Extra Window Data
    wc.hInstance = hInstance;                           // Set The Instance
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);         // Load The Default Icon
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);           // Load The Arrow Pointer
    wc.hbrBackground = NULL;                                    // No Background Required For GL
    wc.lpszMenuName = NULL;                                 // We Don't Want A Menu
    wc.lpszClassName = "OpenGL";
                        // Set The Class Name

    if (!RegisterClass(&wc))                                    // Attempt To Register The Window Class
    {
        MessageBox(NULL, "Failed To Register The Window Class.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;                                           // Return FALSE
    }

    if (fullscreen)                                             // Attempt Fullscreen Mode?
    {
        DEVMODE dmScreenSettings;                               // Device Mode
        memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared
        dmScreenSettings.dmSize = sizeof(dmScreenSettings);     // Size Of The Devmode Structure
        dmScreenSettings.dmPelsWidth = width;               // Selected Screen Width
        dmScreenSettings.dmPelsHeight = height;             // Selected Screen Height
        dmScreenSettings.dmBitsPerPel = bits;                   // Selected Bits Per Pixel
        dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;

        // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
        if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
        {
            // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
            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;     // Windowed Mode Selected.  Fullscreen = FALSE
            }
            else
            {
                // Pop Up A Message Box Letting User Know The Program Is Closing.
                MessageBox(NULL, "Program Will Now Close.", "ERROR", MB_OK | MB_ICONSTOP);
                return FALSE;                                   // Return 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_CAPTION;                           // Windows Style
    }

    AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);     // Adjust Window To True Requested Size

                                                                    // Create The Window
    if (!(hWnd = CreateWindowEx(dwExStyle,                          // Extended Style For The Window
        "OpenGL",                           // Class Name
        title,                              // Window Title
        dwStyle |                           // Defined Window Style
        WS_CLIPSIBLINGS |                   // Required Window Style
        WS_CLIPCHILDREN,                    // Required Window Style
        0, 0,                               // Window Position
        WindowRect.right - WindowRect.left, // Calculate Window Width
        WindowRect.bottom - WindowRect.top, // Calculate Window Height
        NULL,                               // No Parent Window
        NULL,                               // No Menu
        hInstance,                          // Instance
        NULL)))                             // Dont Pass Anything To WM_CREATE
    {
        KillGLWindow();                             // Reset The Display
        MessageBox(NULL, "Window Creation Error.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;                               // Return FALSE
    }


    static  PIXELFORMATDESCRIPTOR pfd =             // pfd Tells Windows How We Want Things To Be
    {
        sizeof(PIXELFORMATDESCRIPTOR),              // Size Of This Pixel Format Descriptor
        1,                                          // Version Number
        PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
        PFD_SUPPORT_OPENGL |                        // Format Must Support OpenGL
        PFD_DOUBLEBUFFER,                           // Must Support Double Buffering
        PFD_TYPE_RGBA,                              // Request An RGBA Format
        24,                 // Select Our Color Depth
        0, 0, 0, 0, 0, 0,                           // Color Bits Ignored
        0,                                          // No Alpha Buffer
        0,                                          // Shift Bit Ignored
        0,                                          // No Accumulation Buffer
        0, 0, 0, 0,                                 // Accumulation Bits Ignored
        16,                                         // 16Bit Z-Buffer (Depth Buffer)  
        0,                                          // No Stencil Buffer
        0,                                          // No Auxiliary Buffer
        PFD_MAIN_PLANE,                             // Main Drawing Layer
        0,                                          // Reserved
        0, 0, 0                                     // Layer Masks Ignored
    };
    //pfd.cColorBits = bits;  // Select Our Color Depth

    if (!(hDC = GetDC(hWnd)))                           // Did We Get A Device Context?
    {
        KillGLWindow();                             // Reset The Display
        MessageBox(NULL, "Can't Create A GL Device Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;                               // Return FALSE
    }

    if (!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))  // Did Windows Find A Matching Pixel Format?
    {
        KillGLWindow();                             // Reset The Display
        MessageBox(NULL, "Can't Find A Suitable PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;                               // Return FALSE
    }

    if (!SetPixelFormat(hDC, PixelFormat, &pfd))        // Are We Able To Set The Pixel Format?
    {
        KillGLWindow();                             // Reset The Display
        MessageBox(NULL, "Can't Set The PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;                               // Return FALSE
    }

    if (!(hRC = wglCreateContext(hDC)))             // Are We Able To Get A Rendering Context?
    {
        KillGLWindow();                             // Reset The Display
        MessageBox(NULL, "Can't Create A GL Rendering Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;                               // Return FALSE
    }

    if (!wglMakeCurrent(hDC, hRC))                  // Try To Activate The Rendering Context
    {
        KillGLWindow();                             // Reset The Display
        MessageBox(NULL, "Can't Activate The GL Rendering Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;                               // Return FALSE
    }

    ShowWindow(hWnd, SW_SHOW);                      // Show The Window
    SetForegroundWindow(hWnd);                      // Slightly Higher Priority
    SetFocus(hWnd);                                 // Sets Keyboard Focus To The Window
    ReSizeGLScene(width, height);                   // Set Up Our Perspective GL Screen

    if (!InitGL())                                  // Initialize Our Newly Created GL Window
    {
        KillGLWindow();                             // Reset The Display
        MessageBox(NULL, "Initialization Failed.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;                               // Return FALSE
    }

    return TRUE;                                    // Success
}

LRESULT CALLBACK WndProc(HWND   hWnd,           
    UINT    uMsg,           
    WPARAM  wParam,         
    LPARAM  lParam)         
{
    switch (uMsg)                                   // Check For Windows Messages
    {
    case WM_ACTIVATE:                           // Watch For Window Activate Message
    {
        if (!HIWORD(wParam))                    // Check Minimization State
        {
            active = TRUE;                      // Program Is Active
        }
        else                                    // Otherwise
        {
            active = FALSE;                     // Program Is No Longer Active
        }

        return 0;                               // Return To The Message Loop
    }

    case WM_SYSCOMMAND:                         // Intercept System Commands
    {
        switch (wParam)                         // Check System Calls
        {
        case SC_SCREENSAVE:                 // Screensaver Trying To Start?
        case SC_MONITORPOWER:               // Monitor Trying To Enter Powersave?
            return 0;                           // Prevent From Happening
        }
        break;                                  // Exit
    }

    case WM_CLOSE:                              // Did We Receive A Close Message?
    {
        PostQuitMessage(0);                     // Send A Quit Message
        return 0;                               // Jump Back
    }

    case WM_KEYDOWN:                            // Is A Key Being Held Down?
    {
        keys[wParam] = TRUE;                    // If So, Mark It As TRUE
        return 0;                               // Jump Back
    }

    case WM_KEYUP:                              // Has A Key Been Released?
    {  
        keys[wParam] = FALSE;                   // If So, Mark It As FALSE
        return 0;                               // Jump Back
    }
    case WM_MOUSEMOVE:
    {
        float mx, my;
        //int fwkey;
        float x, y;

        mx = LOWORD(lParam);
        my = HIWORD(lParam);

        if (wParam == MK_LBUTTON)
        {
            x = mx / 320;
            y = my / 240;
            x = x*FIREX;
            y = y*FIREY;
            Bfire[(int)x][(int)y] = 255;
        }

        if (wParam == MK_RBUTTON)
        {
            x = mx / 320;
            y = my / 240;
            x = x*FIREX;
            y = y*FIREY;
            Bfire[(int)x][(int)y] = 0;
        }

        return 0;
    }
    case WM_SIZE:                               // Resize The OpenGL Window
    {
        ReSizeGLScene(LOWORD(lParam), HIWORD(lParam));  // LoWord=Width, HiWord=Height
        return 0;                               // Jump Back
    }
    }

    // Pass All Unhandled Messages To DefWindowProc
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

and when irun the program it do this enter image description here

1
have you declared WndProc? based on the snippet provided I can't really tellAlexander Holman
@AlexanderHolman yes ihave.. declaration for WndProc i use LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);Simona Smiley Čisarova
Declaration is not enough you need the entire definition of the functionMihayl

1 Answers

0
votes

You need to declare the WndProc before using it in CreateGLWindow like this:

LRESULT CALLBACK WndProc(HWND   hWnd,           
UINT    uMsg,           
WPARAM  wParam,         
LPARAM  lParam);

OLD ANSWER: You need a closing } after the line ending with "OpenGL" there is also somo more code missing. You need at leadt return. Look again in your tutorial.