title: undeclared identifier in visual studio 2015 c++
body: <blockquote>
    <p>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
    <a href="http://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/" rel="nofollow noreferrer">http://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/</a></p>
    
    <p>here is my code with error line : </p>
  </blockquote>
  
  <pre><code>     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(&amp;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(&amp;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(&amp;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(&amp;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, &amp;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, &amp;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);
  }
  </code></pre>
  
  <p>and when irun the program it do this
      <a href="https://i.stack.imgur.com/1jlV8.png" rel="nofollow noreferrer">enter image description here</a></p>