/***************************************************************************** * * (C) COPYRIGHT MICROSOFT CORPORATION, 1998 * * TITLE: preview.h * * VERSION: 1.0 * * AUTHOR: RickTu * * DATE: 11/02/00 * * DESCRIPTION: Class which backs up the template preview window * *****************************************************************************/ #ifndef _PRINT_PHOTOS_PREVIEW_H_ #define _PRINT_PHOTOS_PREVIEW_H_ #define PW_SETNEWTEMPLATE (WM_USER+1) // wParam holds index of template that was chosen class CWizardInfoBlob; class CPreviewBitmap; extern ATOM g_cPreviewClassWnd; #define PREVIEW_WIDTH 200 #define PREVIEW_HEIGHT 260 typedef struct { HBITMAP hPrevBmp; BOOL bValid; BOOL bBitmapGenerationInProgress; CPreviewBitmap * pPreviewBitmap; } PREVIEW_STATE, *LPPREVIEW_STATE; #define PV_MSG_PREVIEW_BITMAP_AVAILABLE (WM_USER+100) // wParam is template index // lParam holds hBitmap of image to show. // hBitmap must be freed by receiver of message. #define PV_MSG_GENERATE_NEW_PREVIEW (WM_USER+101) // wParam is template index #define PV_NO_LAST_TEMPLATE_CHOSEN -1 class CPreviewWindow { public: static CPreviewWindow* s_GetPW(HWND hwnd, UINT uMsg, LPARAM lParam) { WIA_PUSH_FUNCTION_MASK((0x10000000,TEXT("CPreviewWindow::s_GetPW()"))); if ((uMsg == WM_CREATE) || (uMsg == WM_NCCREATE)) { WIA_TRACE((TEXT("got WM_CREATE or WM_NCCREATE"))); if (lParam) { WIA_TRACE((TEXT("Setting GWLP_USERDATA to be 0x%x"),((LPCREATESTRUCT)lParam)->lpCreateParams)); SetWindowLongPtr( hwnd, GWLP_USERDATA, (LONG_PTR)((LPCREATESTRUCT)lParam)->lpCreateParams ); } } return (CPreviewWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA); } static LRESULT s_PreviewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { WIA_PUSH_FUNCTION_MASK((0x10000000,TEXT("CPreviewWindow::s_PreviewWndProc( 0x%x, 0x%x, 0x%x, 0x%x)"),hwnd,uMsg,wParam,lParam)); CPreviewWindow *pw = CPreviewWindow::s_GetPW(hwnd, uMsg, lParam); if (pw) { return pw->DoHandleMessage(hwnd, uMsg, wParam, lParam); } else { WIA_ERROR((TEXT("Got back NULL pw!"))); } return FALSE; } static VOID s_RegisterClass( HINSTANCE hInstance ) { WIA_PUSH_FUNCTION_MASK((0x100,TEXT("CPreviewWindow::s_RegisterClass()"))); if (!g_cPreviewClassWnd) { WNDCLASSEX wcex = {0}; wcex.cbSize = sizeof(wcex); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = CPreviewWindow::s_PreviewWndProc; wcex.hInstance = hInstance; wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszClassName = TEXT("PhotoPrintingPreviewWindowClass"); ::g_cPreviewClassWnd = RegisterClassEx(&wcex); if (!::g_cPreviewClassWnd) { WIA_ERROR((TEXT("Couldn't register class, GLE = %d"),GetLastError())); } } } public: CPreviewWindow( CWizardInfoBlob * pWizInfo ); ~CPreviewWindow(); LRESULT DoHandleMessage( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); LRESULT OnSetNewTemplate( WPARAM wParam, HDC hdc = NULL ); VOID DrawBitmap( HBITMAP hBitmap, HDC hdc = NULL ); HBITMAP GetPreviewBitmap( INT iTemplate ); VOID GenerateNewPreview( INT iTemplate ); VOID GenerateWorkingBitmap( HWND hwnd ); VOID ShowStillWorking( HWND hwnd ); VOID InvalidateAllPreviews(); VOID ShutDownBackgroundThreads(); VOID StallBackgroundThreads(); VOID RestartBackgroundThreads(); private: LRESULT _OnNewPreviewAvailable( WPARAM wParam, LPARAM lParam ); LRESULT _OnPaint(); LRESULT _OnSize( WPARAM wParam, LPARAM lParam ); VOID _InitList(); private: CWizardInfoBlob * _pWizInfo; INT _LastTemplate; PREVIEW_STATE * _hPreviewList; INT _NumTemplates; HWND _hwnd; HWND _hwndProgress; CSimpleCriticalSection _csList; HBITMAP _hStillWorkingBitmap; BOOL _bThreadsAreStalled; }; #define PVB_MSG_START (WM_USER+200) #define PVB_MSG_GENERATE_PREVIEW (PVB_MSG_START) #define PVB_MSG_EXIT_THREAD (PVB_MSG_START+1) #define PVB_MSG_END (PVB_MSG_EXIT_THREAD) class CPreviewBitmap { public: CPreviewBitmap( CWizardInfoBlob * pWizInfo, HWND hwnd, INT iTemplateIndex ); ~CPreviewBitmap(); VOID Invalidate(); HRESULT GetPreview(); VOID MessageQueueCreated(); VOID GeneratePreview(); VOID StallThread(); VOID RestartThread(); static DWORD CPreviewBitmap::s_PreviewBitmapWorkerThread(void *pv); private: HWND _hwndPreview; INT _iTemplateIndex; CWizardInfoBlob * _pWizInfo; CSimpleCriticalSection _csItem; HANDLE _hWorkThread; DWORD _dwWorkThreadId; HANDLE _hEventForMessageQueueCreation; BOOL _bThreadIsStalled; }; #endif