120 lines
5 KiB
C++
120 lines
5 KiB
C++
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
#include <initguid.h>
|
||
|
#include "pviewids.h"
|
||
|
#include "wiatextc.h"
|
||
|
#include "wiascand.h"
|
||
|
#include "pshelper.h"
|
||
|
#include "devprop.h"
|
||
|
|
||
|
HRESULT WINAPI ScannerDeviceDialog( PDEVICEDIALOGDATA pDialogDeviceData )
|
||
|
{
|
||
|
HRESULT hr = E_FAIL;
|
||
|
if (pDialogDeviceData && pDialogDeviceData->cbSize == sizeof(DEVICEDIALOGDATA))
|
||
|
{
|
||
|
InitCommonControls();
|
||
|
RegisterWiaPreviewClasses( g_hInstance );
|
||
|
CWiaTextControl::RegisterClass( g_hInstance );
|
||
|
WIA_ERROR((TEXT("GetWindowThreadProcessId( pDialogDeviceData->hwndParent ): %08X, GetCurrentThreadId(): %08X"), GetWindowThreadProcessId( pDialogDeviceData->hwndParent, NULL ), GetCurrentThreadId() ));
|
||
|
|
||
|
LONG nProps = ScannerProperties::GetDeviceProps( pDialogDeviceData->pIWiaItemRoot );
|
||
|
|
||
|
int nDialogId = 0;
|
||
|
|
||
|
//
|
||
|
// Determine which dialog resource to use, based on which properties the scanner has, as follows:
|
||
|
//
|
||
|
// HasFlatBed HasDocumentFeeder SupportsPreview SupportsPageSize
|
||
|
// 1 1 1 1 IDD_SCAN_ADF
|
||
|
// 1 0 1 0 IDD_SCAN_NORMAL
|
||
|
// 0 1 1 1 IDD_SCAN_ADF
|
||
|
// 0 1 0 0 IDD_SCAN_NO_PREVIEW
|
||
|
//
|
||
|
// otheriwse return E_NOTIMPL
|
||
|
//
|
||
|
const int nMaxControllingProps = 4;
|
||
|
static struct
|
||
|
{
|
||
|
LONG ControllingProps[nMaxControllingProps];
|
||
|
int pszDialogTemplate;
|
||
|
}
|
||
|
s_DialogResourceData[] =
|
||
|
{
|
||
|
{ ScannerProperties::HasFlatBed, ScannerProperties::HasDocumentFeeder, ScannerProperties::SupportsPreview, ScannerProperties::SupportsPageSize, NULL },
|
||
|
{ ScannerProperties::HasFlatBed, ScannerProperties::HasDocumentFeeder, ScannerProperties::SupportsPreview, ScannerProperties::SupportsPageSize, IDD_SCAN_ADF },
|
||
|
{ ScannerProperties::HasFlatBed, 0, ScannerProperties::SupportsPreview, 0, IDD_SCAN },
|
||
|
{ 0, ScannerProperties::HasDocumentFeeder, ScannerProperties::SupportsPreview, ScannerProperties::SupportsPageSize, IDD_SCAN_ADF },
|
||
|
{ 0, ScannerProperties::HasDocumentFeeder, 0, 0, IDD_SCAN_NO_PREVIEW },
|
||
|
{ 0, ScannerProperties::HasDocumentFeeder, 0, ScannerProperties::SupportsPageSize, IDD_SCAN_ADF },
|
||
|
{ ScannerProperties::HasFlatBed, ScannerProperties::HasDocumentFeeder, 0, ScannerProperties::SupportsPageSize, IDD_SCAN_ADF }
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Find the set of flags that match this device. If they match, use this resource.
|
||
|
// Loop through each resource description.
|
||
|
//
|
||
|
for (int nCurrentResourceFlags=1;nCurrentResourceFlags<ARRAYSIZE(s_DialogResourceData) && !nDialogId;nCurrentResourceFlags++)
|
||
|
{
|
||
|
//
|
||
|
// Loop through each controlling property
|
||
|
//
|
||
|
for (int nControllingProp=0;nControllingProp<nMaxControllingProps;nControllingProp++)
|
||
|
{
|
||
|
//
|
||
|
// If this property DOESN'T match, break out prematurely
|
||
|
//
|
||
|
if ((nProps & s_DialogResourceData[0].ControllingProps[nControllingProp]) != s_DialogResourceData[nCurrentResourceFlags].ControllingProps[nControllingProp])
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
//
|
||
|
// If the current controlling property is equal to the maximum controlling property,
|
||
|
// we had matches all the way through, so use this resource
|
||
|
//
|
||
|
if (nControllingProp == nMaxControllingProps)
|
||
|
{
|
||
|
nDialogId = s_DialogResourceData[nCurrentResourceFlags].pszDialogTemplate;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If we didn't find a match, return E_NOTIMPL
|
||
|
//
|
||
|
if (!nDialogId)
|
||
|
{
|
||
|
return E_NOTIMPL;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Open the dialog
|
||
|
//
|
||
|
INT_PTR nResult = DialogBoxParam( g_hInstance, MAKEINTRESOURCE(nDialogId), pDialogDeviceData->hwndParent, CScannerAcquireDialog::DialogProc, (LPARAM)pDialogDeviceData );
|
||
|
|
||
|
if (-1 == nResult)
|
||
|
{
|
||
|
//
|
||
|
// Some kind of system error occurred
|
||
|
//
|
||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||
|
|
||
|
//
|
||
|
// Make sure we return some kind of error
|
||
|
//
|
||
|
if (hr == S_OK)
|
||
|
{
|
||
|
hr = E_FAIL;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Just cast the return value to an HRESULT
|
||
|
//
|
||
|
hr = static_cast<HRESULT>(nResult);
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|