windows-nt/Source/XPSP1/NT/printscan/wia/drivers/camera/ircamera/progress.cpp
2020-09-26 16:20:57 +08:00

230 lines
5.6 KiB
C++

//--------------------------------------------------------------------------
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// progress.cpp
//
// IR ProgressBar object.
//
//--------------------------------------------------------------------------
#include <windows.h>
#include <shlobj.h>
#include <malloc.h>
#include "ircamera.h"
#include "progress.h"
//--------------------------------------------------------------------------
// CIrProgress::CIrProgress()
//
//--------------------------------------------------------------------------
CIrProgress::CIrProgress() :
m_hInstance(NULL),
m_pPD(NULL)
{
}
//--------------------------------------------------------------------------
// CIrProgress::~CIrProgress()
//
//--------------------------------------------------------------------------
CIrProgress::~CIrProgress()
{
if (m_pPD)
{
m_pPD->Release();
m_pPD = NULL;
}
}
//--------------------------------------------------------------------------
// CIrProgress::Initialize()
//
//--------------------------------------------------------------------------
HRESULT CIrProgress::Initialize( IN HINSTANCE hInstance,
IN DWORD dwIdrAnimationAvi )
{
HRESULT hr;
CHAR szStr[MAX_PATH];
WCHAR wszStr[MAX_PATH];
if (!hInstance)
{
return E_INVALIDARG;
}
m_hInstance = hInstance;
//
// Create a shell progress object to do the work for us.
//
hr = CoCreateInstance( CLSID_ProgressDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_IProgressDialog,
(void**)&m_pPD );
if (FAILED(hr))
{
return hr;
}
//
// Get the title string and place it on the progress dialog:
//
if (::LoadStringResource(m_hInstance,
IDS_PROGRESS_TITLE,
wszStr,
MAX_PATH ))
{
hr = m_pPD->SetTitle(wszStr);
}
else
{
// Couldn't load string, default title...
hr = m_pPD->SetTitle(L"Image Transfer Progress");
}
//
// Setup the file transfer animation
//
hr = m_pPD->SetAnimation( m_hInstance, dwIdrAnimationAvi );
if (FAILED(hr))
{
goto error;
}
//
// Setup the cancel string (displayed when the cancel button
// is pressed.
//
if (::LoadStringResource(m_hInstance,
IDS_CANCEL_MSG,
wszStr,
MAX_PATH ))
{
hr = m_pPD->SetCancelMsg( wszStr, NULL );
}
else
{
// Couldn't load string, use default cancel message...
hr = m_pPD->SetCancelMsg( L"Cleaning up...", NULL );
}
return hr;
error:
m_pPD->Release();
m_pPD = NULL;
m_hInstance = NULL;
return hr;
}
//--------------------------------------------------------------------------
// CIrProgress::SetText()
//
//--------------------------------------------------------------------------
HRESULT CIrProgress::SetText( IN TCHAR *pText )
{
HRESULT hr = S_OK;
if (m_pPD)
{
#ifdef UNICODE
hr = m_pPD->SetLine( 1, pText, FALSE, NULL );
#else
WCHAR wszText[MAX_PATH];
if (!MultiByteToWideChar( CP_ACP,
0,
pText,
1+strlen(pText),
wszText,
MAX_PATH) )
{
hr = HRESULT_FROM_WIN32(::GetLastError());
return hr;
}
hr = m_pPD->SetLine( 1, wszText, FALSE, NULL );
#endif
}
return hr;
}
//--------------------------------------------------------------------------
// CIrProgress::StartProgressDialog()
//
//--------------------------------------------------------------------------
HRESULT CIrProgress::StartProgressDialog()
{
HRESULT hr = S_OK;
if (m_pPD)
{
DWORD dwFlags = PROGDLG_NORMAL|PROGDLG_AUTOTIME|PROGDLG_NOMINIMIZE;
HRESULT hr = m_pPD->StartProgressDialog( NULL, // hwndParent
NULL,
dwFlags,
NULL );
}
return hr;
}
//--------------------------------------------------------------------------
// CIrProgress::UpdateProgressDialog()
//
//--------------------------------------------------------------------------
HRESULT CIrProgress::UpdateProgressDialog( IN DWORD dwCompleted,
IN DWORD dwTotal )
{
HRESULT hr = S_OK;
if (m_pPD)
{
hr = m_pPD->SetProgress( dwCompleted, dwTotal );
}
return hr;
}
//--------------------------------------------------------------------------
// CIrProgress::HasUserCancelled()
//
//--------------------------------------------------------------------------
BOOL CIrProgress::HasUserCancelled()
{
if (m_pPD)
{
return m_pPD->HasUserCancelled();
}
else
{
return S_OK;
}
}
//--------------------------------------------------------------------------
// CIrProgress::EndProgressDialog()
//
//--------------------------------------------------------------------------
HRESULT CIrProgress::EndProgressDialog()
{
HRESULT hr = S_OK;
if (m_pPD)
{
hr = m_pPD->StopProgressDialog();
}
return hr;
}