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.
 
 
 
 
 
 

315 lines
10 KiB

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 1998, 1999, 2000
*
* TITLE: IMAGESCR.CPP
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 1/13/1999
*
* DESCRIPTION: My Pictures Slideshow screen saver class
*
*******************************************************************************/
#include "precomp.h"
#pragma hdrstop
#include "imagescr.h"
#include "isdbg.h"
#include "simreg.h"
#include "waitcurs.h"
#include "ssutil.h"
#include "findthrd.h"
#include "ssmprsrc.h"
#include <shlobj.h>
CImageScreenSaver::CImageScreenSaver( HINSTANCE hInstance, const CSimpleString &strRegistryKey )
: m_pPainter(NULL),
m_hInstance(hInstance),
m_MyDocsScreenSaverData( HKEY_CURRENT_USER, strRegistryKey )
{
EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(this) );
}
CImageScreenSaver::~CImageScreenSaver(void)
{
if (m_pPainter)
delete m_pPainter;
m_pPainter = NULL;
}
BOOL CALLBACK CImageScreenSaver::MonitorEnumProc( HMONITOR hMonitor, HDC hdcMonitor, LPRECT prcMonitor, LPARAM lParam )
{
CImageScreenSaver *pThis = reinterpret_cast<CImageScreenSaver*>(lParam);
if (pThis)
{
if (hMonitor)
{
MONITORINFOEX MonitorInfoEx;
ZeroMemory( &MonitorInfoEx, sizeof(MonitorInfoEx) );
MonitorInfoEx.cbSize = sizeof(MonitorInfoEx);
if (GetMonitorInfo( hMonitor, reinterpret_cast<MONITORINFO*>(&MonitorInfoEx)))
{
pThis->m_ScreenList.Append( MonitorInfoEx.rcMonitor );
WIA_TRACE((TEXT("Monitor = [%s], rcMonitor = (%d,%d,%d,%d), rcWork = (%d,%d,%d,%d), dwFlags = %08X\n"),
MonitorInfoEx.szDevice,
MonitorInfoEx.rcMonitor.left, MonitorInfoEx.rcMonitor.top, MonitorInfoEx.rcMonitor.right, MonitorInfoEx.rcMonitor.bottom,
MonitorInfoEx.rcWork.left, MonitorInfoEx.rcWork.top, MonitorInfoEx.rcWork.right, MonitorInfoEx.rcWork.bottom,
MonitorInfoEx.dwFlags ));
}
else
{
WIA_TRACE((TEXT("MonitorEnumProc, GetMonitorInfo failed (%d)\n"), GetLastError()));
}
}
else
{
WIA_TRACE((TEXT("MonitorEnumProc, hMonitor == NULL\n")));
}
}
else
{
WIA_TRACE((TEXT("MonitorEnumProc, pThis == NULL\n")));
}
return TRUE;
}
bool CImageScreenSaver::IsValid(void) const
{
return(true);
}
HANDLE CImageScreenSaver::Initialize( HWND hwndNotify, UINT nNotifyMessage, HANDLE hEventCancel )
{
HANDLE hResult = NULL;
//
// Get the file extensions for the file types we are able to deal with
//
CSimpleString strExtensions;
m_GdiPlusHelper.ConstructDecoderExtensionSearchStrings(strExtensions);
WIA_TRACE((TEXT("strExtensions = %s"), strExtensions.String()));
//
// Start the image finding thread
//
hResult = CFindFilesThread::Find(
m_MyDocsScreenSaverData.ImageDirectory(),
strExtensions,
hwndNotify,
nNotifyMessage,
hEventCancel,
m_MyDocsScreenSaverData.MaxFailedFiles(),
m_MyDocsScreenSaverData.MaxSuccessfulFiles(),
m_MyDocsScreenSaverData.MaxDirectories()
);
//
// Return the thread handle
//
return hResult;
}
bool CImageScreenSaver::TimerTick( CSimpleDC &ClientDC )
{
if (m_pPainter && ClientDC.IsValid())
{
return m_pPainter->TimerTick( ClientDC );
}
return false;
}
void CImageScreenSaver::Paint( CSimpleDC &PaintDC )
{
if (m_pPainter && PaintDC.IsValid())
{
m_pPainter->Paint( PaintDC );
}
}
int CImageScreenSaver::ChangeTimerInterval(void) const
{
return(m_MyDocsScreenSaverData.ChangeInterval());
}
int CImageScreenSaver::PaintTimerInterval(void) const
{
return(m_MyDocsScreenSaverData.PaintInterval());
}
bool CImageScreenSaver::AllowKeyboardControl(void)
{
return(m_MyDocsScreenSaverData.AllowKeyboardControl());
}
bool CImageScreenSaver::ReplaceImage( bool bForward, bool bNoTransition )
{
CSimpleString strCurrentFile;
if (m_pPainter)
{
delete m_pPainter;
m_pPainter = NULL;
}
if (!m_VisibleAreaList.Size())
{
return false;
}
if (m_FindImageFiles.Count())
{
//
// exit the loop when we get a valid image or we've exhausted the list
//
int nNumTries = 0;
while (!m_pPainter && nNumTries < m_FindImageFiles.Count())
{
CSimpleString strNextFile;
bool bNextFile = bForward ? m_FindImageFiles.NextFile(strNextFile) : m_FindImageFiles.PreviousFile(strNextFile);
if (bNextFile)
{
CSimpleDC ClientDC;
if (ClientDC.GetDC(NULL))
{
CBitmapImage *pBitmapImage = new CBitmapImage;
if (pBitmapImage)
{
int nAreaToUse = CRandomNumberGen().Generate(0,m_VisibleAreaList.Size());
RECT rcAreaToUse = m_VisibleAreaList[nAreaToUse];
WIA_TRACE((TEXT("Chosen Image Area [%d] = (%d,%d), (%d,%d)"), nAreaToUse, rcAreaToUse.left, rcAreaToUse.top, rcAreaToUse.right, rcAreaToUse.bottom ));
if (pBitmapImage->Load( ClientDC, strNextFile, rcAreaToUse, m_MyDocsScreenSaverData.MaxScreenPercent(), m_MyDocsScreenSaverData.AllowStretching(), m_MyDocsScreenSaverData.DisplayFilename() ))
{
if (m_MyDocsScreenSaverData.DisableTransitions() || bNoTransition)
{
m_pPainter = new CSimpleTransitionPainter( pBitmapImage, ClientDC, rcAreaToUse, m_rcClient );
}
else
{
m_pPainter = GetRandomImagePainter( pBitmapImage, ClientDC, rcAreaToUse, m_rcClient );
}
//
// If we couldn't create a painter, delete the bitmap
//
if (!m_pPainter)
{
WIA_TRACE((TEXT("%hs (%d): Unable to create a painter\n"), __FILE__, __LINE__ ));
delete pBitmapImage;
}
}
else
{
WIA_TRACE((TEXT("%hs (%d): pBitmapImage->Load() failed\n"), __FILE__, __LINE__ ));
delete pBitmapImage;
}
}
else
{
WIA_TRACE((TEXT("%hs (%d): CImageScreenSaver::CreateImage() failed\n"), __FILE__, __LINE__ ));
}
}
else
{
WIA_TRACE((TEXT("%hs (%d): ClientDC.GetDC() failed\n"), __FILE__, __LINE__ ));
}
}
else
{
WIA_TRACE((TEXT("%hs (%d): m_FindImageFiles.NextFile() failed\n"), __FILE__, __LINE__ ));
}
nNumTries++;
}
}
else
{
//
// Create a new image
//
CBitmapImage *pBitmapImage = new CBitmapImage;
if (pBitmapImage)
{
//
// Get a desktop DC
//
CSimpleDC ClientDC;
if (ClientDC.GetDC(NULL))
{
//
// Figure out which screen to display the message on
//
RECT rcAreaToUse = m_VisibleAreaList[CRandomNumberGen().Generate(0,m_VisibleAreaList.Size())];
//
// Create the bitmap with an appropriate message
//
if (pBitmapImage->CreateFromText( CSimpleString().Format( IDS_NO_FILES_FOUND, g_hInstance, m_MyDocsScreenSaverData.ImageDirectory().String() ), rcAreaToUse, m_MyDocsScreenSaverData.MaxScreenPercent() ))
{
//
// Create a simple painter to display it
//
m_pPainter = new CSimpleTransitionPainter( pBitmapImage, ClientDC, rcAreaToUse, m_rcClient );
if (!m_pPainter)
{
//
// If we couldn't get a painter, destroy the bitmap
//
delete pBitmapImage;
}
}
else
{
//
// If we couldn't create a bitmap, destroy it
//
delete pBitmapImage;
}
}
}
}
return(m_pPainter != NULL);
}
CImagePainter *CImageScreenSaver::GetRandomImagePainter( CBitmapImage *pBitmapImage, CSimpleDC &dc, const RECT &rcAreaToUse, const RECT &rcClient )
{
CImagePainter *pPainter = NULL;
int nPainter = CRandomNumberGen().Generate(0,5);
if (!pPainter)
{
switch (nPainter)
{
case 0:
pPainter = new CSimpleTransitionPainter( pBitmapImage, dc, rcAreaToUse, rcClient );
break;
case 1:
pPainter = new CSlidingTransitionPainter( pBitmapImage, dc, rcAreaToUse, rcClient );
break;
case 2:
pPainter = new CRandomBlockPainter( pBitmapImage, dc, rcAreaToUse, rcClient );
break;
case 3:
pPainter = new CAlphaFadePainter( pBitmapImage, dc, rcAreaToUse, rcClient );
break;
case 4:
pPainter = new COpenCurtainPainter( pBitmapImage, dc, rcAreaToUse, rcClient );
break;
}
}
if (!pPainter)
{
WIA_TRACE((TEXT("%hs (%d): pPainter is NULL\n"), __FILE__, __LINE__ ));
return(NULL);
}
if (!pPainter->IsValid())
{
WIA_TRACE((TEXT("%hs (%d): pPainter->IsValid() == FALSE\n"), __FILE__, __LINE__ ));
delete pPainter;
return(NULL);
}
return(pPainter);
}