/******************************************************************************* * * (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 ); } } } }