Jump to content
  • Advertisement
Sign in to follow this  

member ScreenSaverProc

This topic is 3772 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Is it possible to have the ScreenSaverProc as a member function. I have it declared static as I would have a WndProc member function would be, but it seems i need to tell scrnsav.lib where to get the screensaver proc as well as the other 2 important functions. i know with WndProc you have the WNDCLASSEX point to the procedure, is there a way i can point scrnsave.h or scrnsave.lib to the correct functions? here are my errors as im sure you know them
1>ScrnSavw.lib(scrnsave.obj) : error LNK2019: unresolved external symbol _ScreenSaverProcW@16 referenced in function _RealScreenSaverProc@16
1>ScrnSavw.lib(scrnsave.obj) : error LNK2019: unresolved external symbol _ScreenSaverConfigureDialog@16 referenced in function _DoConfigBox@4
1>ScrnSavw.lib(scrnsave.obj) : error LNK2019: unresolved external symbol _RegisterDialogClasses@4 referenced in function _DoConfigBox@4

heres my code
#include <windows.h>
#include <scrnsave.h>
#include <commctrl.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>

//for application description, you need to create a string table and put int "IDS_DESCRIPTION=1" then the description
//for application icon, set ID of icon to ID_APP
//for dialog, set its id to "DLG_SCRNSAVECONFIGURE=2003"
#include "resource.h"

// Include these libraries
#pragma comment(lib, "OpenGL32.lib")
#pragma comment(lib, "GLu32.lib")
#pragma comment(lib, "GLaux.lib")

#ifdef UNICODE
#pragma comment(lib, "ScrnSavw.lib")
#pragma comment(lib, "ScrnSave.lib")

#pragma comment(lib, "comctl32.lib")

#define TIMER 1

class GLScreenSaver
	GLScreenSaver() {}
	~GLScreenSaver() {}

	//required screensaver functions
	static LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
	static BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
	static BOOL WINAPI RegisterDialogClasses(HANDLE hInst);
	//opengl functions
	static void InitGL(HWND hWnd);
	static void CloseGL(HWND hWnd);

	//window dimensions
	static int windowWidth;
	static int windowHeight;

	//window variables
	static HDC hDC;
	static HGLRC hRC;

int GLScreenSaver::windowWidth = 0;
int GLScreenSaver::windowHeight = 0;
HDC GLScreenSaver::hDC = NULL;
HGLRC GLScreenSaver::hRC = NULL;

void GLScreenSaver::InitGL(HWND hWnd)
		1,                     // nVersion should be set to 1
		PFD_DRAW_TO_WINDOW |   // buffer can draw to window
		PFD_SUPPORT_OPENGL |   // buffer supports OpenGL drawing
		PFD_DOUBLEBUFFER,      // buffer is double buffered
		PFD_TYPE_RGBA,         // rgba pixels
		24,                    // 24-bit color depth
		0, 0, 0, 0, 0, 0,      // look up rest at MSDN, color bits ignored
		0,                     // no alpha buffer
		0,                     // shift bit ignored
		0,                     // no accumulation buffer
		0, 0, 0, 0,            // accumulation bits
		16,                    // 16 bit z buffer
		0,                     // no stencil buffer
		0,                     // no auxiliary buffer
		PFD_MAIN_PLANE,        // main drawing layer
		0,                     // reserved
		0, 0, 0                // layer mask ignored

	GLScreenSaver::hDC = GetDC( hWnd );
	int i = ChoosePixelFormat( GLScreenSaver::hDC, &pfd ); 
	SetPixelFormat( GLScreenSaver::hDC, i, &pfd );

	hRC = wglCreateContext( GLScreenSaver::hDC );
	wglMakeCurrent( GLScreenSaver::hDC, GLScreenSaver::hRC );

void GLScreenSaver::CloseGL(HWND hWnd)
	wglMakeCurrent( NULL, NULL );
	wglDeleteContext( GLScreenSaver::hRC );
	ReleaseDC( hWnd, GLScreenSaver::hDC );

// Screensaver procedure...first when window is created: 
// 1) get users window resolution 
// 2) call a function that sets up OpenGL  
// 3) Setup a TIMER that will be used to drive animations

// Screen Saver Procedure
LRESULT WINAPI GLScreenSaver::ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
	switch (message) 
		case WM_CREATE:
			RECT rect;

			// get window dimensions
			GetClientRect(hWnd, &rect);
			GLScreenSaver::windowWidth = rect.right;		
			GLScreenSaver::windowHeight = rect.bottom;
			//get configuration from registry if applicable

			//set up OpenGL


			//create a timer that ticks every 10 milliseconds
			SetTimer(hWnd, TIMER, 10, NULL); 
		case WM_DESTROY:
			KillTimer(hWnd, TIMER);
			//delete any objects created during animation
			//and close down OpenGL nicely


		case WM_TIMER:
			//call some function to advance your animation		

	//let the screensaver library take care of any
	//other messages

	return DefScreenSaverProc(hWnd, message, wParam, lParam);

//for the dialog when user hits settings
BOOL WINAPI GLScreenSaver::ScreenSaverConfigureDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
      // Dialog message handling
      case WM_COMMAND:
                  case IDOK:
                        EndDialog(hDlg, LOWORD(wParam) == IDOK);
                        return TRUE;

      return FALSE;

// needed for SCRNSAVE.LIB
BOOL WINAPI GLScreenSaver::RegisterDialogClasses(HANDLE hInst)
	return TRUE;

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!