#ifndef __PROGRESS_H_ #define __PROGRESS_H_ #include #include #define MEMORY_BLOCK_FACTOR 2 #define TITLE_FROMDEVICE 101 #define TITLE_PROCESSINGDATA 102 #define TITLE_TRANSFERTOCLIENT 103 // // Progress dialog class definition (uses common WIA UI) // class CProgressDlg { public: CProgressDlg() { m_bCancelled = FALSE; m_pWiaProgressDialog = NULL; m_iLow = 0; m_iHigh = 100; } ~CProgressDlg() { if (m_pWiaProgressDialog) { m_pWiaProgressDialog->Destroy(); m_pWiaProgressDialog->Release(); m_pWiaProgressDialog = NULL; } } BOOL Initialize(HINSTANCE hI, DWORD dwI) { return TRUE; } BOOL DoModeless(HWND hwndOwner, LPARAM lp) { // // Create standard WIA progress, allowing cancel // if(m_pWiaProgressDialog){ // dialog has already been created return TRUE; } HRESULT hr = CoCreateInstance( CLSID_WiaDefaultUi, NULL, CLSCTX_INPROC_SERVER, IID_IWiaProgressDialog, (void**)&m_pWiaProgressDialog ); if (SUCCEEDED(hr) && m_pWiaProgressDialog) { hr = m_pWiaProgressDialog->Create( hwndOwner, WIA_PROGRESSDLG_NO_ANIM ); if (SUCCEEDED(hr)) { m_pWiaProgressDialog->SetTitle( L"" ); m_pWiaProgressDialog->SetMessage( L"" ); m_pWiaProgressDialog->SetPercentComplete(0); m_pWiaProgressDialog->Show(); } else { m_pWiaProgressDialog->Release(); m_pWiaProgressDialog = NULL; } } return(NULL != m_pWiaProgressDialog); } void SetRange(int Low, int High) { m_iLow = Low; m_iHigh = High; } void SetPos(int NewPos) { int delta = (m_iHigh - m_iLow) ; int percent = 0; if (NewPos < m_iLow ) { percent = 0; } else if ( (delta == 0) || (NewPos > m_iHigh) ) { percent = 100; } else { percent = 100 * ( NewPos - m_iLow) / delta; } ASSERT(m_pWiaProgressDialog != NULL); if (m_pWiaProgressDialog && FAILED(m_pWiaProgressDialog->SetPercentComplete(percent))) { } } BOOL CheckCancelled() { ASSERT(m_pWiaProgressDialog != NULL); m_bCancelled = FALSE; if (m_pWiaProgressDialog && FAILED(m_pWiaProgressDialog->Cancelled(&m_bCancelled))) { } return m_bCancelled; } void SetTitle(LPTSTR pszTitle) { ASSERT(m_pWiaProgressDialog != NULL); #ifndef UNICODE WCHAR wszTitle[MAX_PATH]; MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, wszTitle, sizeof(wszTitle) / sizeof(WCHAR) ); if (m_pWiaProgressDialog && FAILED(m_pWiaProgressDialog->SetTitle(wszTitle))) { // What do we do if SetTitle fails? } #else if (m_pWiaProgressDialog && FAILED(m_pWiaProgressDialog->SetTitle(pszTitle))) { // What do we do if SetTitle fails? } #endif } private: BOOL m_bCancelled; IWiaProgressDialog *m_pWiaProgressDialog; int m_iLow; int m_iHigh; }; // // WIA data callback class definition // class CWiaDataCallback : public IWiaDataCallback { public: CWiaDataCallback() { m_Ref = 1; m_hrLast = S_OK; // // image data // m_hImage = NULL; m_pImage = NULL; m_ImageSize = 0; m_bBitmapData = FALSE; m_lImageHeight = 0; m_lImageWidth = 0; m_MemBlockSize = 0; m_SizeTransferred = 0; // // progress dialog // m_hwndOwner = NULL; m_pProgDlg = NULL; m_pszXferFromDevice = NULL; m_pszProcessingData = NULL; m_pszXferToClient = NULL; m_bSetTitle = FALSE; m_lLastTextUpdate = 0; m_lCurrentTextUpdate = 0; } ~CWiaDataCallback() { // // free image data memory members // if (m_pImage){ GlobalUnlock(m_hImage); m_pImage = NULL; } if (m_hImage){ GlobalFree(m_hImage); m_hImage = NULL; } // // free progress dialog members // if (m_pProgDlg){ delete m_pProgDlg; m_pProgDlg = NULL; } if (m_pszXferFromDevice){ delete [] m_pszXferFromDevice; m_pszXferFromDevice = NULL; } if (m_pszProcessingData){ delete [] m_pszProcessingData; m_pszProcessingData = NULL; } if (m_pszXferToClient){ delete [] m_pszXferToClient; m_pszXferToClient = NULL; } } HRESULT Initialize(HWND hwndOwner, BOOL bShowProgress); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); STDMETHODIMP QueryInterface(REFIID iid, void **ppv); STDMETHODIMP BandedDataCallback(LONG lMessage, LONG lStatus,LONG lPercentComplete,LONG lOffset, LONG Length, LONG lReserved, LONG lResLength,BYTE *pData); HRESULT GetImage(HGLOBAL *phImage, ULONG *pImageSize); LONG CalculateWidthBytes(LONG lWidthPixels, LONG lbpp); LONG GetImageHeight(){return m_lImageHeight;} LONG GetImageWidth(){return m_lImageWidth;} HRESULT GetLastResult() { return m_hrLast; } private: ULONG m_Ref; HRESULT m_hrLast; // // image data // HGLOBAL m_hImage; BYTE *m_pImage; ULONG m_ImageSize; BOOL m_bBitmapData; LONG m_lImageHeight; LONG m_lImageWidth; LONG m_MemBlockSize; ULONG m_SizeTransferred; // // progress dialog // HWND m_hwndOwner; CProgressDlg *m_pProgDlg; TCHAR *m_pszXferFromDevice; TCHAR *m_pszProcessingData; TCHAR *m_pszXferToClient; BOOL m_bSetTitle; LONG m_lLastTextUpdate; LONG m_lCurrentTextUpdate; }; #endif //__PROGRESS_H_