// // Microsoft Windows Media Technologies // Copyright (C) Microsoft Corporation, 1999 - 2001. All rights reserved. // // // This workspace contains two projects - // 1. ProgHelp which implements the Progress Interface // 2. The Sample application WmdmApp. // // ProgHelp.dll needs to be registered first for the SampleApp to run. // Includes // #include "appPCH.h" // Local functions // INT_PTR CALLBACK Progress_DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); ///////////////////////////////////////////////////////////////////// // // Function implementations // CProgress::CProgress (void ) { m_hwndProgress = NULL; m_nCurrentNum = 0; m_nTotalNum = 0; m_dwCurrentBytes = 0; m_dwTotalBytes = 0; m_fCancelled = FALSE; } CProgress::~CProgress( void ) { m_hwndProgress = NULL; } BOOL CProgress::Show( BOOL fShow ) { // If showing the dialog, center it relative to its parent // if( fShow ) { CenterWindow( m_hwndProgress, GetParent(m_hwndProgress) ); // enable the cancel button EnableWindow( GetDlgItem(m_hwndProgress, IDCANCEL), TRUE ); } // Show/Hide the window // ShowWindow( m_hwndProgress, (fShow ? SW_SHOW : SW_HIDE) ); if( fShow ) { BringWndToTop( GetParent(m_hwndProgress) ); BringWndToTop( m_hwndProgress ); } return TRUE; } BOOL CProgress::IsCancelled( void ) { return m_fCancelled; } BOOL CProgress::Cancel( void ) { BOOL fWasAlreadyCancelled = m_fCancelled; m_fCancelled = TRUE; EnableWindow( GetDlgItem(m_hwndProgress, IDCANCEL), FALSE ); return fWasAlreadyCancelled; } INT_PTR CALLBACK Progress_DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static CProgress *pThis = NULL; switch( uMsg ) { case WM_INITDIALOG: pThis = (CProgress *)lParam; break; case WM_COMMAND: if( IDCANCEL == LOWORD(wParam) ) { pThis->Cancel(); } break; default: break; } return 0; } BOOL CProgress::Create( HWND hwndParent ) { BOOL fRet = FALSE; if( m_hwndProgress ) { Destroy(); } m_hwndProgress = CreateDialogParam( g_hInst, MAKEINTRESOURCE( IDD_PROGRESS ), hwndParent, Progress_DlgProc, (LPARAM)this ); if( NULL == m_hwndProgress ) { return FALSE; } // Hide the window initially // ShowWindow( m_hwndProgress, SW_HIDE ); m_fCancelled = FALSE; fRet = TRUE; return fRet; } VOID CProgress::Destroy( void ) { if( m_hwndProgress ) { DestroyWindow( m_hwndProgress ); } } BOOL CProgress::SetRange( INT nMin, INT nMax ) { HWND hwnd = GetDlgItem( m_hwndProgress, IDC_PB_PROGRESS ); SendMessage( hwnd, PBM_SETRANGE, (WPARAM)0, (LPARAM)MAKELPARAM(nMin,nMax) ); return TRUE; } BOOL CProgress::SetOperation( LPSTR lpsz ) { HWND hwnd = GetDlgItem( m_hwndProgress, IDC_ST_OPERATION ); SetWindowText( hwnd, lpsz ); return TRUE; } BOOL CProgress::SetDetails( LPSTR lpsz ) { HWND hwnd = GetDlgItem( m_hwndProgress, IDC_ST_DETAILS ); SetWindowText( hwnd, lpsz ); return TRUE; } BOOL CProgress::SetCount( INT nCurrentNum, INT nTotalNum ) { HWND hwnd = GetDlgItem( m_hwndProgress, IDC_ST_COUNTER ); char szFormat[MAX_PATH]; char szCount[MAX_PATH]; if( (DWORD)-1 != nCurrentNum ) { m_nCurrentNum = nCurrentNum; } if( (DWORD)-1 != nTotalNum ) { m_nTotalNum = nTotalNum; } if( nCurrentNum == -1 && nTotalNum == -1 ) { SetWindowText( hwnd, "" ); } else { LoadString( g_hInst, IDS_PROGRESS_COUNT, szFormat, sizeof(szFormat) ); wsprintf( szCount, szFormat, nCurrentNum, nTotalNum ); SetWindowText( hwnd, szCount ); } return TRUE; } BOOL CProgress::IncCount( INT nIncrement ) { SetCount( m_nCurrentNum + nIncrement, m_nTotalNum ); return TRUE; } BOOL CProgress::SetPos( INT nPos ) { HWND hwnd = GetDlgItem( m_hwndProgress, IDC_PB_PROGRESS ); if( -1 == nPos ) { // get the top limit nPos = (INT)SendMessage( hwnd, PBM_GETRANGE, (WPARAM)(BOOL)FALSE, (LPARAM)0 ); } // set the position SendMessage( hwnd, PBM_SETPOS, (WPARAM)nPos, (LPARAM)0 ); return TRUE; } BOOL CProgress::IncPos( INT nIncrement ) { HWND hwnd = GetDlgItem( m_hwndProgress, IDC_PB_PROGRESS ); // increment the position SendMessage( hwnd, PBM_DELTAPOS, (WPARAM)nIncrement, (LPARAM)0 ); return TRUE; } BOOL CProgress::SetBytes( DWORD dwCurrentNum, DWORD dwTotalNum ) { HWND hwnd = GetDlgItem( m_hwndProgress, IDC_ST_BYTECOUNTER ); char szFormat[MAX_PATH]; char szCount[MAX_PATH]; if( (DWORD)-1 != dwCurrentNum ) { m_dwCurrentBytes = dwCurrentNum; } if( (DWORD)-1 != dwTotalNum ) { m_dwTotalBytes = dwTotalNum; } if( dwCurrentNum == -1 && dwTotalNum == -1 ) { SetWindowText( hwnd, "" ); } else { LoadString( g_hInst, IDS_PROGRESS_BYTECOUNT, szFormat, sizeof(szFormat) ); wsprintf( szCount, szFormat, m_dwCurrentBytes/1024, m_dwTotalBytes/1024 ); SetWindowText( hwnd, szCount ); } return TRUE; } BOOL CProgress::IncBytes( DWORD dwIncrement ) { SetBytes( m_dwCurrentBytes + dwIncrement, m_dwTotalBytes ); return TRUE; }