Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

302 lines
8.6 KiB

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 1999,2000
*
* TITLE: SSHNDLER.CPP
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 12/4/1999
*
* DESCRIPTION:
*
*******************************************************************************/
#include "precomp.h"
#pragma hdrstop
#include "sshndler.h"
#include "ssutil.h"
CScreenSaverHandler::CScreenSaverHandler( HWND hWnd, UINT nFindNotifyMessage, UINT nPaintTimer, UINT nChangeTimer, UINT nBackupStartTimer, LPCTSTR szRegistryPath, HINSTANCE hInstance )
: m_hWnd(hWnd),
m_hInstance(hInstance),
m_strRegistryPath(szRegistryPath),
m_nFindNotifyMessage(nFindNotifyMessage),
m_nPaintTimerId(nPaintTimer),
m_nChangeTimerId(nChangeTimer),
m_nBackupStartTimerId(nBackupStartTimer),
m_nBackupStartTimerPeriod(BACKUP_START_TIMER_PERIOD),
m_pImageScreenSaver(NULL),
m_bPaused(false),
m_hFindThread(NULL),
m_hFindCancel(NULL),
m_bScreensaverStarted(false),
m_nStartImage(0),
m_nShuffleInterval(SHUFFLE_INTERVAL)
{
m_nStartImage = m_Random.Generate(MAX_START_IMAGE);
}
void CScreenSaverHandler::Initialize(void)
{
CWaitCursor wc;
HDC hDC = GetDC(m_hWnd);
if (hDC)
{
m_pImageScreenSaver = new CImageScreenSaver( m_hInstance, m_strRegistryPath );
if (m_pImageScreenSaver)
{
m_pImageScreenSaver->SetScreenRect(m_hWnd);
if (m_pImageScreenSaver->IsValid())
{
m_hFindCancel = CreateEvent( NULL, TRUE, FALSE, NULL );
if (m_hFindCancel)
{
m_hFindThread = m_pImageScreenSaver->Initialize( m_hWnd, m_nFindNotifyMessage, m_hFindCancel );
}
SetTimer( m_hWnd, m_nBackupStartTimerId, m_nBackupStartTimerPeriod, NULL );
}
else
{
WIA_TRACE((TEXT("CScreenSaverHandler::CScreenSaverHandler, m_pImageScreenSaver->IsValid() returned failed\n")));
delete m_pImageScreenSaver;
m_pImageScreenSaver = NULL;
}
}
else
{
WIA_TRACE((TEXT("CScreenSaverHandler::CScreenSaverHandler, unable to create m_pImageScreenSaver\n")));
}
ReleaseDC( m_hWnd, hDC );
}
else
{
WIA_TRACE((TEXT("CScreenSaverHandler::CScreenSaverHandler, GetDC failed\n")));
}
}
CScreenSaverHandler::~CScreenSaverHandler(void)
{
if (m_pImageScreenSaver)
{
delete m_pImageScreenSaver;
m_pImageScreenSaver = NULL;
}
if (m_hFindCancel)
{
SetEvent(m_hFindCancel);
CloseHandle(m_hFindCancel);
m_hFindCancel = NULL;
}
if (m_hFindThread)
{
WaitForSingleObject( m_hFindThread, INFINITE );
CloseHandle(m_hFindThread);
m_hFindThread = NULL;
}
}
bool CScreenSaverHandler::HandleKeyboardMessage( UINT nMessage, WPARAM nVirtkey )
{
if (m_pImageScreenSaver && m_pImageScreenSaver->AllowKeyboardControl())
{
if (nMessage == WM_KEYDOWN)
{
switch (nVirtkey)
{
case VK_DOWN:
if (nMessage == WM_KEYDOWN)
{
m_bPaused = !m_bPaused;
if (!m_bPaused)
{
if (m_pImageScreenSaver && m_pImageScreenSaver->ReplaceImage(true,false))
m_Timer.Set( m_hWnd, m_nPaintTimerId, m_pImageScreenSaver->PaintTimerInterval() );
}
}
return true;
case VK_LEFT:
if (nMessage == WM_KEYDOWN)
{
if (m_pImageScreenSaver && m_pImageScreenSaver->ReplaceImage(false,true))
m_Timer.Set( m_hWnd, m_nPaintTimerId, m_pImageScreenSaver->PaintTimerInterval() );
}
return true;
case VK_RIGHT:
if (nMessage == WM_KEYDOWN)
{
if (m_pImageScreenSaver && m_pImageScreenSaver->ReplaceImage(true,true))
m_Timer.Set( m_hWnd, m_nPaintTimerId, m_pImageScreenSaver->PaintTimerInterval() );
}
return true;
}
}
}
return false;
}
void CScreenSaverHandler::HandleConfigChanged(void)
{
if (m_pImageScreenSaver)
{
m_pImageScreenSaver->SetScreenRect(m_hWnd);
m_pImageScreenSaver->ReadConfigData();
}
}
void CScreenSaverHandler::HandleTimer( WPARAM nEvent )
{
if (nEvent == m_nPaintTimerId)
{
if (m_pImageScreenSaver)
{
CSimpleDC ClientDC;
if (ClientDC.GetDC(m_hWnd))
{
bool bResult = m_pImageScreenSaver->TimerTick( ClientDC );
if (bResult)
{
m_Timer.Set( m_hWnd, m_nChangeTimerId, m_pImageScreenSaver->ChangeTimerInterval() );
}
}
}
}
else if (nEvent == m_nChangeTimerId)
{
m_Timer.Kill();
if (!m_bPaused && m_pImageScreenSaver && m_pImageScreenSaver->ReplaceImage(true,false))
{
m_Timer.Set( m_hWnd, m_nPaintTimerId, m_pImageScreenSaver->PaintTimerInterval() );
//
// Mark that we've been started
//
if (!m_bScreensaverStarted)
{
m_bScreensaverStarted = true;
}
}
}
else if (nEvent == m_nBackupStartTimerId)
{
//
// Make sure we don't get any more of these
//
KillTimer( m_hWnd, m_nBackupStartTimerId );
//
// If the screensaver hasn't started, start it.
//
if (!m_bScreensaverStarted)
{
//
// Shuffle the list
//
m_pImageScreenSaver->ResetFileQueue();
//
// If we haven't gotten any images, start the timer so we can display the error message
//
SendMessage( m_hWnd, WM_TIMER, m_nChangeTimerId, 0 );
}
}
}
void CScreenSaverHandler::HandlePaint(void)
{
if (m_pImageScreenSaver)
{
CSimpleDC PaintDC;
if (PaintDC.BeginPaint(m_hWnd))
{
m_pImageScreenSaver->Paint( PaintDC );
}
}
}
void CScreenSaverHandler::HandleFindFile( CFoundFileMessageData *pFoundFileMessageData )
{
WIA_PUSHFUNCTION(TEXT("CScreenSaverHandler::HandleFindFile"));
//
// Make sure we have a screensaver object
//
if (m_pImageScreenSaver)
{
//
// If this is a found file message
//
if (pFoundFileMessageData)
{
//
// Add it to the list, and check for cancel
//
bool bResult = m_pImageScreenSaver->FoundFile( pFoundFileMessageData->Name() );
//
// If the find operation was cancelled, set the cancel event
//
if (!bResult)
{
SetEvent( m_hFindCancel );
}
//
// If this is the image on which we should start, start up the screensaver pump
//
if (!m_bScreensaverStarted && m_pImageScreenSaver->Count() && m_nStartImage+1 == m_pImageScreenSaver->Count())
{
WIA_TRACE((TEXT("Starting after image %d was found"), m_nStartImage ));
//
// Shuffle the images
//
m_pImageScreenSaver->ResetFileQueue();
//
// If this is our first image, start things up
//
SendMessage( m_hWnd, WM_TIMER, m_nChangeTimerId, 0 );
}
//
// If we have some images, and the shuffle count interval has been reached, shuffle the images
//
if (m_pImageScreenSaver->Count() && (m_pImageScreenSaver->Count() % m_nShuffleInterval) == 0)
{
WIA_TRACE((TEXT("Shuffling the image list at %d images"), m_pImageScreenSaver->Count() ));
//
// Shuffle the images
//
m_pImageScreenSaver->ResetFileQueue();
}
delete pFoundFileMessageData;
}
else
{
//
// Last message
//
m_pImageScreenSaver->ResetFileQueue();
//
// If we haven't gotten any images, start the timer so we can display the error message
//
if (!m_bScreensaverStarted)
{
SendMessage( m_hWnd, WM_TIMER, m_nChangeTimerId, 0 );
}
}
}
}