Hello,

I am an ultra-novice windows programmer, so I'm sorry if this seems like a stupid question. Why am I getting an error when I type the code that follows?

If you don't feel like reading the code, all I did (besides creating, registering, etc.. the window and creating the window function, both of which work) was include a header file "Clock.h" containing a class definition; in the main program, all I did was declare one object in the window function, and I got this error:

unresolved external symbol: "public: __thiscall Clock::Clock(void)" (??0Clock@@QAE@XZ)

It doesn't matter where in the program I declare the object, I get this error message (after linking). I can't see why.

Many, MANY thanks in advance. You guys are a great help.

--Bill

Code:
/* Process Mouse Messages. */

#include <windows.h>
#include <string.h>
#include <stdio.h>
#include "Clock.h"

LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);

char szWinName[] = "MyWin"; /* name of window class */

char str[255] = ""; /* holds output string */

MMRESULT begin = timeBeginPeriod(1);
MMRESULT end = timeEndPeriod(2);

DWORD start=timeGetTime();

LONG xI=0;

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, 
                   LPSTR lpszArgs, int nWinMode)
{
  HWND hwnd;
  MSG msg;
  WNDCLASSEX wcl;
  
  /* Define a window class. */
  wcl.cbSize = sizeof(WNDCLASSEX); 

  wcl.hInstance = hThisInst; /* handle to this instance */
  wcl.lpszClassName = szWinName; /* window class name */
  wcl.lpfnWndProc = WindowFunc; /* window function */
  wcl.style = 0; /* default style */

  wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* standard icon */
  wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO); /* small icon */
  wcl.hCursor = LoadCursor(NULL, IDC_ARROW); /* cursor style */

  wcl.lpszMenuName = NULL; /* no main menu */
  wcl.cbClsExtra = 0; /* no extra */
  wcl.cbWndExtra = 0; /* information needed */

  /* Make the window white. */
  wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 

  /* Register the window class. */
  if(!RegisterClassEx(&wcl)) return 0;

  /* Now that a window class has been registered, a window
     can be created. */
  hwnd = CreateWindow(
    szWinName, /* name of window class */
    "Processing Mouse Messages", /* title */
    WS_OVERLAPPEDWINDOW, /* window style - normal */
    CW_USEDEFAULT, /* X coordinate - let Windows decide */
    CW_USEDEFAULT, /* Y coordinate - let Windows decide */
    CW_USEDEFAULT, /* width - let Windows decide */
    CW_USEDEFAULT, /* height - let Windows decide */
    HWND_DESKTOP, /* no parent window */
    NULL, /* no menu */
    hThisInst, /* handle of this instance of the program */
    NULL /* no additional arguments */
  );

  /* Display the window. */
  ShowWindow(hwnd, nWinMode);
  UpdateWindow(hwnd);

  /* Create the message loop. */
  while(GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg); /* translate keyboard messages */
    DispatchMessage(&msg); /* return control to Windows 98 */
  }
  return msg.wParam;
}

/* This function is called by Windows 98 and is passed 
   messages from the message queue.
*/
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,
                            WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  Clock timer;
  
  switch(message) {
    case WM_RBUTTONDOWN: /* process right button */
      hdc = GetDC(hwnd); /* get DC */
      sprintf(str, "Right button is down at %d, %d",
              LOWORD(lParam), HIWORD(lParam));
      TextOut(hdc, LOWORD(lParam), HIWORD(lParam),
              str, strlen(str));
      ReleaseDC(hwnd, hdc); /* Release DC */
      break;
    case WM_LBUTTONDOWN: /* process left button */
      hdc = GetDC(hwnd); /* get DC */
	  TextOut(hdc, 10, 50, "Angular velocity is                                   ", 54);
	  sprintf(str, "Time passed is %d pixels/sec", timeGetTime()-start);
	  TextOut(hdc, 10, 50, str, strlen(str));
      ReleaseDC(hwnd, hdc); /* Release DC */
      break;
	case WM_MOUSEMOVE:
	  hdc = GetDC(hwnd);
  	  TextOut(hdc, 10, 50, "                                                 ", 49);
	  sprintf(str, "Time passed is %d milliseconds", timeGetTime()-start);
	  TextOut(hdc, 10, 50, str, strlen(str));
	  TextOut(hdc, 10, 10, "Mouse coordinates are at                                   ", 59);
	  sprintf(str, "Mouse coordinates are at (%d, %d)", LOWORD(lParam), HIWORD(lParam));
	  TextOut(hdc, 10, 10, str, strlen(str));
	  ReleaseDC(hwnd,hdc);
	  break;
    case WM_DESTROY: /* terminate the program */
      PostQuitMessage(0);
      break;
    default:
       /* Let Windows 98 process any messages not specified in
         the preceding switch statement. */
      return DefWindowProc(hwnd, message, wParam, lParam);
  }
  return 0;
}

/* Clock class definition (FYI)
class Clock
{
	private:
		float timestarted;
	public:
		Clock();
		VOID reset();
		VOID wait(const float &tsec);
		float time();
};

VOID Clock::reset()
{
	timestarted=timeGetTime();
	return;
}

float Clock::time()
{
	return timeGetTime()-timestarted;
}

VOID wait(const float &tsec)
{
	DWORD beginning = timeGetTime();
	while(beginning + tsec*1000 > timeGetTime())
	{ /* wait */}
	return;
} */