/******************************************************************************* * * (C) COPYRIGHT MICROSOFT CORPORATION, 1998 * * TITLE: CAMSEL.CPP * * VERSION: 1.0 * * AUTHOR: ShaunIv * * DATE: 9/28/1999 * * DESCRIPTION: Camera selection page. Displays thumbnails, and lets the user select which * ones to download. * *******************************************************************************/ #include "precomp.h" #pragma hdrstop #include #include #include "camsel.h" #include "resource.h" #include "simcrack.h" #include "waitcurs.h" #include "mboxex.h" #include "wiatextc.h" #include #include #include "gwiaevnt.h" #include #include "createtb.h" #include // // We use this instead of GetSystemMetrics(SM_CXSMICON)/GetSystemMetrics(SM_CYSMICON) because // large "small" icons wreak havoc with dialog layout // #define SMALL_ICON_SIZE 16 // // Quickly check a listview state flag to see if it is selected or not // static inline bool IsStateChecked( UINT nState ) { // // State image indices are stored in bits 12 through 15 of the listview // item state, so we shift the state right 12 bits. We subtract 1, because // the selected image is stored as index 2, an unselected image is stored as index 1. // return (((nState >> 12) - 1) != 0); } #undef VAISHALEE_LETS_ME_PUT_DELETE_IN #define IDC_ACTION_BUTTON_BAR 1200 #define IDC_SELECTION_BUTTON_BAR 1201 #define IDC_TAKEPICTURE_BUTTON_BAR 1202 // // Delete item command, doesn't appear in resource header, because there is no UI for it // #define IDC_CAMSEL_DELETE 1113 // // Timer ID for updating the status line // #define IDT_UPDATESTATUS 1 // // Amount of time to wait to update the status line // static const UINT c_UpdateStatusTimeout = 200; // Thumbnail whitespace: the space in between images and their selection rectangles // These values were discovered by trail and error. For instance, if you reduce // c_nAdditionalMarginY to 20, you get really bizarre spacing problems in the list view // in vertical mode. These values could become invalid in future versions of the listview. static const int c_nAdditionalMarginX = 9; static const int c_nAdditionalMarginY = 21; CCameraSelectionPage::CCameraSelectionPage( HWND hWnd ) : m_hWnd(hWnd), m_pControllerWindow(NULL), m_nDefaultThumbnailImageListIndex(-1), m_nWiaEventMessage(RegisterWindowMessage(STR_WIAEVENT_NOTIFICATION_MESSAGE)), m_nThreadNotificationMessage(RegisterWindowMessage(STR_THREAD_NOTIFICATION_MESSAGE)), m_bThumbnailsRequested(false), m_hIconAudioAnnotation(NULL), m_hIconMiscellaneousAnnotation(NULL), m_nProgrammaticSetting(0), m_CameraSelectionButtonBarBitmapInfo( g_hInstance, IDB_CAMSEL_TOOLBAR ), m_CameraTakePictureButtonBarBitmapInfo( g_hInstance, IDB_CAMSEL_TOOLBAR ), m_CameraActionButtonBarBitmapInfo( g_hInstance, IDB_CAMSEL_TOOLBAR ), m_hAccelerators(NULL) { } CCameraSelectionPage::~CCameraSelectionPage(void) { m_hWnd = NULL; m_pControllerWindow = NULL; if (m_hIconAudioAnnotation) { DestroyIcon(m_hIconAudioAnnotation); m_hIconAudioAnnotation = NULL; } if (m_hIconMiscellaneousAnnotation) { DestroyIcon(m_hIconMiscellaneousAnnotation); m_hIconMiscellaneousAnnotation = NULL; } if (m_hAccelerators) { DestroyAcceleratorTable(m_hAccelerators); m_hAccelerators = NULL; } } LRESULT CCameraSelectionPage::OnWizNext( WPARAM, LPARAM ) { return 0; } LRESULT CCameraSelectionPage::OnWizBack( WPARAM, LPARAM ) { return 0; } // // Slightly optimized version of EnableWindow // static void MyEnableWindow( HWND hWnd, BOOL bEnable ) { if (IsWindowEnabled(hWnd) != bEnable) { EnableWindow( hWnd, bEnable ); } } void CCameraSelectionPage::MyEnableToolbarButton( int nButtonId, bool bEnable ) { ToolbarHelper::EnableToolbarButton( GetDlgItem( m_hWnd, IDC_ACTION_BUTTON_BAR ), nButtonId, bEnable ); ToolbarHelper::EnableToolbarButton( GetDlgItem( m_hWnd, IDC_SELECTION_BUTTON_BAR ), nButtonId, bEnable ); ToolbarHelper::EnableToolbarButton( GetDlgItem( m_hWnd, IDC_TAKEPICTURE_BUTTON_BAR ), nButtonId, bEnable ); } LRESULT CCameraSelectionPage::OnTimer( WPARAM wParam, LPARAM ) { // // Update the status line // if (wParam == IDT_UPDATESTATUS) { KillTimer( m_hWnd, IDT_UPDATESTATUS ); // // Get the item count and selected count // int nItemCount = ListView_GetItemCount( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ) ); int nCheckedCount = m_pControllerWindow->GetSelectedImageCount(); if (!nItemCount) { // // If there are no items, tell the user there are no items on the device // CSimpleString( IDS_SELECTED_NO_PICTURES, g_hInstance ).SetWindowText( GetDlgItem( m_hWnd, IDC_CAMSEL_STATUS ) ); } else if (!nCheckedCount) { // // If none of the items are selected, tell the user there are none selected // CSimpleString( IDS_SELECTED_NO_IMAGES_SELECTED, g_hInstance ).SetWindowText( GetDlgItem( m_hWnd, IDC_CAMSEL_STATUS ) ); } else { // // Just tell them how many selected items there are // CSimpleString().Format( IDS_CAMERA_SELECT_NUMSEL, g_hInstance, nCheckedCount, nItemCount ).SetWindowText( GetDlgItem( m_hWnd, IDC_CAMSEL_STATUS ) ); } } return 0; } void CCameraSelectionPage::UpdateControls(void) { int nItemCount = ListView_GetItemCount( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ) ); int nSelCount = ListView_GetSelectedCount( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ) ); int nCheckedCount = m_pControllerWindow->GetSelectedImageCount(); // // Figure out which wizard buttons to enable // int nWizButtons = 0; // // Only enable "back" if the first page is available // if (!m_pControllerWindow->SuppressFirstPage()) { nWizButtons |= PSWIZB_BACK; } // // Only enable "next" if there are selected images // if (nCheckedCount) { nWizButtons |= PSWIZB_NEXT; } // // Set the buttons // PropSheet_SetWizButtons( GetParent(m_hWnd), nWizButtons ); // // Properties are only available for one item at a time // MyEnableToolbarButton( IDC_CAMSEL_PROPERTIES, nSelCount == 1 ); // // Select All is only available if there are images // MyEnableToolbarButton( IDC_CAMSEL_SELECT_ALL, (nItemCount != 0) && (nItemCount != nCheckedCount) ); // // Clear all is only available if there are selected images // MyEnableToolbarButton( IDC_CAMSEL_CLEAR_ALL, nCheckedCount != 0 ); // // Rotate is only available if there are selected images // MyEnableToolbarButton( IDC_CAMSEL_ROTATE_RIGHT, nSelCount != 0 ); MyEnableToolbarButton( IDC_CAMSEL_ROTATE_LEFT, nSelCount != 0 ); // // Set a timer to tell the user how many images are selected. We don't do this // here because it is kind of slow, and the static control flickers a bit. // KillTimer( m_hWnd, IDT_UPDATESTATUS ); SetTimer( m_hWnd, IDT_UPDATESTATUS, c_UpdateStatusTimeout, NULL ); // // Disable capture if we can't create the dshow graph // if (m_pControllerWindow->m_DeviceTypeMode == CAcquisitionManagerControllerWindow::VideoMode) { WIAVIDEO_STATE VideoState = WIAVIDEO_NO_VIDEO; if (m_pWiaVideo) { m_pWiaVideo->GetCurrentState(&VideoState); } if (VideoState == WIAVIDEO_NO_VIDEO) { MyEnableToolbarButton( IDC_CAMSEL_TAKE_PICTURE, FALSE ); } else { MyEnableToolbarButton( IDC_CAMSEL_TAKE_PICTURE, TRUE ); } } else { if (!m_pControllerWindow->m_bTakePictureIsSupported) { MyEnableToolbarButton( IDC_CAMSEL_TAKE_PICTURE, FALSE ); } else { MyEnableToolbarButton( IDC_CAMSEL_TAKE_PICTURE, TRUE ); } } } LRESULT CCameraSelectionPage::OnSetActive( WPARAM, LPARAM ) { WIA_PUSH_FUNCTION((TEXT("CCameraSelectionPage::OnSetActive"))); // // Make sure we have a valid controller window // if (!m_pControllerWindow) { return -1; } // // In case it failed the first time, try creating the graph again // InitializeVideoCamera(); // // Update the enabled state for all affected controls // UpdateControls(); // // 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; return 0; } LRESULT CCameraSelectionPage::OnShowWindow( WPARAM, LPARAM ) { if (!m_bThumbnailsRequested) { // // Request the thumbnails // m_pControllerWindow->DownloadAllThumbnails(); // // Make sure we don't ask for the thumbnails again // m_bThumbnailsRequested = true; } return 0; } LRESULT CCameraSelectionPage::OnDestroy( WPARAM, LPARAM ) { m_pControllerWindow->m_WindowList.Remove(m_hWnd); // // Nuke the imagelists // HIMAGELIST hImageList = ListView_SetImageList( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), NULL, LVSIL_NORMAL ); if (hImageList) { ImageList_Destroy(hImageList); } hImageList = ListView_SetImageList( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), NULL, LVSIL_SMALL ); if (hImageList) { ImageList_Destroy(hImageList); } if (m_pWiaVideo) { HRESULT hr = m_pWiaVideo->DestroyVideo(); } return 0; } LRESULT CCameraSelectionPage::OnInitDialog( WPARAM, LPARAM lParam ) { WIA_PUSHFUNCTION(TEXT("CCameraSelectionPage::OnInitDialog")); // // 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; } // // Get the annotation helper interface and initialize the annotation icon // if (SUCCEEDED(CoCreateInstance( CLSID_WiaDefaultUi, NULL,CLSCTX_INPROC_SERVER, IID_IWiaAnnotationHelpers,(void**)&m_pWiaAnnotationHelpers ))) { m_pWiaAnnotationHelpers->GetAnnotationOverlayIcon( AnnotationAudio, &m_hIconAudioAnnotation, SMALL_ICON_SIZE ); m_pWiaAnnotationHelpers->GetAnnotationOverlayIcon( AnnotationUnknown, &m_hIconMiscellaneousAnnotation, SMALL_ICON_SIZE ); } // // Initialize Thumbnail Listview control // HWND hwndList = GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ); if (hwndList) { // // Get the device name for the root folder group // if (m_pControllerWindow->m_strwDeviceName.Length()) { m_GroupInfoList.Add( hwndList, m_pControllerWindow->m_strwDeviceName ); } // // Get the number of items // LONG nItemCount = m_pControllerWindow->m_WiaItemList.Count(); // // Hide the labels and use border selection // ListView_SetExtendedListViewStyleEx( hwndList, LVS_EX_DOUBLEBUFFER|LVS_EX_BORDERSELECT|LVS_EX_HIDELABELS|LVS_EX_SIMPLESELECT|LVS_EX_CHECKBOXES, LVS_EX_DOUBLEBUFFER|LVS_EX_BORDERSELECT|LVS_EX_HIDELABELS|LVS_EX_SIMPLESELECT|LVS_EX_CHECKBOXES ); // // Create the image list // HIMAGELIST hImageList = ImageList_Create( m_pControllerWindow->m_sizeThumbnails.cx, m_pControllerWindow->m_sizeThumbnails.cy, ILC_COLOR24|ILC_MIRROR, nItemCount, 50 ); if (hImageList) { // // Create the default thumbnail // HBITMAP hBmpDefaultThumbnail = WiaUiUtil::CreateIconThumbnail( hwndList, m_pControllerWindow->m_sizeThumbnails.cx, m_pControllerWindow->m_sizeThumbnails.cy, g_hInstance, IDI_UNAVAILABLE, CSimpleString( IDS_DOWNLOADINGTHUMBNAIL, g_hInstance )); if (hBmpDefaultThumbnail) { m_nDefaultThumbnailImageListIndex = ImageList_Add( hImageList, hBmpDefaultThumbnail, NULL ); DeleteObject( hBmpDefaultThumbnail ); } // // Set the image list // ListView_SetImageList( hwndList, hImageList, LVSIL_NORMAL ); // // Set the spacing // ListView_SetIconSpacing( hwndList, m_pControllerWindow->m_sizeThumbnails.cx + c_nAdditionalMarginX, m_pControllerWindow->m_sizeThumbnails.cy + c_nAdditionalMarginY ); // // Set the item count, to minimize recomputing the list size // ListView_SetItemCount( hwndList, nItemCount ); } // // Create a small image list, to prevent the checkbox state images from being resized in WM_SYSCOLORCHANGE // HIMAGELIST hImageListSmall = ImageList_Create( GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR24|ILC_MASK, 1, 1 ); if (hImageListSmall) { ListView_SetImageList( hwndList, hImageListSmall, LVSIL_SMALL ); } } // // Populate the list view // PopulateListView(); // // Initialize the video camera // InitializeVideoCamera(); // // Dismiss the progress dialog if it is still up // if (m_pControllerWindow->m_pWiaProgressDialog) { m_pControllerWindow->m_pWiaProgressDialog->Destroy(); m_pControllerWindow->m_pWiaProgressDialog = NULL; } // // Make sure the wizard still has the focus. This weird hack is necessary // because user seems to think the wizard is already the foreground window, // so the second call doesn't do anything // SetForegroundWindow( m_pControllerWindow->m_hWnd ); SetForegroundWindow( GetParent(m_hWnd) ); if (m_pControllerWindow->m_DeviceTypeMode == CAcquisitionManagerControllerWindow::CameraMode) { bool bShowTakePicture = m_pControllerWindow->m_bTakePictureIsSupported; ToolbarHelper::CButtonDescriptor ActionButtonDescriptors[] = { { 0, IDC_CAMSEL_ROTATE_RIGHT, TBSTATE_ENABLED, BTNS_BUTTON, false, NULL, 0 }, { 1, IDC_CAMSEL_ROTATE_LEFT, TBSTATE_ENABLED, BTNS_BUTTON, false, NULL, 0 }, { 2, IDC_CAMSEL_PROPERTIES, TBSTATE_ENABLED, BTNS_BUTTON, bShowTakePicture, NULL, 0 }, { 3, IDC_CAMSEL_TAKE_PICTURE, TBSTATE_ENABLED, BTNS_BUTTON, false, &bShowTakePicture, 0 } }; HWND hWndActionToolbar = ToolbarHelper::CreateToolbar( m_hWnd, GetDlgItem(m_hWnd,IDC_CAMSEL_THUMBNAILS), GetDlgItem(m_hWnd,IDC_CAMSEL_CAMERA_BUTTON_BAR_GUIDE), ToolbarHelper::AlignLeft|ToolbarHelper::AlignTop, IDC_ACTION_BUTTON_BAR, m_CameraActionButtonBarBitmapInfo, ActionButtonDescriptors, ARRAYSIZE(ActionButtonDescriptors) ); ToolbarHelper::CButtonDescriptor SelectionButtonDescriptors[] = { { -1, IDC_CAMSEL_CLEAR_ALL, TBSTATE_ENABLED, BTNS_BUTTON, true, NULL, IDS_CAMSEL_CLEAR_ALL }, { -1, IDC_CAMSEL_SELECT_ALL, TBSTATE_ENABLED, BTNS_BUTTON, false, NULL, IDS_CAMSEL_SELECT_ALL } }; HWND hWndSelectionToolbar = ToolbarHelper::CreateToolbar( m_hWnd, hWndActionToolbar, GetDlgItem(m_hWnd,IDC_CAMSEL_CAMERA_BUTTON_BAR_GUIDE), ToolbarHelper::AlignRight|ToolbarHelper::AlignTop, IDC_SELECTION_BUTTON_BAR, m_CameraSelectionButtonBarBitmapInfo, SelectionButtonDescriptors, ARRAYSIZE(SelectionButtonDescriptors) ); // // Nuke the guide window // DestroyWindow( GetDlgItem(m_hWnd,IDC_CAMSEL_CAMERA_BUTTON_BAR_GUIDE) ); // // Make sure the toolbars are visible // ShowWindow( hWndActionToolbar, SW_SHOW ); UpdateWindow( hWndActionToolbar ); ShowWindow( hWndSelectionToolbar, SW_SHOW ); UpdateWindow( hWndSelectionToolbar ); } else { ToolbarHelper::CButtonDescriptor TakePictureButtonDescriptors[] = { { 3, IDC_CAMSEL_TAKE_PICTURE, TBSTATE_ENABLED, BTNS_BUTTON, false, NULL, IDS_CAMSEL_TAKE_PICTURE } }; HWND hWndTakePictureToolbar = ToolbarHelper::CreateToolbar( m_hWnd, GetDlgItem(m_hWnd,IDC_CAMSEL_THUMBNAILS), GetDlgItem(m_hWnd,IDC_CAMSEL_VIDEO_PREVIEW_BUTTON_BAR_GUIDE), ToolbarHelper::AlignHCenter|ToolbarHelper::AlignTop, IDC_TAKEPICTURE_BUTTON_BAR, m_CameraTakePictureButtonBarBitmapInfo, TakePictureButtonDescriptors, ARRAYSIZE(TakePictureButtonDescriptors) ); ToolbarHelper::CButtonDescriptor ActionButtonDescriptors[] = { { 0, IDC_CAMSEL_ROTATE_RIGHT, TBSTATE_ENABLED, BTNS_BUTTON, false, NULL, 0 }, { 1, IDC_CAMSEL_ROTATE_LEFT, TBSTATE_ENABLED, BTNS_BUTTON, false, NULL, 0 }, { 2, IDC_CAMSEL_PROPERTIES, TBSTATE_ENABLED, BTNS_BUTTON, true, NULL, 0 } }; HWND hWndActionToolbar = ToolbarHelper::CreateToolbar( m_hWnd, hWndTakePictureToolbar, GetDlgItem(m_hWnd,IDC_CAMSEL_VIDEO_SELECTION_BUTTON_BAR_GUIDE), ToolbarHelper::AlignLeft|ToolbarHelper::AlignTop, IDC_ACTION_BUTTON_BAR, m_CameraActionButtonBarBitmapInfo, ActionButtonDescriptors, ARRAYSIZE(ActionButtonDescriptors) ); ToolbarHelper::CButtonDescriptor SelectionButtonDescriptors[] = { { -1, IDC_CAMSEL_CLEAR_ALL, TBSTATE_ENABLED, BTNS_BUTTON, true, NULL, IDS_CAMSEL_CLEAR_ALL }, { -1, IDC_CAMSEL_SELECT_ALL, TBSTATE_ENABLED, BTNS_BUTTON, false, NULL, IDS_CAMSEL_SELECT_ALL } }; HWND hWndSelectionToolbar = ToolbarHelper::CreateToolbar( m_hWnd, hWndActionToolbar, GetDlgItem(m_hWnd,IDC_CAMSEL_VIDEO_SELECTION_BUTTON_BAR_GUIDE), ToolbarHelper::AlignRight|ToolbarHelper::AlignTop, IDC_SELECTION_BUTTON_BAR, m_CameraSelectionButtonBarBitmapInfo, SelectionButtonDescriptors, ARRAYSIZE(SelectionButtonDescriptors) ); // // Nuke the guide windows // DestroyWindow( GetDlgItem(m_hWnd,IDC_CAMSEL_VIDEO_PREVIEW_BUTTON_BAR_GUIDE) ); DestroyWindow( GetDlgItem(m_hWnd,IDC_CAMSEL_VIDEO_SELECTION_BUTTON_BAR_GUIDE) ); // // Make sure the toolbars are visible // ShowWindow( hWndTakePictureToolbar, SW_SHOW ); UpdateWindow( hWndTakePictureToolbar ); ShowWindow( hWndActionToolbar, SW_SHOW ); UpdateWindow( hWndActionToolbar ); ShowWindow( hWndSelectionToolbar, SW_SHOW ); UpdateWindow( hWndSelectionToolbar ); } m_hAccelerators = LoadAccelerators( g_hInstance, MAKEINTRESOURCE(IDR_CAMERASELECTIONACCEL) ); return 0; } LRESULT CCameraSelectionPage::OnTranslateAccelerator( WPARAM, LPARAM lParam ) { // // Assume we won't be handling this message // LRESULT lResult = PSNRET_NOERROR; // // Make sure this is the current window // if (PropSheet_GetCurrentPageHwnd(GetParent(m_hWnd)) == m_hWnd) { // // Make sure we have a valid accelerator table // if (m_hAccelerators) { // // Get the WM_NOTIFY message goo for this message // PSHNOTIFY *pPropSheetNotify = reinterpret_cast(lParam); if (pPropSheetNotify) { // // Get the MSG // MSG *pMsg = reinterpret_cast(pPropSheetNotify->lParam); if (pMsg) { // // Try to translate the accelerator // if (TranslateAccelerator( m_hWnd, m_hAccelerators, pMsg )) { // // If we were able to // lResult = PSNRET_MESSAGEHANDLED; } } } } } return lResult; } void CCameraSelectionPage::InitializeVideoCamera(void) { // // Make sure this is a video camera // if (m_pControllerWindow->m_DeviceTypeMode != CAcquisitionManagerControllerWindow::VideoMode) { return; } HRESULT hr = S_OK; WIAVIDEO_STATE VideoState = WIAVIDEO_NO_VIDEO; CSimpleStringWide strImagesDirectory; if (m_pWiaVideo == NULL) { hr = CoCreateInstance(CLSID_WiaVideo, NULL, CLSCTX_INPROC_SERVER, IID_IWiaVideo, (void**) &m_pWiaVideo); } // // No point continuing if we can't create the video interface // if (!m_pWiaVideo) { return; } if (hr == S_OK) { BOOL bSuccess = FALSE; // // Get the IMAGES_DIRECTORY property from the Wia Video Driver. // bSuccess = PropStorageHelpers::GetProperty(m_pControllerWindow->m_pWiaItemRoot, WIA_DPV_IMAGES_DIRECTORY, strImagesDirectory); if (!bSuccess) { hr = E_FAIL; } } if (hr == S_OK) { // // Get the current state of the WiaVideo object. If we just created it // then the state will be NO_VIDEO, otherwise, it could already be previewing video, // in which case we shouldn't do anything. // hr = m_pWiaVideo->GetCurrentState(&VideoState); if (VideoState == WIAVIDEO_NO_VIDEO) { // // Set the directory we want to save our images to. We got the image directory // from the Wia Video Driver IMAGES_DIRECTORY property // if (hr == S_OK) { hr = m_pWiaVideo->put_ImagesDirectory(CSimpleBStr(strImagesDirectory)); } // // Create the video preview as a child of the IDC_VIDSEL_PREVIEW dialog item // and automatically begin playback after creating the preview. // if (hr == S_OK) { hr = m_pWiaVideo->CreateVideoByWiaDevID( CSimpleBStr(m_pControllerWindow->m_pEventParameters->strDeviceID), GetDlgItem(m_hWnd, IDC_VIDSEL_PREVIEW), FALSE, TRUE); } } } // // If there was a failure, tell the user // if (hr != S_OK) { CSimpleString( IDS_VIDEOPREVIEWUNAVAILABLE, g_hInstance ).SetWindowText( GetDlgItem( m_hWnd, IDC_VIDSEL_PREVIEW ) ); } else { SetWindowText( GetDlgItem( m_hWnd, IDC_VIDSEL_PREVIEW ), TEXT("") ); } } CWiaItem *CCameraSelectionPage::GetItemFromListByIndex( HWND hwndList, int nItem ) { LVITEM LvItem; ZeroMemory( &LvItem, sizeof(LvItem) ); LvItem.iItem = nItem; LvItem.mask = LVIF_PARAM; if (ListView_GetItem( hwndList, &LvItem )) { return reinterpret_cast(LvItem.lParam); } return NULL; } int CCameraSelectionPage::FindItemListIndex( HWND hwndList, CWiaItem *pWiaItem ) { for (int i=0;iAnnotationType(); if (AnnotationAudio == AnnotationType) { hIcon = m_hIconAudioAnnotation; } else if (AnnotationUnknown == AnnotationType) { hIcon = m_hIconMiscellaneousAnnotation; } // // If we need an annotation icon // if (hIcon) { // // Get the icon's dimensions // SIZE sizeIcon = {0}; if (PrintScanUtil::GetIconSize( hIcon, sizeIcon )) { // // Get the bitmap's dimensions // SIZE sizeBitmap = {0}; if (PrintScanUtil::GetBitmapSize( hBitmap, sizeBitmap )) { // // Set up a good margin for this icon, so it isn't right up against the edge // const int nMargin = 3; // // Draw the icon // DrawIconEx( hMemDC, sizeBitmap.cx-sizeIcon.cx-nMargin, sizeBitmap.cy-sizeIcon.cy-nMargin, hIcon, sizeIcon.cx, sizeIcon.cy, 0, NULL, DI_NORMAL ); } } } // // Restore the old bitmap and delete the DC // SelectBitmap( hMemDC, hOldBitmap ); DeleteDC(hMemDC); } } } int CCameraSelectionPage::AddThumbnailToListViewImageList( HWND hwndList, CWiaItem *pWiaItem, int nIndex ) { WIA_PUSH_FUNCTION((TEXT("CCameraSelectionPage::AddThumbnailToListViewImageList"))); // // Assume we have the default thumbnail. If there are any problems, this is what we will use. // int nImageListIndex = m_nDefaultThumbnailImageListIndex; // // Make sure we have a valid item // if (pWiaItem) { // // We need a DC to create and scale the thumbnail // HDC hDC = GetDC(m_hWnd); if (hDC) { // // Is there a valid thumbnail for this image? If so, prepare it. // HBITMAP hThumbnail = pWiaItem->CreateThumbnailBitmap( m_hWnd, m_GdiPlusHelper, m_pControllerWindow->m_sizeThumbnails.cx, m_pControllerWindow->m_sizeThumbnails.cy ); if (hThumbnail) { // // Draw any annotation icons // DrawAnnotationIcons( hDC, pWiaItem, hThumbnail ); // // Find out if we already have a thumbnail in the list // If we do have a thumbnail, we want to replace it in the image list // LVITEM LvItem = {0}; LvItem.mask = LVIF_IMAGE; LvItem.iItem = nIndex; if (ListView_GetItem( hwndList, &LvItem ) && LvItem.iImage != m_nDefaultThumbnailImageListIndex) { // // Get the image list // HIMAGELIST hImageList = ListView_GetImageList( hwndList, LVSIL_NORMAL ); if (hImageList) { // // Replace the image and save the index // if (ImageList_Replace( hImageList, LvItem.iImage, hThumbnail, NULL )) { nImageListIndex = LvItem.iImage; } } } else { // // Get the image list // HIMAGELIST hImageList = ListView_GetImageList( hwndList, LVSIL_NORMAL ); if (hImageList) { // // Add this image to the listview's imagelist and save the index // nImageListIndex = ImageList_Add( hImageList, hThumbnail, NULL ); } } // // Delete the thumbnail to prevent a leak // DeleteBitmap(hThumbnail); } // // Release the client DC // ReleaseDC( m_hWnd, hDC ); } } // // Return the index of the image in the imagelist // return nImageListIndex; } int CCameraSelectionPage::AddItem( HWND hwndList, CWiaItem *pWiaItem, bool bEnsureVisible ) { // // Prevent handling of change notifications while we do this. // m_nProgrammaticSetting++; int nResult = -1; if (pWiaItem && hwndList) { // // Find out where we are going to insert this image // int nIndex = ListView_GetItemCount( hwndList ); // // Add or replace the thumbnail // int nImageListIndex = AddThumbnailToListViewImageList( hwndList, pWiaItem, nIndex ); if (nImageListIndex >= 0) { // // Get the item ready to insert and insert it // LVITEM lvItem = {0}; lvItem.iItem = nIndex; lvItem.mask = LVIF_IMAGE|LVIF_PARAM|LVIF_STATE|LVIF_GROUPID; lvItem.iImage = nImageListIndex; lvItem.lParam = reinterpret_cast(pWiaItem); lvItem.state = !nIndex ? LVIS_SELECTED|LVIS_FOCUSED : 0; lvItem.iGroupId = m_GroupInfoList.GetGroupId(pWiaItem,hwndList); nResult = ListView_InsertItem( hwndList, &lvItem ); if (nResult >= 0) { // // Set the check if the item is selected // ListView_SetCheckState( hwndList, nIndex, pWiaItem->SelectedForDownload() ); // // Ensure the item is visible, if necessary // if (bEnsureVisible) { ListView_EnsureVisible( hwndList, nResult, FALSE ); } } } } // // Enable handling of change notifications // m_nProgrammaticSetting--; return nResult; } void CCameraSelectionPage::AddEnumeratedItems( HWND hwndList, CWiaItem *pFirstItem ) { // // First, enumerate all of the images on this level and add them // CWiaItem *pCurrItem = pFirstItem; while (pCurrItem) { if (pCurrItem->IsDownloadableItemType()) { AddItem( hwndList, pCurrItem ); } pCurrItem = pCurrItem->Next(); } // // Now look for children, and recursively add them // pCurrItem = pFirstItem; while (pCurrItem) { AddEnumeratedItems( hwndList, pCurrItem->Children() ); pCurrItem = pCurrItem->Next(); } } void CCameraSelectionPage::PopulateListView(void) { HWND hwndList = GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ); if (hwndList) { // // Tell the window not to redraw while we add these items // SendMessage( hwndList, WM_SETREDRAW, FALSE, 0 ); // // Begin recursively adding all of the items // AddEnumeratedItems( hwndList, m_pControllerWindow->m_WiaItemList.Root() ); // // If we have any folders, allow group view // if (m_GroupInfoList.Size() > 1) { ListView_EnableGroupView( hwndList, TRUE ); } // // Tell the window to redraw now, because we are done. Invalidate the window, in case it is visible // SendMessage( hwndList, WM_SETREDRAW, TRUE, 0 ); InvalidateRect( hwndList, NULL, FALSE ); } } int CCameraSelectionPage::GetSelectionIndices( CSimpleDynamicArray &aIndices ) { HWND hwndList = GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ); if (!hwndList) return(0); int iCount = ListView_GetItemCount(hwndList); for (int i=0;i(pThreadNotificationMessage); if (pDownloadImageThreadNotifyMessage && m_pControllerWindow) { switch (pDownloadImageThreadNotifyMessage->Status()) { case CDownloadImagesThreadNotifyMessage::End: { switch (pDownloadImageThreadNotifyMessage->Operation()) { case CDownloadImagesThreadNotifyMessage::DownloadAll: { // // Make sure the download was successful, and not cancelled // if (S_OK == pDownloadImageThreadNotifyMessage->hr()) { // // Mark each successfully downloaded image as not-downloadable, and clear its selection state // for (int i=0;iDownloadedFileInformation().Size();i++) { CWiaItem *pWiaItem = m_pControllerWindow->m_WiaItemList.Find( pDownloadImageThreadNotifyMessage->DownloadedFileInformation()[i].Cookie() ); if (pWiaItem) { pWiaItem->SelectedForDownload( false ); int nItem = FindItemListIndex( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), pWiaItem ); if (nItem >= 0) { ListView_SetCheckState( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), nItem, FALSE ); } } } } } break; } } break; } } } // This function gets called in response to a thumbnail download finishing. void CCameraSelectionPage::OnNotifyDownloadThumbnail( UINT nMsg, CThreadNotificationMessage *pThreadNotificationMessage ) { CDownloadThumbnailsThreadNotifyMessage *pDownloadThumbnailsThreadNotifyMessage= dynamic_cast(pThreadNotificationMessage); if (pDownloadThumbnailsThreadNotifyMessage) { switch (pDownloadThumbnailsThreadNotifyMessage->Status()) { case CDownloadThumbnailsThreadNotifyMessage::End: { switch (pDownloadThumbnailsThreadNotifyMessage->Operation()) { case CDownloadThumbnailsThreadNotifyMessage::DownloadThumbnail: { // Find the item in the list CWiaItem *pWiaItem = m_pControllerWindow->m_WiaItemList.Find( pDownloadThumbnailsThreadNotifyMessage->Cookie() ); if (pWiaItem) { int nItem = FindItemListIndex( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), pWiaItem ); if (nItem >= 0) { int nImageListIndex = AddThumbnailToListViewImageList( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), pWiaItem, nItem ); if (nImageListIndex >= 0) { LVITEM LvItem; ZeroMemory( &LvItem, sizeof(LvItem) ); LvItem.iItem = nItem; LvItem.mask = LVIF_IMAGE; LvItem.iImage = nImageListIndex; ListView_SetItem( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), &LvItem ); if (PropSheet_GetCurrentPageHwnd(GetParent(m_hWnd)) == m_hWnd) { UpdateControls(); } } } } } break; } } break; } } } LRESULT CCameraSelectionPage::OnThumbnailListSelChange( WPARAM wParam, LPARAM lParam ) { WIA_PUSHFUNCTION(TEXT("CCameraSelectionPage::OnThumbnailListSelChange")); if (!m_nProgrammaticSetting) { NMLISTVIEW *pNmListView = reinterpret_cast(lParam); if (pNmListView) { WIA_TRACE((TEXT("pNmListView->uChanged: %08X, pNmListView->uOldState: %08X, pNmListView->uNewState: %08X"), pNmListView->uChanged, pNmListView->uOldState, pNmListView->uNewState )); // // If this is a check state change // if ((pNmListView->uChanged & LVIF_STATE) && ((pNmListView->uOldState&LVIS_STATEIMAGEMASK) ^ (pNmListView->uNewState&LVIS_STATEIMAGEMASK))) { // // Get the item * from the LVITEM structure // CWiaItem *pWiaItem = reinterpret_cast(pNmListView->lParam); if (pWiaItem) { // // Set selected flag in the item // pWiaItem->SelectedForDownload( IsStateChecked(pNmListView->uNewState) ); // // If this is the current page, update the control state // if (PropSheet_GetCurrentPageHwnd(GetParent(m_hWnd)) == m_hWnd) { UpdateControls(); } } } else if ((pNmListView->uChanged & LVIF_STATE) && ((pNmListView->uOldState&LVIS_SELECTED) ^ (pNmListView->uNewState&LVIS_SELECTED))) { // // If this is the current page, update the control state // if (PropSheet_GetCurrentPageHwnd(GetParent(m_hWnd)) == m_hWnd) { UpdateControls(); } } } } return 0; } void CCameraSelectionPage::OnProperties( WPARAM, LPARAM ) { CSimpleDynamicArray aSelIndices; if (GetSelectionIndices( aSelIndices )) { if (aSelIndices.Size() == 1) { CWiaItem *pWiaItem = GetItemFromListByIndex( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), aSelIndices[0]); if (pWiaItem && pWiaItem->WiaItem()) { m_pControllerWindow->m_pThreadMessageQueue->Pause(); HRESULT hr = WiaUiUtil::SystemPropertySheet( g_hInstance, m_hWnd, pWiaItem->WiaItem(), CSimpleString(IDS_ADVANCEDPROPERTIES, g_hInstance) ); m_pControllerWindow->m_pThreadMessageQueue->Resume(); if (FAILED(hr)) { CMessageBoxEx::MessageBox( m_hWnd, CSimpleString( IDS_PROPERTY_SHEET_ERROR, g_hInstance ), CSimpleString( IDS_ERROR_TITLE, g_hInstance ), CMessageBoxEx::MBEX_ICONINFORMATION ); } } } } } void CCameraSelectionPage::OnSelectAll( WPARAM, LPARAM ) { HWND hwndList = GetDlgItem(m_hWnd,IDC_CAMSEL_THUMBNAILS); if (hwndList) { ListView_SetCheckState( hwndList, -1, TRUE ); } } void CCameraSelectionPage::OnClearAll( WPARAM, LPARAM ) { HWND hwndList = GetDlgItem(m_hWnd,IDC_CAMSEL_THUMBNAILS); if (hwndList) { ListView_SetCheckState( hwndList, -1, FALSE ); } } LRESULT CCameraSelectionPage::OnThumbnailListKeyDown( WPARAM, LPARAM lParam ) { NMLVKEYDOWN *pNmLvKeyDown = reinterpret_cast(lParam); bool bControl = (GetKeyState(VK_CONTROL) & 0x8000) != 0; bool bShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0; bool bAlt = (GetKeyState(VK_MENU) & 0x8000) != 0; if (pNmLvKeyDown->wVKey == TEXT('A') && bControl && !bShift && !bAlt) { SendMessage( m_hWnd, WM_COMMAND, MAKEWPARAM(IDC_CAMSEL_SELECT_ALL,0), 0 ); } #if defined(VAISHALEE_LETS_ME_PUT_DELETE_IN) else if (VK_DELETE == pNmLvKeyDown->wVKey && !bAlt && !bControl && !bShift) { SendMessage( m_hWnd, WM_COMMAND, MAKEWPARAM(IDC_CAMSEL_DELETE,0), 0 ); } #endif return 0; } void CCameraSelectionPage::OnTakePicture( WPARAM, LPARAM ) { WIA_PUSH_FUNCTION((TEXT("CCameraSelectionPage::OnTakePicture"))); if (m_pControllerWindow->m_bTakePictureIsSupported) { CWaitCursor wc; // // Tell the user we are taking a picture // CSimpleString( IDS_TAKING_PICTURE, g_hInstance ).SetWindowText( GetDlgItem( m_hWnd, IDC_CAMSEL_STATUS ) ); HRESULT hr = S_OK; // // If we are not a video camera, just tell the device to snap a picture // if (m_pControllerWindow->m_DeviceTypeMode == CAcquisitionManagerControllerWindow::CameraMode) { CComPtr pNewWiaItem; hr = m_pControllerWindow->m_pWiaItemRoot->DeviceCommand(0,&WIA_CMD_TAKE_PICTURE,&pNewWiaItem); } else if (m_pWiaVideo) { // // Take the picture // BSTR bstrNewImageFileName = NULL; hr = m_pWiaVideo->TakePicture(&bstrNewImageFileName); if (hr == S_OK) { // // Succeeded in taking the picture, setting the LAST_PICTURE_TAKEN property // on the video driver to create a new item. // PROPVARIANT pv = {0}; PropVariantInit(&pv); pv.vt = VT_BSTR; pv.bstrVal = bstrNewImageFileName; BOOL bSuccess = PropStorageHelpers::SetProperty( m_pControllerWindow->m_pWiaItemRoot, WIA_DPV_LAST_PICTURE_TAKEN, pv ); if (!bSuccess) { hr = E_FAIL; WIA_PRINTHRESULT((hr,TEXT("PropStorageHelpers::SetProperty failed"))); } // // Note that this will free the bstrNewImageFileName returned to // us by WiaVideo // PropVariantClear(&pv); } else { WIA_PRINTHRESULT((hr,TEXT("m_pWiaVideo->TakePicture failed"))); } } // // Clear the status // if (SUCCEEDED(hr)) { SetWindowText( GetDlgItem( m_hWnd, IDC_CAMSEL_STATUS ), TEXT("") ); } else { MessageBeep(MB_ICONEXCLAMATION); CSimpleString( IDS_UNABLE_TO_TAKE_PICTURE, g_hInstance ).SetWindowText( GetDlgItem( m_hWnd, IDC_CAMSEL_STATUS ) ); WIA_PRINTHRESULT((hr,TEXT("Take picture failed"))); } } } void CCameraSelectionPage::OnRotate( WPARAM wParam, LPARAM ) { // // This could take a while for a lot of images, especially since we don't cache DIBs, // so we'll display an hourglass cursor here. // CWaitCursor wc; bool bAtLeastOneWasSuccessful = false; bool bAtLeastOneWasInitialized = false; CSimpleDynamicArray aIndices; if (CCameraSelectionPage::GetSelectionIndices( aIndices )) { for (int i=0;iRotationEnabled(true)) { bool bRotateRight = true; if (IDC_CAMSEL_ROTATE_LEFT == LOWORD(wParam)) { bRotateRight = false; } pWiaItem->Rotate(bRotateRight); int nImageListIndex = AddThumbnailToListViewImageList( GetDlgItem(m_hWnd,IDC_CAMSEL_THUMBNAILS), pWiaItem, aIndices[i] ); LVITEM LvItem; ZeroMemory( &LvItem, sizeof(LvItem) ); LvItem.iItem = aIndices[i]; LvItem.mask = LVIF_IMAGE; LvItem.iImage = nImageListIndex; ListView_SetItem( GetDlgItem(m_hWnd,IDC_CAMSEL_THUMBNAILS), &LvItem ); bAtLeastOneWasSuccessful = true; } // // We don't want to warn the user about failure to rotate images for which we haven't downloaded the preferred format // else if (pWiaItem->DefaultFormat() == IID_NULL) { bAtLeastOneWasSuccessful = true; } else { bAtLeastOneWasInitialized = true; } } } // // If not one picture could be rotated AND at least one had already been initialized, warn the user // if (!bAtLeastOneWasSuccessful && bAtLeastOneWasInitialized) { // // Beep and tell the user // MessageBeep(MB_ICONEXCLAMATION); CSimpleString( IDS_UNABLETOROTATE, g_hInstance ).SetWindowText( GetDlgItem( m_hWnd, IDC_CAMSEL_STATUS ) ); } // // Repaint the items // ListView_RedrawItems( GetDlgItem(m_hWnd,IDC_CAMSEL_THUMBNAILS), aIndices[0], aIndices[aIndices.Size()-1] ); // // Force an immediate update // UpdateWindow( GetDlgItem(m_hWnd,IDC_CAMSEL_THUMBNAILS) ); } } LRESULT CCameraSelectionPage::OnEventNotification( WPARAM, LPARAM lParam ) { WIA_PUSH_FUNCTION((TEXT("CCommonFirstPage::OnEventNotification") )); CGenericWiaEventHandler::CEventMessage *pEventMessage = reinterpret_cast(lParam); if (pEventMessage) { // // Handle the deleted item event // if (pEventMessage->EventId() == WIA_EVENT_ITEM_DELETED) { // // Try to find this item in the item list // CWiaItem *pWiaItem = m_pControllerWindow->FindItemByName( pEventMessage->FullItemName() ); if (pWiaItem) { // // Find the item in the listview and delete it from the listview // int nItem = FindItemListIndex( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), pWiaItem ); if (nItem >= 0) { ListView_DeleteItem( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), nItem ); } } if (PropSheet_GetCurrentPageHwnd(GetParent(m_hWnd)) == m_hWnd) { UpdateControls(); } } else if (pEventMessage->EventId() == WIA_EVENT_ITEM_CREATED) { // // Make sure we have a valid controller window // // // Find the new item // CWiaItem *pWiaItem = m_pControllerWindow->FindItemByName( pEventMessage->FullItemName() ); if (pWiaItem) { // // If this is the current page, select the image. // if (PropSheet_GetCurrentPageHwnd(GetParent(m_hWnd)) == m_hWnd) { pWiaItem->SelectedForDownload(true); } // // Make sure it isn't already in the list // if (FindItemListIndex( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), pWiaItem ) < 0) { // // Add it to the list view // AddItem( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), pWiaItem, true ); } } if (PropSheet_GetCurrentPageHwnd(GetParent(m_hWnd)) == m_hWnd) { UpdateControls(); } } // // Don't delete the message, it is deleted in the controller window // } return 0; } void CCameraSelectionPage::OnDelete( WPARAM, LPARAM ) { int nSelCount = ListView_GetSelectedCount( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ) ); if (nSelCount) { if (m_pControllerWindow->CanSomeSelectedImagesBeDeleted()) { if (CMessageBoxEx::IDMBEX_YES == CMessageBoxEx::MessageBox( m_hWnd, CSimpleString(IDS_CONFIRMDELETE,g_hInstance), CSimpleString(IDS_ERROR_TITLE,g_hInstance), CMessageBoxEx::MBEX_ICONQUESTION|CMessageBoxEx::MBEX_YESNO|CMessageBoxEx::MBEX_DEFBUTTON2)) { m_pControllerWindow->DeleteSelectedImages(); } } } } LRESULT CCameraSelectionPage::OnGetToolTipDispInfo( WPARAM wParam, LPARAM lParam ) { TOOLTIPTEXT *pToolTipText = reinterpret_cast(lParam); if (pToolTipText) { switch (pToolTipText->hdr.idFrom) { case IDC_CAMSEL_ROTATE_RIGHT: pToolTipText->hinst = g_hInstance; pToolTipText->lpszText = MAKEINTRESOURCE(IDS_CAMSEL_TOOLTIP_ROTATE_RIGHT); break; case IDC_CAMSEL_ROTATE_LEFT: pToolTipText->hinst = g_hInstance; pToolTipText->lpszText = MAKEINTRESOURCE(IDS_CAMSEL_TOOLTIP_ROTATE_LEFT); break; case IDC_CAMSEL_PROPERTIES: pToolTipText->hinst = g_hInstance; pToolTipText->lpszText = MAKEINTRESOURCE(IDS_CAMSEL_TOOLTIP_PROPERTIES); break; case IDC_CAMSEL_TAKE_PICTURE: pToolTipText->hinst = g_hInstance; pToolTipText->lpszText = MAKEINTRESOURCE(IDS_CAMSEL_TOOLTIP_TAKE_PICTURE); break; case IDC_CAMSEL_CLEAR_ALL: pToolTipText->hinst = g_hInstance; pToolTipText->lpszText = MAKEINTRESOURCE(IDS_CAMSEL_TOOLTIP_CLEAR_ALL); break; case IDC_CAMSEL_SELECT_ALL: pToolTipText->hinst = g_hInstance; pToolTipText->lpszText = MAKEINTRESOURCE(IDS_CAMSEL_TOOLTIP_SELECT_ALL); break; } } return 0; } void CCameraSelectionPage::RepaintAllThumbnails() { // // This could take a while for a lot of images, especially since we don't cache DIBs, // so we'll display an hourglass cursor here. // CWaitCursor wc; for (int i=0;i= 0) { LVITEM LvItem = {0}; LvItem.iItem = i; LvItem.mask = LVIF_IMAGE; LvItem.iImage = nImageListIndex; ListView_SetItem( GetDlgItem(m_hWnd,IDC_CAMSEL_THUMBNAILS), &LvItem ); } } } UpdateWindow( m_hWnd ); } LRESULT CCameraSelectionPage::OnSysColorChange( WPARAM wParam, LPARAM lParam ) { SendDlgItemMessage( m_hWnd, IDC_CAMSEL_THUMBNAILS, WM_SYSCOLORCHANGE, wParam, lParam ); SendDlgItemMessage( m_hWnd, IDC_ACTION_BUTTON_BAR, WM_SYSCOLORCHANGE, wParam, lParam ); SendDlgItemMessage( m_hWnd, IDC_SELECTION_BUTTON_BAR, WM_SYSCOLORCHANGE, wParam, lParam ); SendDlgItemMessage( m_hWnd, IDC_TAKEPICTURE_BUTTON_BAR, WM_SYSCOLORCHANGE, wParam, lParam ); m_CameraSelectionButtonBarBitmapInfo.ReloadAndReplaceBitmap(); m_CameraTakePictureButtonBarBitmapInfo.ReloadAndReplaceBitmap(); m_CameraActionButtonBarBitmapInfo.ReloadAndReplaceBitmap(); RepaintAllThumbnails(); return 0; } LRESULT CCameraSelectionPage::OnThemeChanged( WPARAM wParam, LPARAM lParam ) { SendDlgItemMessage( m_hWnd, IDC_CAMSEL_THUMBNAILS, WM_THEMECHANGED, wParam, lParam ); return 0; } LRESULT CCameraSelectionPage::OnSettingChange( WPARAM wParam, LPARAM lParam ) { // // Create a small image list, to prevent the checkbox state images from being resized in WM_SYSCOLORCHANGE // HIMAGELIST hImageListSmall = ImageList_Create( GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR24|ILC_MASK, 1, 1 ); if (hImageListSmall) { HIMAGELIST hImgListOld = ListView_SetImageList( GetDlgItem( m_hWnd, IDC_CAMSEL_THUMBNAILS ), hImageListSmall, LVSIL_SMALL ); if (hImgListOld) { ImageList_Destroy(hImgListOld); } } SendDlgItemMessage( m_hWnd, IDC_CAMSEL_THUMBNAILS, WM_SETTINGCHANGE, wParam, lParam ); return 0; } LRESULT CCameraSelectionPage::OnCommand( WPARAM wParam, LPARAM lParam ) { SC_BEGIN_COMMAND_HANDLERS() { SC_HANDLE_COMMAND( IDC_CAMSEL_SELECT_ALL, OnSelectAll ); SC_HANDLE_COMMAND( IDC_CAMSEL_CLEAR_ALL, OnClearAll ); SC_HANDLE_COMMAND( IDC_CAMSEL_PROPERTIES, OnProperties ); SC_HANDLE_COMMAND( IDC_CAMSEL_ROTATE_RIGHT, OnRotate ); SC_HANDLE_COMMAND( IDC_CAMSEL_ROTATE_LEFT, OnRotate ); SC_HANDLE_COMMAND( IDC_CAMSEL_TAKE_PICTURE, OnTakePicture ); SC_HANDLE_COMMAND( IDC_CAMSEL_DELETE, OnDelete ); } SC_END_COMMAND_HANDLERS(); } LRESULT CCameraSelectionPage::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_TRANSLATEACCELERATOR,OnTranslateAccelerator); SC_HANDLE_NOTIFY_MESSAGE_CODE(TTN_GETDISPINFO,OnGetToolTipDispInfo); SC_HANDLE_NOTIFY_MESSAGE_CONTROL(LVN_ITEMCHANGED,IDC_CAMSEL_THUMBNAILS,OnThumbnailListSelChange); SC_HANDLE_NOTIFY_MESSAGE_CONTROL(LVN_KEYDOWN,IDC_CAMSEL_THUMBNAILS,OnThumbnailListKeyDown); } SC_END_NOTIFY_MESSAGE_HANDLERS(); } LRESULT CCameraSelectionPage::OnThreadNotification( WPARAM wParam, LPARAM lParam ) { WTM_BEGIN_THREAD_NOTIFY_MESSAGE_HANDLERS() { WTM_HANDLE_NOTIFY_MESSAGE( TQ_DOWNLOADTHUMBNAIL, OnNotifyDownloadThumbnail ); WTM_HANDLE_NOTIFY_MESSAGE( TQ_DOWNLOADIMAGE, OnNotifyDownloadImage ); } WTM_END_THREAD_NOTIFY_MESSAGE_HANDLERS(); } INT_PTR CALLBACK CCameraSelectionPage::DialogProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { SC_BEGIN_DIALOG_MESSAGE_HANDLERS(CCameraSelectionPage) { SC_HANDLE_DIALOG_MESSAGE( WM_INITDIALOG, OnInitDialog ); SC_HANDLE_DIALOG_MESSAGE( WM_DESTROY, OnDestroy ); SC_HANDLE_DIALOG_MESSAGE( WM_COMMAND, OnCommand ); SC_HANDLE_DIALOG_MESSAGE( WM_NOTIFY, OnNotify ); SC_HANDLE_DIALOG_MESSAGE( WM_SHOWWINDOW, OnShowWindow ); SC_HANDLE_DIALOG_MESSAGE( WM_TIMER, OnTimer ); SC_HANDLE_DIALOG_MESSAGE( WM_SYSCOLORCHANGE, OnSysColorChange ); SC_HANDLE_DIALOG_MESSAGE( WM_THEMECHANGED, OnThemeChanged ); SC_HANDLE_DIALOG_MESSAGE( WM_SETTINGCHANGE, OnSettingChange ); } SC_HANDLE_REGISTERED_DIALOG_MESSAGE( m_nThreadNotificationMessage, OnThreadNotification ); SC_HANDLE_REGISTERED_DIALOG_MESSAGE( m_nWiaEventMessage, OnEventNotification ); SC_END_DIALOG_MESSAGE_HANDLERS(); }