858 lines
27 KiB
C++
858 lines
27 KiB
C++
|
/*******************************************************************************
|
||
|
*
|
||
|
* (C) COPYRIGHT MICROSOFT CORPORATION, 1998
|
||
|
*
|
||
|
* TITLE: PPSCAN.CPP
|
||
|
*
|
||
|
* VERSION: 1.0
|
||
|
*
|
||
|
* AUTHOR: ShaunIv
|
||
|
*
|
||
|
* DATE: 5/17/1999
|
||
|
*
|
||
|
* DESCRIPTION:
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
#include "ppscan.h"
|
||
|
#include "resource.h"
|
||
|
#include "wiacsh.h"
|
||
|
|
||
|
//
|
||
|
// Context Help IDs
|
||
|
//
|
||
|
static const DWORD g_HelpIDs[] =
|
||
|
{
|
||
|
IDC_SCANPROP_BRIGHTNESS_PROMPT, IDH_WIA_BRIGHTNESS,
|
||
|
IDC_SCANPROP_BRIGHTNESS_SLIDER, IDH_WIA_BRIGHTNESS,
|
||
|
IDC_SCANPROP_BRIGHTNESS_EDIT, IDH_WIA_BRIGHTNESS,
|
||
|
IDC_SCANPROP_CONTRAST_PROMPT, IDH_WIA_CONTRAST,
|
||
|
IDC_SCANPROP_CONTRAST_SLIDER, IDH_WIA_CONTRAST,
|
||
|
IDC_SCANPROP_CONTRAST_EDIT, IDH_WIA_CONTRAST,
|
||
|
IDC_SCANPROP_RESOLUTION_PROMPT, IDH_WIA_PIC_RESOLUTION,
|
||
|
IDC_SCANPROP_RESOLUTION_EDIT, IDH_WIA_PIC_RESOLUTION,
|
||
|
IDC_SCANPROP_RESOLUTION_UPDOWN, IDH_WIA_PIC_RESOLUTION,
|
||
|
IDC_SCANPROP_PREVIEW, IDH_WIA_CUSTOM_PREVIEW,
|
||
|
IDC_SCANPROP_DATATYPE_PROMPT, IDH_WIA_IMAGE_TYPE,
|
||
|
IDC_SCANPROP_DATATYPE_LIST, IDH_WIA_IMAGE_TYPE,
|
||
|
IDC_SCANPROP_RESTOREDEFAULT, IDH_WIA_RESTORE_DEFAULT,
|
||
|
IDOK, IDH_OK,
|
||
|
IDCANCEL, IDH_CANCEL,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
extern HINSTANCE g_hInstance;
|
||
|
|
||
|
//
|
||
|
// These are the data types we support
|
||
|
//
|
||
|
static struct
|
||
|
{
|
||
|
int nStringId;
|
||
|
LONG nDataType;
|
||
|
UINT nPreviewWindowIntent;
|
||
|
} g_AvailableColorDepths[] =
|
||
|
{
|
||
|
{ IDS_SCANPROP_COLOR, WIA_DATA_COLOR, BCPWM_COLOR },
|
||
|
{ IDS_SCANPROP_GRAYSCALE, WIA_DATA_GRAYSCALE, BCPWM_GRAYSCALE },
|
||
|
{ IDS_SCANPROP_BLACKANDWHITE, WIA_DATA_THRESHOLD, BCPWM_BW }
|
||
|
};
|
||
|
#define AVAILABLE_COLOR_DEPTH_COUNT (sizeof(g_AvailableColorDepths)/sizeof(g_AvailableColorDepths[0]))
|
||
|
|
||
|
//
|
||
|
// If we don't have a good range of values for the brightness and contrast settings,
|
||
|
// we want to disable the preview control. This is the minumum number of values
|
||
|
// we consider useful for this purpose
|
||
|
//
|
||
|
const int CScannerCommonPropertyPage::c_nMinBrightnessAndContrastSettingCount = 10;
|
||
|
|
||
|
//
|
||
|
// The only constructor
|
||
|
//
|
||
|
CScannerCommonPropertyPage::CScannerCommonPropertyPage( HWND hWnd )
|
||
|
: m_hWnd(hWnd),
|
||
|
m_nProgrammaticSetting(0),
|
||
|
m_nControlsInUse(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
CScannerCommonPropertyPage::~CScannerCommonPropertyPage(void)
|
||
|
{
|
||
|
m_hWnd = NULL;
|
||
|
}
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnKillActive( WPARAM , LPARAM )
|
||
|
{
|
||
|
CWaitCursor wc;
|
||
|
if (!ValidateEditControls())
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
ApplySettings();
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnSetActive( WPARAM , LPARAM )
|
||
|
{
|
||
|
CWaitCursor wc;
|
||
|
Initialize();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnApply( WPARAM , LPARAM )
|
||
|
{
|
||
|
if (ApplySettings())
|
||
|
{
|
||
|
return PSNRET_NOERROR;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Tell the user there was an error
|
||
|
//
|
||
|
MessageBox( m_hWnd,
|
||
|
CSimpleString( IDS_SCANPROP_UNABLETOWRITE, g_hInstance ),
|
||
|
CSimpleString( IDS_SCANPROP_ERROR_TITLE, g_hInstance ),
|
||
|
MB_ICONINFORMATION );
|
||
|
return PSNRET_INVALID_NOCHANGEPAGE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CScannerCommonPropertyPage::SetText( HWND hWnd, LPCTSTR pszText )
|
||
|
{
|
||
|
m_nProgrammaticSetting++;
|
||
|
SetWindowText( hWnd, pszText );
|
||
|
m_nProgrammaticSetting--;
|
||
|
}
|
||
|
|
||
|
void CScannerCommonPropertyPage::SetText( HWND hWnd, LONG nNumber )
|
||
|
{
|
||
|
SetText( hWnd, CSimpleStringConvert::NumberToString( nNumber ) );
|
||
|
}
|
||
|
|
||
|
bool CScannerCommonPropertyPage::PopulateDataTypes(void)
|
||
|
{
|
||
|
//
|
||
|
// We will be successful if we can add at least one data type
|
||
|
//
|
||
|
bool bSuccess = false;
|
||
|
|
||
|
//
|
||
|
// Clear the list
|
||
|
//
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_DATATYPE_LIST, CB_RESETCONTENT, 0, 0 );
|
||
|
|
||
|
//
|
||
|
// Try to load the data types for this device
|
||
|
//
|
||
|
CSimpleDynamicArray<LONG> SupportedDataTypes;
|
||
|
LONG nCurrentDataType;
|
||
|
if (PropStorageHelpers::GetProperty( m_pIWiaItem, WIA_IPA_DATATYPE, nCurrentDataType ) &&
|
||
|
PropStorageHelpers::GetPropertyList( m_pIWiaItem, WIA_IPA_DATATYPE, SupportedDataTypes ))
|
||
|
{
|
||
|
//
|
||
|
// Loop through each of the data types we handle, and see if it is supported by the device
|
||
|
//
|
||
|
m_nInitialDataTypeSelection = 0;
|
||
|
for (int i=0;i<AVAILABLE_COLOR_DEPTH_COUNT;i++)
|
||
|
{
|
||
|
//
|
||
|
// Is this one of the data types we support?
|
||
|
//
|
||
|
if (SupportedDataTypes.Find(g_AvailableColorDepths[i].nDataType) != -1)
|
||
|
{
|
||
|
//
|
||
|
// Load the data type string and make sure it is valid
|
||
|
//
|
||
|
CSimpleString strDataTypeName( g_AvailableColorDepths[i].nStringId, g_hInstance );
|
||
|
if (strDataTypeName.Length())
|
||
|
{
|
||
|
//
|
||
|
// Add the string to the combo box
|
||
|
//
|
||
|
LRESULT nIndex = SendDlgItemMessage( m_hWnd, IDC_SCANPROP_DATATYPE_LIST, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(strDataTypeName.String()));
|
||
|
if (nIndex != CB_ERR)
|
||
|
{
|
||
|
//
|
||
|
// Save the index of the global data type struct we are using for this entry
|
||
|
//
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_DATATYPE_LIST, CB_SETITEMDATA, nIndex, i );
|
||
|
|
||
|
//
|
||
|
// Whew, we made it at least once, so we are using this control
|
||
|
//
|
||
|
bSuccess = true;
|
||
|
|
||
|
//
|
||
|
// Save the current selection and update the preview control
|
||
|
//
|
||
|
if (nCurrentDataType == g_AvailableColorDepths[i].nDataType)
|
||
|
{
|
||
|
m_nInitialDataTypeSelection = static_cast<int>(nIndex);
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_PREVIEW, BCPWM_SETINTENT, 0, g_AvailableColorDepths[i].nPreviewWindowIntent );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//
|
||
|
// Set the current selection
|
||
|
//
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_DATATYPE_LIST, CB_SETCURSEL, m_nInitialDataTypeSelection, 0 );
|
||
|
}
|
||
|
return bSuccess;
|
||
|
}
|
||
|
|
||
|
|
||
|
bool CScannerCommonPropertyPage::IsUselessPreviewRange( const CValidWiaSettings &Settings )
|
||
|
{
|
||
|
return (Settings.GetItemCount() < c_nMinBrightnessAndContrastSettingCount);
|
||
|
}
|
||
|
|
||
|
|
||
|
void CScannerCommonPropertyPage::Initialize()
|
||
|
{
|
||
|
//
|
||
|
// Make sure we don't get into an infinite loop
|
||
|
//
|
||
|
m_nProgrammaticSetting++;
|
||
|
|
||
|
//
|
||
|
// Assume we aren't using any controls at all
|
||
|
//
|
||
|
m_nControlsInUse = 0;
|
||
|
|
||
|
//
|
||
|
// Get the valid settings for brightness and set up the associated controls
|
||
|
//
|
||
|
if (!m_ValidBrightnessSettings.Read( m_pIWiaItem, WIA_IPS_BRIGHTNESS ))
|
||
|
{
|
||
|
//
|
||
|
// Disable brightness controls
|
||
|
//
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_BRIGHTNESS_PROMPT ), FALSE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_BRIGHTNESS_EDIT ), FALSE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_BRIGHTNESS_SLIDER ), FALSE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Enable brightness controls
|
||
|
//
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_BRIGHTNESS_PROMPT ), TRUE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_BRIGHTNESS_EDIT ), TRUE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_BRIGHTNESS_SLIDER ), TRUE );
|
||
|
|
||
|
m_BrightnessSliderAndEdit.Initialize(
|
||
|
GetDlgItem(m_hWnd,IDC_SCANPROP_BRIGHTNESS_SLIDER),
|
||
|
GetDlgItem(m_hWnd,IDC_SCANPROP_BRIGHTNESS_EDIT),
|
||
|
GetDlgItem(m_hWnd,IDC_SCANPROP_PREVIEW),
|
||
|
BCPWM_SETBRIGHTNESS, &m_ValidBrightnessSettings );
|
||
|
|
||
|
//
|
||
|
// Remember that we are using this control
|
||
|
//
|
||
|
m_nControlsInUse |= UsingBrightness;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get the valid settings for contrast and set up the associated controls
|
||
|
//
|
||
|
if (!m_ValidContrastSettings.Read( m_pIWiaItem, WIA_IPS_CONTRAST ))
|
||
|
{
|
||
|
//
|
||
|
// Disable contrast controls
|
||
|
//
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_CONTRAST_PROMPT ), FALSE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_CONTRAST_EDIT ), FALSE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_CONTRAST_SLIDER ), FALSE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Enable contrast controls
|
||
|
//
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_CONTRAST_PROMPT ), TRUE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_CONTRAST_EDIT ), TRUE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_CONTRAST_SLIDER ), TRUE );
|
||
|
|
||
|
m_ContrastSliderAndEdit.Initialize(
|
||
|
GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_SLIDER),
|
||
|
GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_EDIT),
|
||
|
GetDlgItem(m_hWnd,IDC_SCANPROP_PREVIEW),
|
||
|
BCPWM_SETCONTRAST, &m_ValidContrastSettings );
|
||
|
|
||
|
//
|
||
|
// Remember that we are using this control
|
||
|
//
|
||
|
m_nControlsInUse |= UsingContrast;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Should we disable resolution? Assume yes.
|
||
|
//
|
||
|
bool bDisableResolution = true;
|
||
|
|
||
|
//
|
||
|
// Figure out what the *common* list of valid settings for horizontal
|
||
|
// and vertical resolution
|
||
|
//
|
||
|
CValidWiaSettings HorizontalResolution;
|
||
|
if (HorizontalResolution.Read( m_pIWiaItem, WIA_IPS_XRES ))
|
||
|
{
|
||
|
//
|
||
|
// Y Resolution can be read-only, and be linked to X resolution
|
||
|
//
|
||
|
if (PropStorageHelpers::IsReadOnlyProperty(m_pIWiaItem, WIA_IPS_YRES))
|
||
|
{
|
||
|
m_ValidResolutionSettings = HorizontalResolution;
|
||
|
|
||
|
//
|
||
|
// If we made it this far, we have good resolution settings
|
||
|
//
|
||
|
bDisableResolution = false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CValidWiaSettings VerticalResolution;
|
||
|
if (VerticalResolution.Read( m_pIWiaItem, WIA_IPS_YRES ))
|
||
|
{
|
||
|
if (m_ValidResolutionSettings.FindIntersection(HorizontalResolution,VerticalResolution))
|
||
|
{
|
||
|
//
|
||
|
// If we made it this far, we have good resolution settings
|
||
|
//
|
||
|
bDisableResolution = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If we can't display resolution, disable it
|
||
|
//
|
||
|
if (bDisableResolution)
|
||
|
{
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_PROMPT ), FALSE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_EDIT ), FALSE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_UPDOWN ), FALSE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_PROMPT ), TRUE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_EDIT ), TRUE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_UPDOWN ), TRUE );
|
||
|
|
||
|
m_ResolutionUpDownAndEdit.Initialize(
|
||
|
GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_UPDOWN ),
|
||
|
GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_EDIT ),
|
||
|
&m_ValidResolutionSettings );
|
||
|
|
||
|
//
|
||
|
// Remember that we are using this control
|
||
|
//
|
||
|
m_nControlsInUse |= UsingResolution;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If we can't populate datatype, disable it
|
||
|
//
|
||
|
if (!PopulateDataTypes())
|
||
|
{
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_DATATYPE_PROMPT ), FALSE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_DATATYPE_LIST ), FALSE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_DATATYPE_PROMPT ), TRUE );
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_DATATYPE_LIST ), TRUE );
|
||
|
m_nControlsInUse |= UsingDataType;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// This means all controls were disabled
|
||
|
//
|
||
|
if (!m_nControlsInUse)
|
||
|
{
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_RESTOREDEFAULT ), FALSE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_RESTOREDEFAULT ), TRUE );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If we are not using brightness or contrast OR if the brightness and contrast values are not useful
|
||
|
// for presenting meaningful feedback, disable the preview control so it doesn't mislead the user.
|
||
|
//
|
||
|
if (!(m_nControlsInUse & (UsingContrast|UsingBrightness)) || IsUselessPreviewRange(m_ValidBrightnessSettings) || IsUselessPreviewRange(m_ValidContrastSettings))
|
||
|
{
|
||
|
EnableWindow( GetDlgItem( m_hWnd, IDC_SCANPROP_PREVIEW ), FALSE );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Start responding to EN_CHANGE messages again
|
||
|
//
|
||
|
m_nProgrammaticSetting--;
|
||
|
|
||
|
//
|
||
|
// Make sure the correct image is in the thumbnail
|
||
|
//
|
||
|
OnDataTypeSelChange(0,0);
|
||
|
}
|
||
|
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnInitDialog( WPARAM, LPARAM lParam )
|
||
|
{
|
||
|
//
|
||
|
// Get the WIA item
|
||
|
//
|
||
|
PROPSHEETPAGE *pPropSheetPage = reinterpret_cast<PROPSHEETPAGE*>(lParam);
|
||
|
if (pPropSheetPage)
|
||
|
{
|
||
|
m_pIWiaItem = reinterpret_cast<IWiaItem*>(pPropSheetPage->lParam);
|
||
|
}
|
||
|
if (!m_pIWiaItem)
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Load the preview control bitmaps
|
||
|
//
|
||
|
HBITMAP hBmpColor = reinterpret_cast<HBITMAP>(LoadImage(g_hInstance, MAKEINTRESOURCE(IDB_SCANPROP_BITMAPPHOTO), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ));
|
||
|
HBITMAP hBmpGrayscale = reinterpret_cast<HBITMAP>(LoadImage(g_hInstance, MAKEINTRESOURCE(IDB_SCANPROP_BITMAPGRAYSCALE), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ));
|
||
|
HBITMAP hBmpBlackAndWhite = reinterpret_cast<HBITMAP>(LoadImage(g_hInstance, MAKEINTRESOURCE(IDB_SCANPROP_BITMAPTEXT), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ));
|
||
|
|
||
|
//
|
||
|
// If they all loaded OK, set them
|
||
|
//
|
||
|
if (hBmpColor && hBmpGrayscale && hBmpBlackAndWhite)
|
||
|
{
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_PREVIEW, BCPWM_LOADIMAGE, BCPWM_COLOR, reinterpret_cast<LPARAM>(hBmpColor));
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_PREVIEW, BCPWM_LOADIMAGE, BCPWM_GRAYSCALE, reinterpret_cast<LPARAM>(hBmpGrayscale));
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_PREVIEW, BCPWM_LOADIMAGE, BCPWM_BW, reinterpret_cast<LPARAM>(hBmpBlackAndWhite));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// Otherwise delete all of the bitmaps
|
||
|
//
|
||
|
if (hBmpColor)
|
||
|
{
|
||
|
DeleteObject(hBmpColor);
|
||
|
}
|
||
|
if (hBmpGrayscale)
|
||
|
{
|
||
|
DeleteObject(hBmpGrayscale);
|
||
|
}
|
||
|
if (hBmpBlackAndWhite)
|
||
|
{
|
||
|
DeleteObject(hBmpBlackAndWhite);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnHScroll( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
WIA_PUSH_FUNCTION((TEXT("CScannerCommonPropertyPage::OnHScroll( %08X, %08X )"), wParam, lParam ));
|
||
|
if (m_nProgrammaticSetting)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Contrast
|
||
|
//
|
||
|
if (reinterpret_cast<HWND>(lParam) == GetDlgItem( m_hWnd, IDC_SCANPROP_CONTRAST_SLIDER ) )
|
||
|
{
|
||
|
m_nProgrammaticSetting++;
|
||
|
m_ContrastSliderAndEdit.HandleSliderUpdate();
|
||
|
m_nProgrammaticSetting--;
|
||
|
}
|
||
|
//
|
||
|
// Brightness
|
||
|
//
|
||
|
else if (reinterpret_cast<HWND>(lParam) == GetDlgItem( m_hWnd, IDC_SCANPROP_BRIGHTNESS_SLIDER ) )
|
||
|
{
|
||
|
m_nProgrammaticSetting++;
|
||
|
m_BrightnessSliderAndEdit.HandleSliderUpdate();
|
||
|
m_nProgrammaticSetting--;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnVScroll( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
WIA_PUSH_FUNCTION((TEXT("CScannerCommonPropertyPage::OnVScroll( %08X, %08X )"), wParam, lParam ));
|
||
|
if (m_nProgrammaticSetting)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Resolution
|
||
|
//
|
||
|
if (reinterpret_cast<HWND>(lParam) == GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_UPDOWN ) )
|
||
|
{
|
||
|
m_nProgrammaticSetting++;
|
||
|
m_ResolutionUpDownAndEdit.HandleUpDownUpdate();
|
||
|
m_nProgrammaticSetting--;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void CScannerCommonPropertyPage::OnBrightnessEditChange( WPARAM, LPARAM )
|
||
|
{
|
||
|
if (m_nProgrammaticSetting)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
m_nProgrammaticSetting++;
|
||
|
m_BrightnessSliderAndEdit.HandleEditUpdate();
|
||
|
m_nProgrammaticSetting--;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CScannerCommonPropertyPage::OnContrastEditChange( WPARAM, LPARAM )
|
||
|
{
|
||
|
if (m_nProgrammaticSetting)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
m_nProgrammaticSetting++;
|
||
|
m_ContrastSliderAndEdit.HandleEditUpdate();
|
||
|
m_nProgrammaticSetting--;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CScannerCommonPropertyPage::OnResolutionEditChange( WPARAM, LPARAM )
|
||
|
{
|
||
|
if (m_nProgrammaticSetting)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
m_nProgrammaticSetting++;
|
||
|
m_ResolutionUpDownAndEdit.HandleEditUpdate();
|
||
|
m_nProgrammaticSetting--;
|
||
|
}
|
||
|
|
||
|
void CScannerCommonPropertyPage::OnDataTypeSelChange( WPARAM, LPARAM )
|
||
|
{
|
||
|
if (m_nProgrammaticSetting)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
m_nProgrammaticSetting++;
|
||
|
int nCurSel = static_cast<int>(SendDlgItemMessage( m_hWnd, IDC_SCANPROP_DATATYPE_LIST, CB_GETCURSEL, 0, 0 ));
|
||
|
if (nCurSel != CB_ERR)
|
||
|
{
|
||
|
int nDataTypeIndex = static_cast<int>(SendDlgItemMessage( m_hWnd, IDC_SCANPROP_DATATYPE_LIST, CB_GETITEMDATA, nCurSel, 0 ));
|
||
|
if (nDataTypeIndex >= 0 && nDataTypeIndex < AVAILABLE_COLOR_DEPTH_COUNT)
|
||
|
{
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_PREVIEW, BCPWM_SETINTENT, 0, g_AvailableColorDepths[nDataTypeIndex].nPreviewWindowIntent );
|
||
|
|
||
|
if (m_nControlsInUse & UsingContrast)
|
||
|
{
|
||
|
if (BCPWM_BW == g_AvailableColorDepths[nDataTypeIndex].nPreviewWindowIntent)
|
||
|
{
|
||
|
EnableWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_PROMPT), FALSE );
|
||
|
ShowWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_PROMPT), SW_HIDE );
|
||
|
EnableWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_SLIDER), FALSE );
|
||
|
ShowWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_SLIDER), SW_HIDE );
|
||
|
EnableWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_EDIT), FALSE );
|
||
|
ShowWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_EDIT), SW_HIDE );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
EnableWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_PROMPT), TRUE );
|
||
|
ShowWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_PROMPT), SW_SHOW );
|
||
|
EnableWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_SLIDER), TRUE );
|
||
|
ShowWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_SLIDER), SW_SHOW );
|
||
|
EnableWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_EDIT), TRUE );
|
||
|
ShowWindow( GetDlgItem(m_hWnd,IDC_SCANPROP_CONTRAST_EDIT), SW_SHOW );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
m_nProgrammaticSetting--;
|
||
|
}
|
||
|
|
||
|
|
||
|
bool CScannerCommonPropertyPage::ValidateEditControls(void)
|
||
|
{
|
||
|
m_nProgrammaticSetting++;
|
||
|
|
||
|
bool bSuccess = true;
|
||
|
|
||
|
//
|
||
|
// Get and set the brightness setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingBrightness)
|
||
|
{
|
||
|
if (m_ValidBrightnessSettings.IsValid() && !m_BrightnessSliderAndEdit.ValidateEditControl())
|
||
|
{
|
||
|
m_BrightnessSliderAndEdit.HandleEditUpdate();
|
||
|
m_BrightnessSliderAndEdit.HandleSliderUpdate();
|
||
|
|
||
|
SetFocus( GetDlgItem( m_hWnd, IDC_SCANPROP_BRIGHTNESS_EDIT ) );
|
||
|
CSimpleString strMessage;
|
||
|
|
||
|
strMessage.Format( IDS_SCANPROP_INVALIDEDITVALUE, g_hInstance,
|
||
|
CSimpleString( IDS_SCANPROP_BRIGHTNESS, g_hInstance ).String() );
|
||
|
if (strMessage.Length())
|
||
|
{
|
||
|
MessageBox( m_hWnd,
|
||
|
strMessage,
|
||
|
CSimpleString( IDS_SCANPROP_ERROR_TITLE, g_hInstance ),
|
||
|
MB_ICONINFORMATION );
|
||
|
}
|
||
|
bSuccess = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get and set the contrast setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingContrast)
|
||
|
{
|
||
|
if (m_ValidContrastSettings.IsValid() && !m_ContrastSliderAndEdit.ValidateEditControl())
|
||
|
{
|
||
|
m_ContrastSliderAndEdit.HandleEditUpdate();
|
||
|
m_ContrastSliderAndEdit.HandleSliderUpdate();
|
||
|
|
||
|
SetFocus( GetDlgItem( m_hWnd, IDC_SCANPROP_CONTRAST_EDIT ) );
|
||
|
CSimpleString strMessage;
|
||
|
|
||
|
strMessage.Format( IDS_SCANPROP_INVALIDEDITVALUE, g_hInstance,
|
||
|
CSimpleString( IDS_SCANPROP_CONTRAST, g_hInstance ).String());
|
||
|
|
||
|
if (strMessage.Length())
|
||
|
{
|
||
|
MessageBox( m_hWnd,
|
||
|
strMessage,
|
||
|
CSimpleString( IDS_SCANPROP_ERROR_TITLE, g_hInstance ),
|
||
|
MB_ICONINFORMATION );
|
||
|
}
|
||
|
bSuccess = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get and set the resolution setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingResolution)
|
||
|
{
|
||
|
if (m_ValidResolutionSettings.IsValid() && !m_ResolutionUpDownAndEdit.ValidateEditControl())
|
||
|
{
|
||
|
m_ResolutionUpDownAndEdit.HandleEditUpdate();
|
||
|
m_ResolutionUpDownAndEdit.HandleUpDownUpdate();
|
||
|
|
||
|
SetFocus( GetDlgItem( m_hWnd, IDC_SCANPROP_RESOLUTION_EDIT ) );
|
||
|
CSimpleString strMessage;
|
||
|
|
||
|
strMessage.Format( IDS_SCANPROP_INVALIDEDITVALUE, g_hInstance,
|
||
|
CSimpleString( IDS_SCANPROP_RESOLUTION, g_hInstance ).String());
|
||
|
|
||
|
if (strMessage.Length())
|
||
|
{
|
||
|
MessageBox( m_hWnd,
|
||
|
strMessage,
|
||
|
CSimpleString( IDS_SCANPROP_ERROR_TITLE, g_hInstance ),
|
||
|
MB_ICONINFORMATION );
|
||
|
}
|
||
|
bSuccess = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If we made it this far, we're OK
|
||
|
//
|
||
|
m_nProgrammaticSetting--;
|
||
|
|
||
|
return bSuccess;
|
||
|
}
|
||
|
|
||
|
bool CScannerCommonPropertyPage::ApplySettings(void)
|
||
|
{
|
||
|
//
|
||
|
// Get and set the brightness setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingBrightness)
|
||
|
{
|
||
|
LONG nBrightness = m_BrightnessSliderAndEdit.GetValueFromCurrentPos();
|
||
|
if (!PropStorageHelpers::SetProperty( m_pIWiaItem, WIA_IPS_BRIGHTNESS, nBrightness ))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get and set the contrast setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingBrightness)
|
||
|
{
|
||
|
LONG nContrast = m_ContrastSliderAndEdit.GetValueFromCurrentPos();
|
||
|
if (!PropStorageHelpers::SetProperty( m_pIWiaItem, WIA_IPS_CONTRAST, nContrast ))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Get and set the resolution setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingResolution)
|
||
|
{
|
||
|
LONG nResolution = m_ResolutionUpDownAndEdit.GetValueFromCurrentPos();
|
||
|
if (!PropStorageHelpers::SetProperty( m_pIWiaItem, WIA_IPS_XRES, nResolution ) ||
|
||
|
(!PropStorageHelpers::IsReadOnlyProperty( m_pIWiaItem, WIA_IPS_YRES ) && !PropStorageHelpers::SetProperty( m_pIWiaItem, WIA_IPS_YRES, nResolution )))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Get, validate and set the data type setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingDataType)
|
||
|
{
|
||
|
int nCurSel = static_cast<int>(SendDlgItemMessage( m_hWnd, IDC_SCANPROP_DATATYPE_LIST, CB_GETCURSEL, 0, 0 ));
|
||
|
if (nCurSel != CB_ERR)
|
||
|
{
|
||
|
int nDataTypeIndex = static_cast<int>(SendDlgItemMessage( m_hWnd, IDC_SCANPROP_DATATYPE_LIST, CB_GETITEMDATA, nCurSel, 0 ));
|
||
|
if (nDataTypeIndex >= 0 && nDataTypeIndex < AVAILABLE_COLOR_DEPTH_COUNT)
|
||
|
{
|
||
|
LONG nDataType = g_AvailableColorDepths[nDataTypeIndex].nDataType;
|
||
|
if (!PropStorageHelpers::SetProperty( m_pIWiaItem, WIA_IPA_DATATYPE, nDataType ))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If we made it this far, we're OK
|
||
|
//
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void CScannerCommonPropertyPage::OnRestoreDefault( WPARAM, LPARAM )
|
||
|
{
|
||
|
//
|
||
|
// Ignore EN_CHANGE messages
|
||
|
//
|
||
|
m_nProgrammaticSetting++;
|
||
|
|
||
|
//
|
||
|
// Restore the brightness setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingBrightness)
|
||
|
{
|
||
|
m_BrightnessSliderAndEdit.Restore();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Restore the contrast setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingContrast)
|
||
|
{
|
||
|
m_ContrastSliderAndEdit.Restore();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Restore the resolution setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingResolution)
|
||
|
{
|
||
|
m_ResolutionUpDownAndEdit.Restore();
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Restore the data type setting
|
||
|
//
|
||
|
if (m_nControlsInUse & UsingDataType)
|
||
|
{
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_DATATYPE_LIST, CB_SETCURSEL, m_nInitialDataTypeSelection, 0 );
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_PREVIEW, BCPWM_SETINTENT, 0, g_AvailableColorDepths[m_nInitialDataTypeSelection].nPreviewWindowIntent );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// OK, start handling user input
|
||
|
//
|
||
|
m_nProgrammaticSetting--;
|
||
|
|
||
|
//
|
||
|
// Force an update of the data type controls
|
||
|
//
|
||
|
OnDataTypeSelChange(0,0);
|
||
|
}
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnHelp( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
return WiaHelp::HandleWmHelp( wParam, lParam, g_HelpIDs );
|
||
|
}
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnContextMenu( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
return WiaHelp::HandleWmContextMenu( wParam, lParam, g_HelpIDs );
|
||
|
}
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnSysColorChange( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_BRIGHTNESS_SLIDER, WM_SYSCOLORCHANGE, wParam, lParam );
|
||
|
SendDlgItemMessage( m_hWnd, IDC_SCANPROP_CONTRAST_SLIDER, WM_SYSCOLORCHANGE, wParam, lParam );
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnNotify( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
SC_BEGIN_NOTIFY_MESSAGE_HANDLERS()
|
||
|
{
|
||
|
SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_APPLY, OnApply);
|
||
|
SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_KILLACTIVE,OnKillActive);
|
||
|
SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_SETACTIVE,OnSetActive);
|
||
|
}
|
||
|
SC_END_NOTIFY_MESSAGE_HANDLERS();
|
||
|
}
|
||
|
|
||
|
LRESULT CScannerCommonPropertyPage::OnCommand( WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
SC_BEGIN_COMMAND_HANDLERS()
|
||
|
{
|
||
|
SC_HANDLE_COMMAND_NOTIFY(EN_CHANGE,IDC_SCANPROP_BRIGHTNESS_EDIT,OnBrightnessEditChange);
|
||
|
SC_HANDLE_COMMAND_NOTIFY(EN_CHANGE,IDC_SCANPROP_CONTRAST_EDIT,OnContrastEditChange);
|
||
|
SC_HANDLE_COMMAND_NOTIFY(EN_CHANGE,IDC_SCANPROP_RESOLUTION_EDIT,OnResolutionEditChange);
|
||
|
SC_HANDLE_COMMAND_NOTIFY(CBN_SELCHANGE,IDC_SCANPROP_DATATYPE_LIST,OnDataTypeSelChange);
|
||
|
SC_HANDLE_COMMAND( IDC_SCANPROP_RESTOREDEFAULT, OnRestoreDefault );
|
||
|
}
|
||
|
SC_END_COMMAND_HANDLERS();
|
||
|
}
|
||
|
|
||
|
|
||
|
INT_PTR CALLBACK CScannerCommonPropertyPage::DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
|
||
|
{
|
||
|
SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CScannerCommonPropertyPage)
|
||
|
{
|
||
|
SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog );
|
||
|
SC_HANDLE_DIALOG_MESSAGE( WM_NOTIFY, OnNotify );
|
||
|
SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand );
|
||
|
SC_HANDLE_DIALOG_MESSAGE( WM_HSCROLL, OnHScroll );
|
||
|
SC_HANDLE_DIALOG_MESSAGE( WM_VSCROLL, OnVScroll );
|
||
|
SC_HANDLE_DIALOG_MESSAGE( WM_HELP, OnHelp );
|
||
|
SC_HANDLE_DIALOG_MESSAGE( WM_CONTEXTMENU, OnContextMenu );
|
||
|
SC_HANDLE_DIALOG_MESSAGE( WM_SYSCOLORCHANGE, OnSysColorChange );
|
||
|
}
|
||
|
SC_END_DIALOG_MESSAGE_HANDLERS();
|
||
|
}
|
||
|
|
||
|
|