windows-nt/Source/XPSP1/NT/printscan/wia/test/msqscan/progressdlg.cpp
2020-09-26 16:20:57 +08:00

299 lines
6.8 KiB
C++

// ProgressDlg.cpp : implementation file
//
#include "stdafx.h"
#include "msqscan.h"
#include "ProgressDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// globals
//
extern IGlobalInterfaceTable * g_pGIT;
HWND g_hWnd = NULL;
BOOL g_bCancel = FALSE; // use global for now, It would be better to use an "event"
BOOL g_bPaintPreview = TRUE;
/////////////////////////////////////////////////////////////////////////////
// Thread Information
UINT WINAPIV DataAcquireThreadProc(LPVOID pParam)
{
HRESULT hr = S_OK;
//
// Initialize COM, for this thread
//
hr = CoInitialize(NULL);
if(SUCCEEDED(hr)) {
//
// set global cancel flag
//
g_bCancel = FALSE;
//
// prepare, and use the DATA_ACQUIRE_INFO struct
//
DATA_ACQUIRE_INFO *pDataAcquireInfo = (DATA_ACQUIRE_INFO*)pParam;
pDataAcquireInfo->pProgressFunc = &ProgressFunction;
g_bPaintPreview = pDataAcquireInfo->bPreview;
IWiaItem *pIWiaRootItem = NULL;
hr = ReadInterfaceFromGlobalInterfaceTable(pDataAcquireInfo->dwCookie, &pIWiaRootItem);
if(SUCCEEDED(hr)) {
//
// create a new WIA object for data transfer
//
CWIA MyWIA;
//
// set the Root Item, used for current settings
//
MyWIA.SetRootItem(pIWiaRootItem);
//
// Initiate WIA Transfer
//
if(pDataAcquireInfo->bTransferToFile) {
hr = MyWIA.DoFileTransfer(pDataAcquireInfo);
if(SUCCEEDED(hr)) {
OutputDebugString(TEXT("WIA File Transfer is complete...\n"));
} else if(hr == WIA_ERROR_PAPER_EMPTY){
MessageBox(NULL,TEXT("Document Feeder is out of Paper"),TEXT("ADF Status Message"),MB_ICONERROR);
}
} else {
hr = MyWIA.DoBandedTransfer(pDataAcquireInfo);
if(SUCCEEDED(hr)) {
OutputDebugString(TEXT("WIA Banded Transfer is complete...\n"));
}
}
//
// Do Window messaging, while thread processes
//
while (!MyWIA.IsAcquireComplete()) {
MSG message;
if(::PeekMessage(&message, NULL, 0, 0, PM_NOREMOVE)) {
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
}
//
// Uninitialize COM, for this thread
//
CoUninitialize();
}
//
// Post the quit message, to close the progress dialog
//
::PostMessage(g_hWnd, WM_CANCEL_ACQUIRE, 0, 0);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// Progress Callback function
BOOL ProgressFunction(LPTSTR lpszText, LONG lPercentComplete)
{
::PostMessage(g_hWnd, WM_STEP_PROGRESS, 0, lPercentComplete);
::PostMessage(g_hWnd, WM_UPDATE_PROGRESS_TEXT, 0, (LPARAM)lpszText);
if(g_bPaintPreview) {
//
// make parent update it's preview
//
HWND hParentWnd = NULL;
hParentWnd = GetParent(g_hWnd);
if(hParentWnd != NULL)
::PostMessage(hParentWnd,WM_UPDATE_PREVIEW,0,0);
}
return g_bCancel;
}
/////////////////////////////////////////////////////////////////////////////
// CProgressDlg dialog
CProgressDlg::CProgressDlg(CWnd* pParent /*=NULL*/)
: CDialog(CProgressDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CProgressDlg)
m_ProgressText = _T("");
m_pDataAcquireThread = NULL;
//}}AFX_DATA_INIT
}
void CProgressDlg::SetAcquireData(DATA_ACQUIRE_INFO* pDataAcquireInfo)
{
m_pDataAcquireInfo = pDataAcquireInfo;
}
void CProgressDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CProgressDlg)
DDX_Control(pDX, IDC_CANCEL, m_CancelButton);
DDX_Control(pDX, IDC_PROGRESS_CONTROL, m_ProgressCtrl);
DDX_Text(pDX, IDC_PROGRESS_TEXT, m_ProgressText);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CProgressDlg, CDialog)
//{{AFX_MSG_MAP(CProgressDlg)
ON_BN_CLICKED(IDC_CANCEL, OnCancel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProgressDlg message handlers
void CProgressDlg::OnCancel()
{
//
// suspend the data acquire thread
//
m_pDataAcquireThread->SuspendThread();
//
// set the global cancel flag
//
g_bCancel = TRUE;
//
// resume the data acquire thread
//
m_pDataAcquireThread->ResumeThread();
//
// post a nice, wait message while WIA catches up with the
// cancel..ie. S_FALSE sent through the callback Interface
//
m_ProgressText = TEXT("Please Wait... Your Acquire is being canceled.");
UpdateData(FALSE);
//
// disable the 'cancel' button, to show the user that somthing did happen,
// when they pushed 'cancel'.
//
m_CancelButton.EnableWindow(FALSE);
}
BOOL CProgressDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//
// set the progress range, 0-100% complete
//
m_ProgressCtrl.SetRange(0,100);
m_ProgressCtrl.SetPos(0);
//
// save window handle, for messages
//
g_hWnd = m_hWnd;
//
// start data acquire thread
//
m_pDataAcquireThread = AfxBeginThread(DataAcquireThreadProc, m_pDataAcquireInfo, THREAD_PRIORITY_NORMAL);
//
// suspend thread until dialog is ready to acquire
//
m_pDataAcquireThread->SuspendThread();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
LRESULT CProgressDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
//
// Trap progress control message, sent from data acquire thread
//
switch(message) {
case WM_STEP_PROGRESS:
//
// step progress control
//
m_ProgressCtrl.SetPos((int)lParam);
break;
case WM_ACTIVATE:
//
// dialog is ready, so resume thread for acquiring data
//
m_pDataAcquireThread->ResumeThread();
break;
case WM_CANCEL_ACQUIRE:
//
// cancel/close dialog
//
CDialog::OnOK();
break;
default:
break;
}
//
// handle any special cases
//
//
// if the user has canceled the acquire, do not process another
// progress text message, because we already have updated them
// with a 'friendly' wait message.
//
if(!g_bCancel) {
if(message == WM_UPDATE_PROGRESS_TEXT) {
m_ProgressText = (LPTSTR)lParam;
UpdateData(FALSE);
}
}
return CDialog::WindowProc(message, wParam, lParam);
}