/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORPORATION, 1998 * * TITLE: SCANSEL.CPP * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 9/28/1999 * * DESCRIPTION: Scanner region selection (preview) page * *******************************************************************************/ #include "precomp.h" #pragma hdrstop #include "scansel.h" #include "simcrack.h" #include "resource.h" #include "simstr.h" #include "mboxex.h" #include "createtb.h" #include #define IDC_SCANSEL_SELECTION_BUTTON_BAR 1100 #define IDC_SCANSEL_SHOW_SELECTION 1200 #define IDC_SCANSEL_SHOW_BED 1201 // // Associate a document handling flag with a string resource // static const struct { int nFlag; int nStringId; } g_SupportedDocumentHandlingTypes[] = { { FLATBED, IDS_SCANSEL_FLATBED }, { FEEDER, IDS_SCANSEL_ADF } }; static const int g_SupportedDocumentHandlingTypesCount = ARRAYSIZE(g_SupportedDocumentHandlingTypes); // // Associate an icon control's resource id with a radio button's resource id // static const struct { int nIconId; int nRadioId; } gs_IntentRadioButtonIconPairs[] = { { IDC_SCANSEL_ICON_1, IDC_SCANSEL_INTENT_1 }, { IDC_SCANSEL_ICON_2, IDC_SCANSEL_INTENT_2 }, { IDC_SCANSEL_ICON_3, IDC_SCANSEL_INTENT_3 }, { IDC_SCANSEL_ICON_4, IDC_SCANSEL_INTENT_4 } }; static const int gs_nCountIntentRadioButtonIconPairs = ARRAYSIZE(gs_IntentRadioButtonIconPairs); // // Sole constructor // CScannerSelectionPage::CScannerSelectionPage( HWND hWnd ) : m_hWnd(hWnd), m_pControllerWindow(NULL), m_nThreadNotificationMessage(RegisterWindowMessage(STR_THREAD_NOTIFICATION_MESSAGE)), m_nWiaEventMessage(RegisterWindowMessage(STR_WIAEVENT_NOTIFICATION_MESSAGE)), m_hBitmapDefaultPreviewBitmap(NULL), m_bAllowRegionPreview(false), m_hwndPreview(NULL), m_hwndSelectionToolbar(NULL), m_hwndRescan(NULL), m_ScannerSelectionButtonBarBitmapInfo( g_hInstance, IDB_SCANSEL_TOOLBAR ) { ZeroMemory( &m_sizeDocfeed, sizeof(m_sizeDocfeed) ); ZeroMemory( &m_sizeFlatbed, sizeof(m_sizeFlatbed) ); } // // Destructor // CScannerSelectionPage::~CScannerSelectionPage(void) { m_hWnd = NULL; m_pControllerWindow = NULL; // // Free the paper sizes // if (m_pPaperSizes) { CComPtr pWiaScannerPaperSizes; HRESULT hr = CoCreateInstance( CLSID_WiaDefaultUi, NULL, CLSCTX_INPROC_SERVER, IID_IWiaScannerPaperSizes, (void**)&pWiaScannerPaperSizes ); if (SUCCEEDED(hr)) { hr = pWiaScannerPaperSizes->FreePaperSizes( &m_pPaperSizes, &m_nPaperSizeCount ); } } } // // Calculate the maximum scan size using the give DPI // static bool GetFullResolution( IWiaItem *pWiaItem, LONG nResX, LONG nResY, LONG &nExtX, LONG &nExtY ) { WIA_PUSHFUNCTION(TEXT("CScannerItem::GetFullResolution")); CComPtr pRootItem; if (SUCCEEDED(pWiaItem->GetRootItem(&pRootItem)) && pRootItem) { LONG lBedSizeX, lBedSizeY; if (PropStorageHelpers::GetProperty( pRootItem, WIA_DPS_HORIZONTAL_BED_SIZE, lBedSizeX ) && PropStorageHelpers::GetProperty( pRootItem, WIA_DPS_VERTICAL_BED_SIZE, lBedSizeY )) { nExtX = WiaUiUtil::MulDivNoRound( nResX, lBedSizeX, 1000 ); nExtY = WiaUiUtil::MulDivNoRound( nResY, lBedSizeY, 1000 ); return(true); } } return(false); } // // Calculate the maximum scan size using the give DPI // static bool GetBedAspectRatio( IWiaItem *pWiaItem, LONG &nResX, LONG &nResY ) { WIA_PUSHFUNCTION(TEXT("CScannerItem::GetFullResolution")); nResX = nResY = 0; if (pWiaItem) { CComPtr pRootItem; if (SUCCEEDED(pWiaItem->GetRootItem(&pRootItem)) && pRootItem) { if (PropStorageHelpers::GetProperty( pRootItem, WIA_DPS_HORIZONTAL_BED_SIZE, nResX ) && PropStorageHelpers::GetProperty( pRootItem, WIA_DPS_VERTICAL_BED_SIZE, nResY )) { return true; } } } return(false); } bool CScannerSelectionPage::ApplyCurrentPreviewWindowSettings(void) { WIA_PUSHFUNCTION(TEXT("CScannerSelectionPage::ApplyCurrentPreviewWindowSettings")); CWiaItem *pWiaItem = GetActiveScannerItem(); if (pWiaItem) { CWiaItem::CScanRegionSettings &ScanRegionSettings = pWiaItem->ScanRegionSettings(); // // m_hwndPreview will be NULL if the preview control is not active // if (m_hwndPreview) { // // Get the current resolution // SIZE sizeCurrentResolution; if (PropStorageHelpers::GetProperty( pWiaItem->WiaItem(), WIA_IPS_XRES, sizeCurrentResolution.cx ) && PropStorageHelpers::GetProperty( pWiaItem->WiaItem(), WIA_IPS_YRES, sizeCurrentResolution.cy )) { // // Compute the full page resolution of the item // if (GetFullResolution( pWiaItem->WiaItem(), sizeCurrentResolution.cx, sizeCurrentResolution.cy, ScanRegionSettings.sizeResolution.cx, ScanRegionSettings.sizeResolution.cy )) { // // Set the resolution in the preview control // WiaPreviewControl_SetResolution( m_hwndPreview, &ScanRegionSettings.sizeResolution ); // // Save the origin and extents // WiaPreviewControl_GetSelOrigin( m_hwndPreview, 0, FALSE, &ScanRegionSettings.ptOrigin ); WiaPreviewControl_GetSelExtent( m_hwndPreview, 0, FALSE, &ScanRegionSettings.sizeExtent ); WIA_TRACE((TEXT("ScanRegionSettings.sizeExtent: (%d,%d)"), ScanRegionSettings.sizeExtent.cx, ScanRegionSettings.sizeExtent.cy )); // // Set the origin and extents. We don't set them directly, because they might not be a correct multiple // if (CValidWiaSettings::SetNumericPropertyOnBoundary( pWiaItem->WiaItem(), WIA_IPS_XPOS, ScanRegionSettings.ptOrigin.x )) { if (CValidWiaSettings::SetNumericPropertyOnBoundary( pWiaItem->WiaItem(), WIA_IPS_YPOS, ScanRegionSettings.ptOrigin.y )) { if (CValidWiaSettings::SetNumericPropertyOnBoundary( pWiaItem->WiaItem(), WIA_IPS_XEXTENT, ScanRegionSettings.sizeExtent.cx )) { if (CValidWiaSettings::SetNumericPropertyOnBoundary( pWiaItem->WiaItem(), WIA_IPS_YEXTENT, ScanRegionSettings.sizeExtent.cy )) { return true; } else { WIA_ERROR((TEXT("PropStorageHelpers::SetProperty on WIA_IPS_YEXTENT failed"))); } } else { WIA_ERROR((TEXT("PropStorageHelpers::SetProperty on WIA_IPS_XEXTENT failed"))); } } else { WIA_ERROR((TEXT("PropStorageHelpers::SetProperty on WIA_IPS_YPOS failed"))); } } else { WIA_ERROR((TEXT("PropStorageHelpers::SetProperty on WIA_IPS_XPOS failed"))); } } } } } return false; } // // PSN_WIZNEXT // LRESULT CScannerSelectionPage::OnWizNext( WPARAM, LPARAM ) { WIA_PUSHFUNCTION(TEXT("CScannerSelectionPage::OnWizNext")); CWiaItem *pWiaItem = GetActiveScannerItem(); if (pWiaItem) { pWiaItem->CustomPropertyStream().WriteToRegistry( pWiaItem->WiaItem(), HKEY_CURRENT_USER, REGSTR_PATH_USER_SETTINGS_WIAACMGR, REGSTR_KEYNAME_USER_SETTINGS_WIAACMGR ); } // // Assume we'll use the preview window's settings, instead of the page size // bool bUsePreviewSettings = true; // // Assume there has been a problem // bool bSucceeded = false; // // Make sure we have all valid data // if (m_pControllerWindow->m_pWiaItemRoot && pWiaItem && pWiaItem->WiaItem()) { // // Apply the current intent // if (ApplyCurrentIntent()) { // // Find out if we're in the ADF capable dialog // HWND hWndPaperSize = GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSIZE ); if (hWndPaperSize) { WIA_TRACE((TEXT("ADF Mode"))); // // See if we are in document feeder mode // if (InDocFeedMode()) { // // Get the selected paper size // LRESULT nCurSel = SendMessage( hWndPaperSize, CB_GETCURSEL, 0, 0 ); if (CB_ERR != nCurSel) { // // Which entry in the global paper size table is it? // LRESULT nPaperSizeIndex = SendMessage( hWndPaperSize, CB_GETITEMDATA, nCurSel, 0 ); if (CB_ERR != nPaperSizeIndex) { // // If we have a valid page size // if (m_pPaperSizes[nPaperSizeIndex].nWidth && m_pPaperSizes[nPaperSizeIndex].nHeight) { // // We won't be using the preview window // bUsePreviewSettings = false; // // Assume upper-left registration // POINT ptOrigin = { 0, 0 }; SIZE sizeExtent = { m_pPaperSizes[nPaperSizeIndex].nWidth, m_pPaperSizes[nPaperSizeIndex].nHeight }; // // Get the registration, and shift the coordinates as necessary // LONG nSheetFeederRegistration; if (!PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_SHEET_FEEDER_REGISTRATION, nSheetFeederRegistration )) { nSheetFeederRegistration = LEFT_JUSTIFIED; } if (nSheetFeederRegistration == CENTERED) { ptOrigin.x = (m_sizeDocfeed.cx - sizeExtent.cx) / 2; } else if (nSheetFeederRegistration == RIGHT_JUSTIFIED) { ptOrigin.x = m_sizeDocfeed.cx - sizeExtent.cx; } // // Get the current resolution, so we can calculate the full-bed resolution in terms of the current DPI // LONG nXRes = 0, nYRes = 0; if (PropStorageHelpers::GetProperty( pWiaItem->WiaItem(), WIA_IPS_XRES, nXRes ) && PropStorageHelpers::GetProperty( pWiaItem->WiaItem(), WIA_IPS_YRES, nYRes )) { // // Make sure these are valid resolution settings // if (nXRes && nYRes) { // // Calculate the full bed resolution in the current DPI // SIZE sizeFullBedResolution = { 0, 0 }; sizeFullBedResolution.cx = WiaUiUtil::MulDivNoRound( nXRes, m_sizeDocfeed.cx, 1000 ); sizeFullBedResolution.cy = WiaUiUtil::MulDivNoRound( nYRes, m_sizeDocfeed.cy, 1000 ); // // Make sure these resolution numbers are valid // if (sizeFullBedResolution.cx && sizeFullBedResolution.cy) { // // Calculate the origin and extent in terms of the current DPI // ptOrigin.x = WiaUiUtil::MulDivNoRound( ptOrigin.x, sizeFullBedResolution.cx, m_sizeDocfeed.cx ); ptOrigin.y = WiaUiUtil::MulDivNoRound( ptOrigin.y, sizeFullBedResolution.cy, m_sizeDocfeed.cy ); sizeExtent.cx = WiaUiUtil::MulDivNoRound( sizeExtent.cx, sizeFullBedResolution.cx, m_sizeDocfeed.cx ); sizeExtent.cy = WiaUiUtil::MulDivNoRound( sizeExtent.cy, sizeFullBedResolution.cy, m_sizeDocfeed.cy ); // // Write the properties // if (PropStorageHelpers::SetProperty( pWiaItem->WiaItem(), WIA_IPS_XPOS, ptOrigin.x ) && PropStorageHelpers::SetProperty( pWiaItem->WiaItem(), WIA_IPS_YPOS, ptOrigin.y ) && PropStorageHelpers::SetProperty( pWiaItem->WiaItem(), WIA_IPS_XEXTENT, sizeExtent.cx ) && PropStorageHelpers::SetProperty( pWiaItem->WiaItem(), WIA_IPS_YEXTENT, sizeExtent.cy )) { // // Tell the scanner to scan from the ADF and to scan one page only // if (PropStorageHelpers::SetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_DOCUMENT_HANDLING_SELECT, FEEDER ) && PropStorageHelpers::SetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_PAGES, 1 )) { // // Everything seemed to work. This item is ready for transfer. // bSucceeded = true; } } } } } } } } } } // // m_hwndPreview will be NULL if the preview control is not active // else if (!m_hwndPreview) { WIA_TRACE((TEXT("Scrollfed scanner"))); // // Set the origin to 0,0 and the extent to max,0 // // // Get the current x resolution, so we can calculate the full-bed width in terms of the current DPI // LONG nXRes = 0; if (PropStorageHelpers::GetProperty( pWiaItem->WiaItem(), WIA_IPS_XRES, nXRes )) { // // Make sure this is a valid resolution // if (nXRes) { // // Calculate the full bed resolution in the current DPI // LONG nWidth = WiaUiUtil::MulDivNoRound( nXRes, m_sizeDocfeed.cx, 1000 ); if (nWidth) { PropStorageHelpers::SetProperty( pWiaItem->WiaItem(), WIA_IPS_XPOS, 0 ); PropStorageHelpers::SetProperty( pWiaItem->WiaItem(), WIA_IPS_YPOS, 0 ); PropStorageHelpers::SetProperty( pWiaItem->WiaItem(), WIA_IPS_XEXTENT, nWidth ); PropStorageHelpers::SetProperty( pWiaItem->WiaItem(), WIA_IPS_YEXTENT, 0 ); PropStorageHelpers::SetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_PAGES, 1 ); bUsePreviewSettings = false; bSucceeded = true; } } } } // // If we are scanning from the flatbed, apply the preview window settings // if (bUsePreviewSettings) { // // Tell the scanner to scan from the flatbed and and clear the page count // PropStorageHelpers::SetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_DOCUMENT_HANDLING_SELECT, FLATBED ); PropStorageHelpers::SetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_PAGES, 0 ); // // Get the origin and extent from the preview control // if (ApplyCurrentPreviewWindowSettings()) { // // Everything seemed to work. This item is ready for transfer. // bSucceeded = true; } } else { // // Clear the preview bitmap. It won't be doing us any good anyway. // pWiaItem->BitmapImage(NULL); } } } if (!bSucceeded) { // // If that icky code above failed, tell the user and let them try again // CMessageBoxEx::MessageBox( m_hWnd, CSimpleString( IDS_ERROR_SETTING_PROPS, g_hInstance ), CSimpleString( IDS_ERROR_TITLE, g_hInstance ), CMessageBoxEx::MBEX_ICONINFORMATION ); return -1; } return 0; } // // PSN_WIZBACK // LRESULT CScannerSelectionPage::OnWizBack( WPARAM, LPARAM ) { return 0; } // // PSN_SETACTIVE // LRESULT CScannerSelectionPage::OnSetActive( WPARAM, LPARAM ) { // // Make sure we have a valid controller window // if (!m_pControllerWindow) { return -1; } int nWizButtons = PSWIZB_NEXT; // // Only enable "back" if the first page is available // if (!m_pControllerWindow->SuppressFirstPage()) { nWizButtons |= PSWIZB_BACK; } // // Set the buttons // PropSheet_SetWizButtons( GetParent(m_hWnd), nWizButtons ); // // We do want to exit on disconnect if we are on this page // m_pControllerWindow->m_OnDisconnect = CAcquisitionManagerControllerWindow::OnDisconnectGotoLastpage|CAcquisitionManagerControllerWindow::OnDisconnectFailDownload|CAcquisitionManagerControllerWindow::OnDisconnectFailUpload|CAcquisitionManagerControllerWindow::OnDisconnectFailDelete; // // Make sure the preview related controls accurately reflect the current settings // UpdateControlState(); return 0; } CWiaItem *CScannerSelectionPage::GetActiveScannerItem(void) { // Return (for now) the first image in the list if (m_pControllerWindow->m_pCurrentScannerItem) { return m_pControllerWindow->m_pCurrentScannerItem; } return NULL; } bool CScannerSelectionPage::InPreviewMode(void) { bool bResult = false; if (m_hwndSelectionToolbar) { bResult = (SendMessage(m_hwndSelectionToolbar,TB_GETSTATE,IDC_SCANSEL_SHOW_SELECTION,0) & TBSTATE_CHECKED); } return bResult; } void CScannerSelectionPage::OnRescan( WPARAM, LPARAM ) { if (!ApplyCurrentIntent()) { // // Tell the user it failed, and to try again // CMessageBoxEx::MessageBox( m_hWnd, CSimpleString( IDS_ERROR_SETTING_PROPS, g_hInstance ), CSimpleString( IDS_ERROR_TITLE, g_hInstance ), CMessageBoxEx::MBEX_ICONINFORMATION ); return; } CWiaItem *pWiaItem = GetActiveScannerItem(); if (pWiaItem) { // // Turn off preview mode and disable all the controls // if (m_hwndPreview) { WiaPreviewControl_SetPreviewMode( m_hwndPreview, FALSE ); } EnableControls(FALSE); // // Clear the cancel event // m_PreviewScanCancelEvent.Reset(); // // If PerformPreviewScan fails, we won't get any messages, so return all controls to their normal state // if (!m_pControllerWindow->PerformPreviewScan( pWiaItem, m_PreviewScanCancelEvent.Event() )) { // // Restore the preview mode and re-enable the controls // if (m_hwndPreview && m_hwndSelectionToolbar) { WiaPreviewControl_SetPreviewMode( m_hwndPreview, InPreviewMode() ); } EnableControls(TRUE); } } } bool CScannerSelectionPage::ApplyCurrentIntent(void) { CWaitCursor wc; CWiaItem *pCurItem = GetActiveScannerItem(); if (pCurItem) { for (int i=0;i(GetWindowLongPtr( GetDlgItem( m_hWnd, gs_IntentRadioButtonIconPairs[i].nRadioId ), GWLP_USERDATA ) ); if (lIntent) // This is a normal intent { if (pCurItem->SavedPropertyStream().IsValid()) { if (!SUCCEEDED(pCurItem->SavedPropertyStream().ApplyToWiaItem( pCurItem->WiaItem()))) { return false; } } if (PropStorageHelpers::SetProperty( pCurItem->WiaItem(), WIA_IPS_CUR_INTENT, lIntent ) && PropStorageHelpers::SetProperty( pCurItem->WiaItem(), WIA_IPS_CUR_INTENT, 0 )) { return true; } } else if (pCurItem->CustomPropertyStream().IsValid()) // This is the "custom" intent { return(SUCCEEDED(pCurItem->CustomPropertyStream().ApplyToWiaItem(pCurItem->WiaItem()))); } break; } } } return false; } void CScannerSelectionPage::InitializeIntents(void) { static const struct { int nIconId; int nStringId; LONG_PTR nIntent; } s_Intents[] = { { IDI_CPHOTO, IDS_SCANSEL_COLORPHOTO, WIA_INTENT_IMAGE_TYPE_COLOR}, { IDI_BWPHOTO, IDS_SCANSEL_BW, WIA_INTENT_IMAGE_TYPE_GRAYSCALE}, { IDI_TEXT, IDS_SCANSEL_TEXT, WIA_INTENT_IMAGE_TYPE_TEXT}, { IDI_CUSTOM, IDS_SCANSEL_CUSTOM, 0} }; static const int s_nIntents = ARRAYSIZE(s_Intents); // // We are going to hide all of the controls we don't use // int nCurControlSet = 0; CWiaItem *pCurItem = GetActiveScannerItem(); if (pCurItem) { LONG nIntents; if (PropStorageHelpers::GetPropertyFlags( pCurItem->WiaItem(), WIA_IPS_CUR_INTENT, nIntents )) { for (int i=0;i(LoadImage( g_hInstance, MAKEINTRESOURCE(s_Intents[i].nIconId), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR )); SendDlgItemMessage( m_hWnd, gs_IntentRadioButtonIconPairs[nCurControlSet].nIconId, STM_SETICON, reinterpret_cast(hIcon), 0 ); CSimpleString( s_Intents[i].nStringId, g_hInstance ).SetWindowText( GetDlgItem( m_hWnd, gs_IntentRadioButtonIconPairs[nCurControlSet].nRadioId ) ); // // Only add the intent if there is one. If we don't add it, it will be 0, signifying that we should use the custom settings // if (s_Intents[i].nIntent) { // // Add in the WIA_INTENT_MINIMIZE_SIZE flag, to ensure the size is not too large // SetWindowLongPtr( GetDlgItem( m_hWnd, gs_IntentRadioButtonIconPairs[nCurControlSet].nRadioId ), GWLP_USERDATA, (s_Intents[i].nIntent|WIA_INTENT_MINIMIZE_SIZE)); } nCurControlSet++; } } } // // Set the default intent to be the first in the list // SetIntentCheck(static_cast(GetWindowLongPtr(GetDlgItem(m_hWnd, gs_IntentRadioButtonIconPairs[0].nRadioId ), GWLP_USERDATA ))); // // Get the saved property stream // pCurItem->SavedPropertyStream().AssignFromWiaItem(pCurItem->WiaItem()); // // Try to get our persisted settings and set them. If an error occurs, we will get new custom settings. // if (!pCurItem->CustomPropertyStream().ReadFromRegistry( pCurItem->WiaItem(), HKEY_CURRENT_USER, REGSTR_PATH_USER_SETTINGS_WIAACMGR, REGSTR_KEYNAME_USER_SETTINGS_WIAACMGR ) || FAILED(pCurItem->CustomPropertyStream().ApplyToWiaItem(pCurItem->WiaItem()))) { // // Apply the current intent before getting the new custom intent // ApplyCurrentIntent(); // // Get the default custom property stream // pCurItem->CustomPropertyStream().AssignFromWiaItem(pCurItem->WiaItem()); } } // // Hide the controls we didn't use // for (int i=nCurControlSet;im_nScannerType == CAcquisitionManagerControllerWindow::ScannerTypeScrollFed) { bShowPreview = FALSE; } else { // // If we are in feeder mode, we won't show the preview UNLESS the driver explicitly tells us to do so. // LONG nCurrentPaperSource = 0; if (PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_DOCUMENT_HANDLING_SELECT, static_cast(nCurrentPaperSource))) { if (FEEDER & nCurrentPaperSource) { WIA_TRACE((TEXT("FEEDER == nCurrentPaperSource"))); m_bAllowRegionPreview = false; // // Remove the tabstop setting from the preview control if we are in feeder mode // SetWindowLongPtr( m_hwndPreview, GWL_STYLE, GetWindowLongPtr( m_hwndPreview, GWL_STYLE ) & ~WS_TABSTOP ); LONG nShowPreviewControl = WIA_DONT_SHOW_PREVIEW_CONTROL; if (PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_SHOW_PREVIEW_CONTROL, static_cast(nShowPreviewControl))) { WIA_TRACE((TEXT("WIA_DPS_SHOW_PREVIEW_CONTROL = %d"),nShowPreviewControl)); if (WIA_DONT_SHOW_PREVIEW_CONTROL == nShowPreviewControl) { bShowPreview = FALSE; } } else { WIA_TRACE((TEXT("WIA_DPS_SHOW_PREVIEW_CONTROL was not available"))); bShowPreview = FALSE; } } else { // // Enable preview in flatbed mode // m_bAllowRegionPreview = false; CWiaItem *pWiaItem = GetActiveScannerItem(); if (pWiaItem && pWiaItem->BitmapImage()) { m_bAllowRegionPreview = true; } // // Add the tabstop setting to the preview control if we are in flatbed mode // SetWindowLongPtr( m_hwndPreview, GWL_STYLE, GetWindowLongPtr( m_hwndPreview, GWL_STYLE ) | WS_TABSTOP ); } } else { WIA_TRACE((TEXT("WIA_DPS_DOCUMENT_HANDLING_SELECT is not available"))); } } // // Update the preview related controls // WIA_TRACE((TEXT("bShowPreview = %d"), bShowPreview )); if (bShowPreview) { ShowControl( IDC_SCANSEL_PREVIEW, TRUE ); ShowControl( IDC_SCANSEL_SELECTION_BUTTON_BAR, TRUE ); ShowControl( IDC_SCANSEL_RESCAN, TRUE ); EnableControl( IDC_SCANSEL_PREVIEW, TRUE ); if (m_bAllowRegionPreview) { ToolbarHelper::EnableToolbarButton( GetDlgItem( m_hWnd, IDC_SCANSEL_SELECTION_BUTTON_BAR ), IDC_SCANSEL_SHOW_SELECTION, true ); ToolbarHelper::EnableToolbarButton( GetDlgItem( m_hWnd, IDC_SCANSEL_SELECTION_BUTTON_BAR ), IDC_SCANSEL_SHOW_BED, true ); } else { ToolbarHelper::EnableToolbarButton( GetDlgItem( m_hWnd, IDC_SCANSEL_SELECTION_BUTTON_BAR ), IDC_SCANSEL_SHOW_SELECTION, false ); ToolbarHelper::EnableToolbarButton( GetDlgItem( m_hWnd, IDC_SCANSEL_SELECTION_BUTTON_BAR ), IDC_SCANSEL_SHOW_BED, false ); } EnableControl( IDC_SCANSEL_RESCAN, TRUE ); m_hwndPreview = GetDlgItem( m_hWnd, IDC_SCANSEL_PREVIEW ); m_hwndSelectionToolbar = GetDlgItem( m_hWnd, IDC_SCANSEL_SELECTION_BUTTON_BAR ); m_hwndRescan = GetDlgItem( m_hWnd, IDC_SCANSEL_RESCAN ); PropSheet_SetHeaderSubTitle( GetParent(m_hWnd), PropSheet_HwndToIndex( GetParent(m_hWnd), m_hWnd ), CSimpleString( IDS_SCANNER_SELECT_SUBTITLE, g_hInstance ).String() ); } else { ShowControl( IDC_SCANSEL_PREVIEW, FALSE ); ShowControl( IDC_SCANSEL_SELECTION_BUTTON_BAR, FALSE ); ShowControl( IDC_SCANSEL_RESCAN, FALSE ); m_hwndPreview = NULL; m_hwndSelectionToolbar = NULL; m_hwndRescan = NULL; PropSheet_SetHeaderSubTitle( GetParent(m_hWnd), PropSheet_HwndToIndex( GetParent(m_hWnd), m_hWnd ), CSimpleString( IDS_SCANNER_SELECT_SUBTITLE_NO_PREVIEW, g_hInstance ).String() ); } } LRESULT CScannerSelectionPage::OnInitDialog( WPARAM, LPARAM lParam ) { // // Make sure this starts out NULL // m_pControllerWindow = NULL; // // Get the PROPSHEETPAGE.lParam // PROPSHEETPAGE *pPropSheetPage = reinterpret_cast(lParam); if (pPropSheetPage) { m_pControllerWindow = reinterpret_cast(pPropSheetPage->lParam); if (m_pControllerWindow) { m_pControllerWindow->m_WindowList.Add(m_hWnd); } } // // Bail out // if (!m_pControllerWindow) { EndDialog(m_hWnd,IDCANCEL); return -1; } // // Dismiss the progress dialog if it is still up // if (m_pControllerWindow->m_pWiaProgressDialog) { m_pControllerWindow->m_pWiaProgressDialog->Destroy(); m_pControllerWindow->m_pWiaProgressDialog = NULL; } if (m_pControllerWindow->m_pWiaItemRoot) { // // Get the flatbed aspect ratio // PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_HORIZONTAL_BED_SIZE, m_sizeFlatbed.cx ); PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_VERTICAL_BED_SIZE, m_sizeFlatbed.cy ); // // Get the sheet feeder aspect ratio // PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_HORIZONTAL_SHEET_FEED_SIZE, m_sizeDocfeed.cx ); PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_VERTICAL_SHEET_FEED_SIZE, m_sizeDocfeed.cy ); } UpdateControlState(); if (m_hwndPreview) { // // Set a bitmap, so we can select stuff even if the user doesn't do a preview scan // m_hBitmapDefaultPreviewBitmap = reinterpret_cast(LoadImage( g_hInstance, MAKEINTRESOURCE(IDB_DEFAULT_SCANNER_BITMAP), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_DEFAULTCOLOR )); if (m_hBitmapDefaultPreviewBitmap) { WiaPreviewControl_SetBitmap( m_hwndPreview, TRUE, TRUE, m_hBitmapDefaultPreviewBitmap ); } // // Initialize the selection rectangle // WiaPreviewControl_ClearSelection( m_hwndPreview ); // // Ensure that the aspect ratio is correct // WiaPreviewControl_SetDefAspectRatio( m_hwndPreview, &m_sizeFlatbed ); } ToolbarHelper::CButtonDescriptor SelectionButtonDescriptors[] = { { 0, IDC_SCANSEL_SHOW_SELECTION, 0, BTNS_BUTTON|BTNS_CHECK, false, NULL, 0 }, { 1, IDC_SCANSEL_SHOW_BED, TBSTATE_CHECKED, BTNS_BUTTON|BTNS_CHECK, false, NULL, 0 } }; HWND hWndSelectionToolbar = ToolbarHelper::CreateToolbar( m_hWnd, GetDlgItem(m_hWnd,IDC_SCANSEL_RESCAN), GetDlgItem(m_hWnd,IDC_SCANSEL_BUTTON_BAR_GUIDE), ToolbarHelper::AlignRight|ToolbarHelper::AlignTop, IDC_SCANSEL_SELECTION_BUTTON_BAR, m_ScannerSelectionButtonBarBitmapInfo, SelectionButtonDescriptors, ARRAYSIZE(SelectionButtonDescriptors) ); // // Nuke the guide window // DestroyWindow( GetDlgItem(m_hWnd,IDC_SCANSEL_BUTTON_BAR_GUIDE) ); // // Make sure the toolbars are visible // ShowWindow( hWndSelectionToolbar, SW_SHOW ); UpdateWindow( hWndSelectionToolbar ); // // Get the page sizes // CComPtr pWiaScannerPaperSizes; HRESULT hr = CoCreateInstance( CLSID_WiaDefaultUi, NULL, CLSCTX_INPROC_SERVER, IID_IWiaScannerPaperSizes, (void**)&pWiaScannerPaperSizes ); if (SUCCEEDED(hr)) { hr = pWiaScannerPaperSizes->GetPaperSizes( &m_pPaperSizes, &m_nPaperSizeCount ); if (FAILED(hr)) { EndDialog( m_hWnd, hr ); } } // // Initialize the intent controls, set the initial intent, etc. // InitializeIntents(); PopulateDocumentHandling(); PopulatePageSize(); HandlePaperSourceSelChange(); HandlePaperSizeSelChange(); return 0; } void CScannerSelectionPage::PopulateDocumentHandling(void) { HWND hWndDocumentHandling = GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSOURCE ); if (m_pControllerWindow->m_pWiaItemRoot && m_pControllerWindow->m_nScannerType == CAcquisitionManagerControllerWindow::ScannerTypeFlatbedAdf && hWndDocumentHandling) { LONG nDocumentHandlingSelectFlags = 0; PropStorageHelpers::GetPropertyFlags( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_DOCUMENT_HANDLING_SELECT, nDocumentHandlingSelectFlags ); LONG nDocumentHandlingSelect = 0; PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_DOCUMENT_HANDLING_SELECT, nDocumentHandlingSelect ); if (!nDocumentHandlingSelectFlags) { nDocumentHandlingSelectFlags = FLATBED; } if (!nDocumentHandlingSelect) { nDocumentHandlingSelect = FLATBED; } int nSelectIndex = 0; for (int i=0;i(strDocumentHandlingName.String())); if (nIndex != CB_ERR) { SendMessage( hWndDocumentHandling, CB_SETITEMDATA, nIndex, g_SupportedDocumentHandlingTypes[i].nFlag ); if (nDocumentHandlingSelect == g_SupportedDocumentHandlingTypes[i].nFlag) { nSelectIndex = (int)nIndex; } } } } } WIA_TRACE((TEXT("Selecting index %d"), nSelectIndex )); SendMessage( hWndDocumentHandling, CB_SETCURSEL, nSelectIndex, 0 ); // // Make sure all of the strings fit // WiaUiUtil::ModifyComboBoxDropWidth(hWndDocumentHandling); } } void CScannerSelectionPage::PopulatePageSize(void) { HWND hWndPaperSize = GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSIZE ); if (m_pControllerWindow->m_pWiaItemRoot && m_pControllerWindow->m_nScannerType == CAcquisitionManagerControllerWindow::ScannerTypeFlatbedAdf && hWndPaperSize) { LONG nWidth=0, nHeight=0; PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_HORIZONTAL_SHEET_FEED_SIZE, nWidth ); PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_VERTICAL_SHEET_FEED_SIZE, nHeight ); // // Which index will initially be selected? // LRESULT nSelectIndex = 0; // // Save the largest sheet as our initially selected size // __int64 nMaximumArea = 0; for (UINT i=0;i(nWidth) && m_pPaperSizes[i].nHeight <= static_cast(nHeight)) { // // Get the string name for this paper size // CSimpleString strPaperSizeName( CSimpleStringConvert::NaturalString(CSimpleStringWide(m_pPaperSizes[i].pszName)) ); if (strPaperSizeName.Length()) { // // Add the string to the combobox // LRESULT nIndex = SendMessage( hWndPaperSize, CB_ADDSTRING, 0, reinterpret_cast(strPaperSizeName.String())); if (nIndex != CB_ERR) { // // Save the index into our global array // SendMessage( hWndPaperSize, CB_SETITEMDATA, nIndex, i ); // // Check to see if this is the largest page, if it is, save the area and the index // if (((__int64)m_pPaperSizes[i].nWidth * m_pPaperSizes[i].nHeight) > nMaximumArea) { nMaximumArea = m_pPaperSizes[i].nWidth * m_pPaperSizes[i].nHeight; nSelectIndex = nIndex; } } } } } // // Select the default size // SendMessage( hWndPaperSize, CB_SETCURSEL, nSelectIndex, 0 ); // // Make sure all of the strings fit // WiaUiUtil::ModifyComboBoxDropWidth(hWndPaperSize); } } void CScannerSelectionPage::HandlePaperSourceSelChange(void) { // // Make sure we have a valid root item // if (m_pControllerWindow->m_pWiaItemRoot) { // // Get the paper source combobox and make sure it exists // HWND hWndPaperSource = GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSOURCE ); if (hWndPaperSource) { // // Get the currently selected paper source // LRESULT nCurSel = SendMessage( hWndPaperSource, CB_GETCURSEL, 0, 0 ); if (nCurSel != CB_ERR) { // // Get the paper source // LRESULT nPaperSource = SendMessage( hWndPaperSource, CB_GETITEMDATA, nCurSel, 0 ); if (nPaperSource) { // // Set the paper source on the actual item // PropStorageHelpers::SetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_DOCUMENT_HANDLING_SELECT, static_cast(nPaperSource) ); if (nPaperSource & FLATBED) { // // Make sure all of the preview-related controls are visible and enabled // UpdateControlState(); if (m_hwndPreview) { // // Adjust the preview control settings for allowing region selection // WiaPreviewControl_SetDefAspectRatio( m_hwndPreview, &m_sizeFlatbed ); WiaPreviewControl_DisableSelection( m_hwndPreview, FALSE ); WiaPreviewControl_SetBorderStyle( m_hwndPreview, TRUE, PS_DOT, 0 ); WiaPreviewControl_SetHandleSize( m_hwndPreview, TRUE, 6 ); } // // Disable the paper size controls // EnableControl( IDC_SCANSEL_PAPERSIZE, FALSE ); EnableControl( IDC_SCANSEL_PAPERSIZE_STATIC, FALSE ); } else { // // Make sure all of the preview-related controls are NOT visible // UpdateControlState(); if (m_hwndPreview) { // // Adjust the preview control settings for displaying paper selection // WiaPreviewControl_SetDefAspectRatio( m_hwndPreview, &m_sizeDocfeed ); WiaPreviewControl_DisableSelection( m_hwndPreview, TRUE ); WiaPreviewControl_SetBorderStyle( m_hwndPreview, TRUE, PS_SOLID, 0 ); WiaPreviewControl_SetHandleSize( m_hwndPreview, TRUE, 0 ); } // // Enable the paper size controls // EnableControl( IDC_SCANSEL_PAPERSIZE, TRUE ); EnableControl( IDC_SCANSEL_PAPERSIZE_STATIC, TRUE ); // // Update the region selection feedback // HandlePaperSizeSelChange(); } // // Reset the preview selection setting // WiaPreviewControl_SetPreviewMode( m_hwndPreview, FALSE ); ToolbarHelper::CheckToolbarButton( m_hwndSelectionToolbar, IDC_SCANSEL_SHOW_SELECTION, false ); ToolbarHelper::CheckToolbarButton( m_hwndSelectionToolbar, IDC_SCANSEL_SHOW_BED, true ); } } } } } void CScannerSelectionPage::HandlePaperSizeSelChange(void) { if (m_pControllerWindow->m_pWiaItemRoot) { HWND hWndPaperSize = GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSIZE ); if (InDocFeedMode() && hWndPaperSize) { LRESULT nCurSel = SendMessage( hWndPaperSize, CB_GETCURSEL, 0, 0 ); if (nCurSel != CB_ERR) { LRESULT nPaperSizeIndex = SendMessage( hWndPaperSize, CB_GETITEMDATA, nCurSel, 0 ); POINT ptOrigin = { 0, 0 }; SIZE sizeExtent = { m_pPaperSizes[nPaperSizeIndex].nWidth, m_pPaperSizes[nPaperSizeIndex].nHeight }; if (!sizeExtent.cx) { sizeExtent.cx = m_sizeDocfeed.cx; } if (!sizeExtent.cy) { sizeExtent.cy = m_sizeDocfeed.cy; } LONG nSheetFeederRegistration; if (!PropStorageHelpers::GetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPS_SHEET_FEEDER_REGISTRATION, nSheetFeederRegistration )) { nSheetFeederRegistration = LEFT_JUSTIFIED; } if (nSheetFeederRegistration == CENTERED) { ptOrigin.x = (m_sizeDocfeed.cx - sizeExtent.cx) / 2; } else if (nSheetFeederRegistration == RIGHT_JUSTIFIED) { ptOrigin.x = m_sizeDocfeed.cx - sizeExtent.cx; } if (m_hwndPreview) { WiaPreviewControl_SetResolution( m_hwndPreview, &m_sizeDocfeed ); WiaPreviewControl_SetSelOrigin( m_hwndPreview, 0, FALSE, &ptOrigin ); WiaPreviewControl_SetSelExtent( m_hwndPreview, 0, FALSE, &sizeExtent ); } } } } } void CScannerSelectionPage::OnPaperSourceSelChange( WPARAM, LPARAM ) { HandlePaperSourceSelChange(); } void CScannerSelectionPage::OnPaperSizeSelChange( WPARAM, LPARAM ) { HandlePaperSizeSelChange(); } bool CScannerSelectionPage::InDocFeedMode(void) { HWND hWndPaperSource = GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSOURCE ); if (hWndPaperSource) { LRESULT nCurSel = SendMessage( hWndPaperSource, CB_GETCURSEL, 0, 0 ); if (nCurSel != CB_ERR) { LRESULT nPaperSource = SendMessage( hWndPaperSource, CB_GETITEMDATA, nCurSel, 0 ); if (nPaperSource) { if (nPaperSource & FEEDER) { return true; } } } } return false; } void CScannerSelectionPage::EnableControls( BOOL bEnable ) { MyEnableWindow( GetDlgItem( m_hWnd, IDC_SCANSEL_INTENT_1 ), bEnable ); MyEnableWindow( GetDlgItem( m_hWnd, IDC_SCANSEL_INTENT_2 ), bEnable ); MyEnableWindow( GetDlgItem( m_hWnd, IDC_SCANSEL_INTENT_3 ), bEnable ); MyEnableWindow( GetDlgItem( m_hWnd, IDC_SCANSEL_INTENT_4 ), bEnable ); MyEnableWindow( GetDlgItem( m_hWnd, IDC_SCANSEL_PROPERTIES ), bEnable ); MyEnableWindow( GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSOURCE_STATIC ), bEnable ); MyEnableWindow( GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSOURCE ), bEnable ); if (m_hwndPreview) { MyEnableWindow( m_hwndPreview, bEnable ); } if (m_hwndRescan) { MyEnableWindow( m_hwndRescan, bEnable ); } // // Only disable/enable this control if we are in document feeder mode // if (InDocFeedMode()) { MyEnableWindow( GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSIZE_STATIC ), bEnable ); MyEnableWindow( GetDlgItem( m_hWnd, IDC_SCANSEL_PAPERSIZE ), bEnable ); } // // Only disable/enable this control if there is an image in it. // if (m_bAllowRegionPreview && m_hwndSelectionToolbar) { MyEnableWindow( m_hwndSelectionToolbar, bEnable ); ToolbarHelper::EnableToolbarButton( m_hwndSelectionToolbar, IDC_SCANSEL_SHOW_SELECTION, bEnable != FALSE ); ToolbarHelper::EnableToolbarButton( m_hwndSelectionToolbar, IDC_SCANSEL_SHOW_BED, bEnable != FALSE ); } if (PropSheet_GetCurrentPageHwnd(GetParent(m_hWnd)) == m_hWnd) { if (bEnable) { PropSheet_SetWizButtons( GetParent(m_hWnd), PSWIZB_NEXT|PSWIZB_BACK ); } else { PropSheet_SetWizButtons( GetParent(m_hWnd), 0 ); } } } void CScannerSelectionPage::OnNotifyScanPreview( UINT nMsg, CThreadNotificationMessage *pThreadNotificationMessage ) { // // If we don't have a preview window, we can't do previews // if (m_hwndPreview) { CPreviewScanThreadNotifyMessage *pPreviewScanThreadNotifyMessage = dynamic_cast(pThreadNotificationMessage); if (pPreviewScanThreadNotifyMessage) { switch (pPreviewScanThreadNotifyMessage->Status()) { case CPreviewScanThreadNotifyMessage::Begin: { // // Erase the old bitmap // WiaPreviewControl_SetBitmap( m_hwndPreview, TRUE, TRUE, m_hBitmapDefaultPreviewBitmap ); // // Tell the user we are initializing the device // CSimpleString( IDS_SCANSEL_INITIALIZING_SCANNER, g_hInstance ).SetWindowText( m_hwndPreview ); // // Start the warming up progress bar // WiaPreviewControl_SetProgress( m_hwndPreview, TRUE ); // // Don't allow zooming the selected region in case there are any problems // m_bAllowRegionPreview = false; } break; case CPreviewScanThreadNotifyMessage::Update: { // // Update the bitmap // if (WiaPreviewControl_GetBitmap(m_hwndPreview) && WiaPreviewControl_GetBitmap(m_hwndPreview) != m_hBitmapDefaultPreviewBitmap) { WiaPreviewControl_RefreshBitmap( m_hwndPreview ); } else { WiaPreviewControl_SetBitmap( m_hwndPreview, TRUE, TRUE, pPreviewScanThreadNotifyMessage->Bitmap() ); } // // Tell the user we are scanning // CSimpleString( IDS_SCANSEL_SCANNINGPREVIEW, g_hInstance ).SetWindowText( m_hwndPreview ); // // Hide the progress control // WiaPreviewControl_SetProgress( m_hwndPreview, FALSE ); } break; case CPreviewScanThreadNotifyMessage::End: { WIA_PRINTHRESULT((pPreviewScanThreadNotifyMessage->hr(),TEXT("Handling CPreviewScanThreadNotifyMessage::End"))); // // Set the bitmap in the preview control // WiaPreviewControl_SetBitmap( m_hwndPreview, TRUE, TRUE, pPreviewScanThreadNotifyMessage->Bitmap() ? pPreviewScanThreadNotifyMessage->Bitmap() : m_hBitmapDefaultPreviewBitmap ); UpdateWindow( m_hwndPreview ); // // Store the bitmap for later // CWiaItem *pWiaItem = m_pControllerWindow->m_WiaItemList.Find( pPreviewScanThreadNotifyMessage->Cookie() ); if (pWiaItem) { // // Set the bitmap, whether it is NULL or not. // pWiaItem->BitmapImage(pPreviewScanThreadNotifyMessage->Bitmap()); } if (SUCCEEDED(pPreviewScanThreadNotifyMessage->hr())) { // // Only do the region detection if the user hasn't changed it manually, // and only if we are not in document feeder mode. // if (!WiaPreviewControl_GetUserChangedSelection( m_hwndPreview ) && !InDocFeedMode()) { WiaPreviewControl_DetectRegions( m_hwndPreview ); } // // Allow the user to zoom the selected region if there is a bitmap // if (pPreviewScanThreadNotifyMessage->Bitmap()) { m_bAllowRegionPreview = true; } } else if (m_pControllerWindow->m_bDisconnected || WIA_ERROR_OFFLINE == pPreviewScanThreadNotifyMessage->hr()) { // // Do nothing. // } else { // // Tell the user something bad happened // CSimpleString strMessage; switch (pPreviewScanThreadNotifyMessage->hr()) { case WIA_ERROR_PAPER_EMPTY: strMessage.LoadString( IDS_PREVIEWOUTOFPAPER, g_hInstance ); break; default: strMessage.LoadString( IDS_PREVIEWSCAN_ERROR, g_hInstance ); break; } CMessageBoxEx::MessageBox( m_hWnd, strMessage, CSimpleString( IDS_ERROR_TITLE, g_hInstance ), CMessageBoxEx::MBEX_ICONWARNING ); WIA_PRINTHRESULT((pPreviewScanThreadNotifyMessage->hr(),TEXT("The preview scan FAILED!"))); } // // Re-enable all of the controls // EnableControls(TRUE); // // Update the preview-related controls // UpdateControlState(); // // remove the status text // SetWindowText( m_hwndPreview, TEXT("") ); // // Restore the preview mode // WiaPreviewControl_SetPreviewMode( m_hwndPreview, InPreviewMode() ); // // Hide the animation // WiaPreviewControl_SetProgress( m_hwndPreview, FALSE ); } break; } } } } void CScannerSelectionPage::SetIntentCheck( LONG nIntent ) { for (int i=0;i(GetWindowLongPtr(hWndBtn,GWLP_USERDATA)) == nIntent) { SendMessage( hWndBtn, BM_SETCHECK, BST_CHECKED, 0 ); } else { // Uncheck all others SendMessage( hWndBtn, BM_SETCHECK, BST_UNCHECKED, 0 ); } } } } void CScannerSelectionPage::OnProperties( WPARAM, LPARAM ) { CWaitCursor wc; CWiaItem *pCurItem = GetActiveScannerItem(); if (pCurItem && pCurItem->WiaItem()) { if (!ApplyCurrentIntent()) { // // Tell the user it failed, and to try again // CMessageBoxEx::MessageBox( m_hWnd, CSimpleString( IDS_ERROR_SETTING_PROPS, g_hInstance ), CSimpleString( IDS_ERROR_TITLE, g_hInstance ), CMessageBoxEx::MBEX_ICONINFORMATION ); return; } HRESULT hr = WiaUiUtil::SystemPropertySheet( g_hInstance, m_hWnd, pCurItem->WiaItem(), CSimpleString(IDS_ADVANCEDPROPERTIES, g_hInstance) ); if (SUCCEEDED(hr)) { if (S_OK == hr) { pCurItem->CustomPropertyStream().AssignFromWiaItem(pCurItem->WiaItem()); if (pCurItem->CustomPropertyStream().IsValid()) { SetIntentCheck(0); } else WIA_ERROR((TEXT("Unknown error: m_CustomPropertyStream is not valid"))); } else WIA_TRACE((TEXT("User cancelled"))); } else { CMessageBoxEx::MessageBox( m_hWnd, CSimpleString( IDS_PROPERTY_SHEET_ERROR, g_hInstance ), CSimpleString( IDS_ERROR_TITLE, g_hInstance ), CMessageBoxEx::MBEX_ICONINFORMATION ); WIA_PRINTHRESULT((hr,TEXT("SystemPropertySheet failed"))); } } else WIA_TRACE((TEXT("No current item"))); } void CScannerSelectionPage::OnPreviewSelection( WPARAM wParam, LPARAM ) { if (m_hwndPreview && m_hwndSelectionToolbar) { bool bNewPreviewSetting = (LOWORD(wParam) == IDC_SCANSEL_SHOW_SELECTION); bool bOldPreviewSetting = WiaPreviewControl_GetPreviewMode( m_hwndPreview ) != FALSE; ToolbarHelper::CheckToolbarButton( m_hwndSelectionToolbar, IDC_SCANSEL_SHOW_SELECTION, LOWORD(wParam) == IDC_SCANSEL_SHOW_SELECTION ); ToolbarHelper::CheckToolbarButton( m_hwndSelectionToolbar, IDC_SCANSEL_SHOW_BED, LOWORD(wParam) == IDC_SCANSEL_SHOW_BED ); if (bNewPreviewSetting != bOldPreviewSetting) { WiaPreviewControl_SetPreviewMode( m_hwndPreview, LOWORD(wParam) == IDC_SCANSEL_SHOW_SELECTION ); } } } LRESULT CScannerSelectionPage::OnReset( WPARAM, LPARAM ) { m_PreviewScanCancelEvent.Signal(); return 0; } LRESULT CScannerSelectionPage::OnGetToolTipDispInfo( WPARAM wParam, LPARAM lParam ) { TOOLTIPTEXT *pToolTipText = reinterpret_cast(lParam); if (pToolTipText) { switch (pToolTipText->hdr.idFrom) { case IDC_SCANSEL_SHOW_SELECTION: pToolTipText->hinst = g_hInstance; pToolTipText->lpszText = MAKEINTRESOURCE(IDS_SCANSEL_SHOW_SELECTION); break; case IDC_SCANSEL_SHOW_BED: pToolTipText->hinst = g_hInstance; pToolTipText->lpszText = MAKEINTRESOURCE(IDS_SCANSEL_SHOW_BED); break; } } return 0; } LRESULT CScannerSelectionPage::OnCommand( WPARAM wParam, LPARAM lParam ) { SC_BEGIN_COMMAND_HANDLERS() { SC_HANDLE_COMMAND(IDC_SCANSEL_RESCAN,OnRescan); SC_HANDLE_COMMAND(IDC_SCANSEL_PROPERTIES,OnProperties); SC_HANDLE_COMMAND(IDC_SCANSEL_SHOW_SELECTION,OnPreviewSelection); SC_HANDLE_COMMAND(IDC_SCANSEL_SHOW_BED,OnPreviewSelection); SC_HANDLE_COMMAND_NOTIFY( CBN_SELCHANGE, IDC_SCANSEL_PAPERSOURCE, OnPaperSourceSelChange ); SC_HANDLE_COMMAND_NOTIFY( CBN_SELCHANGE, IDC_SCANSEL_PAPERSIZE, OnPaperSizeSelChange ); } SC_END_COMMAND_HANDLERS(); } LRESULT CScannerSelectionPage::OnNotify( WPARAM wParam, LPARAM lParam ) { SC_BEGIN_NOTIFY_MESSAGE_HANDLERS() { SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_WIZNEXT,OnWizNext); SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_WIZBACK,OnWizBack); SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_SETACTIVE,OnSetActive); SC_HANDLE_NOTIFY_MESSAGE_CODE(PSN_RESET,OnReset); SC_HANDLE_NOTIFY_MESSAGE_CODE(TTN_GETDISPINFO,OnGetToolTipDispInfo); } SC_END_NOTIFY_MESSAGE_HANDLERS(); } LRESULT CScannerSelectionPage::OnThreadNotification( WPARAM wParam, LPARAM lParam ) { WTM_BEGIN_THREAD_NOTIFY_MESSAGE_HANDLERS() { WTM_HANDLE_NOTIFY_MESSAGE( TQ_SCANPREVIEW, OnNotifyScanPreview ); } WTM_END_THREAD_NOTIFY_MESSAGE_HANDLERS(); } LRESULT CScannerSelectionPage::OnEventNotification( WPARAM, LPARAM lParam ) { WIA_PUSH_FUNCTION((TEXT("CCommonFirstPage::OnEventNotification") )); CGenericWiaEventHandler::CEventMessage *pEventMessage = reinterpret_cast(lParam); if (pEventMessage) { // // Don't delete the message, it is deleted in the controller window // } return 0; } LRESULT CScannerSelectionPage::OnDestroy( WPARAM, LPARAM ) { // // Nuke all of the intent icons we loaded // for (int i=0;i(SendDlgItemMessage( m_hWnd, gs_IntentRadioButtonIconPairs[i].nIconId, STM_SETICON, 0, 0 )); if (hIcon) { DestroyIcon(hIcon); } } return 0; } LRESULT CScannerSelectionPage::OnSysColorChange( WPARAM wParam, LPARAM lParam ) { m_ScannerSelectionButtonBarBitmapInfo.ReloadAndReplaceBitmap(); SendDlgItemMessage( m_hWnd, IDC_SCANSEL_SELECTION_BUTTON_BAR, WM_SYSCOLORCHANGE, wParam, lParam ); WiaPreviewControl_SetBkColor( GetDlgItem( m_hWnd, IDC_SCANSEL_PREVIEW ), TRUE, TRUE, GetSysColor(COLOR_WINDOW) ); WiaPreviewControl_SetBkColor( GetDlgItem( m_hWnd, IDC_SCANSEL_PREVIEW ), TRUE, FALSE, GetSysColor(COLOR_WINDOW) ); return 0; } LRESULT CScannerSelectionPage::OnThemeChanged( WPARAM wParam, LPARAM lParam ) { SendDlgItemMessage( m_hWnd, IDC_SCANSEL_SELECTION_BUTTON_BAR, WM_THEMECHANGED, wParam, lParam ); return 0; } INT_PTR CALLBACK CScannerSelectionPage::DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CScannerSelectionPage) { SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog ); SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand ); SC_HANDLE_DIALOG_MESSAGE( WM_NOTIFY, OnNotify ); SC_HANDLE_DIALOG_MESSAGE( WM_DESTROY, OnDestroy ); SC_HANDLE_DIALOG_MESSAGE( WM_SYSCOLORCHANGE, OnSysColorChange ); SC_HANDLE_DIALOG_MESSAGE( WM_THEMECHANGED, OnThemeChanged ); } SC_HANDLE_REGISTERED_DIALOG_MESSAGE( m_nThreadNotificationMessage, OnThreadNotification ); SC_HANDLE_REGISTERED_DIALOG_MESSAGE( m_nWiaEventMessage, OnEventNotification ); SC_END_DIALOG_MESSAGE_HANDLERS(); }