/*[]=====================================================================[]*/ /*[] LeadTools Run Time Library - Version 14 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2004 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[]=====================================================================[]*/ #include "CSDem32.h" static L_VOID FRAME_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, UINT codeNotify); static L_VOID FRAME_OnInitMenuPopup (HWND hWnd, HMENU hMenu, L_INT nItem, L_BOOL bSystemMenu); static L_VOID FRAME_OnDestroy (HWND hWnd); static L_BOOL FRAME_OnCreate (HWND hWnd, CREATESTRUCT FAR * lpCreateStruct); static L_VOID FRAME_OnClose (HWND hWnd); static L_VOID FRAME_OnSize (HWND hWnd, L_UINT nState, L_INT nCX, L_INT nCY); static L_VOID FRAME_OnDrop (HWND hWnd, HDROP hDrop); L_VOID GetDir (LPTSTR Dir, LPTSTR pszTitle); // File Open Dialog static OPENDLGPARAMS foParm; WNDPROC hOldProgWndProc; #ifdef UNICODE HFONT ghDlgFont = NULL; #endif// UNICODE L_INT OpenBitmapChild (LPTSTR szFileName); L_BOOL OpenBitmap (HWND hWnd); L_VOID L_FileError (HWND hWnd, L_INT nCode, LPTSTR pTitle, LPTSTR pFilename); L_INT ShowICCProfileLoadDialog (HWND hWnd); /*====(FrameWndProc)=================================================== Description: Handles all messages dispatched to the Frame window. Other messages that cannot be processed will be dispatched to the Client window procedure. Syntax : LRESULT CALLBACK FrameWndProc (HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) Prototype : ImgDemo.h Parameters : hWnd Handle to a window. uMessage Windows uMessage structure. wParam Windows word parameter. lParam Windows long parameter. Return Value: This is specific for each uMessage. See Windows Programmer's Reference Volume 3. ==========================================================================*/ LRESULT CALLBACK FrameWndProc (HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) { switch (uMessage) { HANDLE_MSG (hWnd, WM_CREATE, FRAME_OnCreate); HANDLE_MSG (hWnd, WM_INITMENUPOPUP, FRAME_OnInitMenuPopup); HANDLE_MSG (hWnd, WM_DESTROY, FRAME_OnDestroy); HANDLE_MSG (hWnd, WM_COMMAND, FRAME_OnCommand); HANDLE_MSG (hWnd, WM_CLOSE, FRAME_OnClose); HANDLE_MSG (hWnd, WM_SIZE, FRAME_OnSize); HANDLE_MSG (hWnd, WM_DROPFILES, FRAME_OnDrop); } return DefFrameProc (hWnd, hWndClient, uMessage, wParam, lParam); } /*====(LEADTOOLS_OnDropFiles)================================================== Description: Handles the WM_DROPFILES message Syntax : VOID LEADTOOLS_OnDropFiles(HWND hWnd, HDROP hdrop) Parameters : hWnd Handle to the window. hdrop Handle to the dropped files Return Value: None. ==========================================================================*/ static VOID FRAME_OnDrop(HWND hWnd, HDROP hdrop) { L_TCHAR szDropedFileName[256]; L_INT nFilesCount, nFiles,nRet; FILEINFO foFileInfo; BITMAPHANDLE Bitmap; memset(szDropedFileName, 0, 256); // Get draged files count nFilesCount = DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0); for (nFiles = 0; nFiles < nFilesCount; nFiles++) { DragQueryFile(hdrop, nFiles, szDropedFileName, 256); L_FileInfo(szDropedFileName, &foFileInfo, sizeof(FILEINFO), FILEINFO_TOTALPAGES, NULL); nRet = L_LoadBitmap (szDropedFileName, &Bitmap, sizeof(BITMAPHANDLE), 0, ORDER_BGR, NULL, NULL); if(nRet != SUCCESS) { MessageBox(hWnd, TEXT("Invalid File(s)"), TEXT("Error"), MB_OK | MB_ICONEXCLAMATION); return; } L_ChangeBitmapViewPerspective(&Bitmap, &Bitmap, sizeof(BITMAPHANDLE),TOP_LEFT); StripWithExt(pszTitle1, szDropedFileName); CreateChildWindow(pszTitle1, &Bitmap, NULL, 0, FALSE); } } /*====(FRAME_OnCreate)======================================================== Description: Creates a client window in response to WM_CREATE from the frame window. Syntax : L_BOOL FRAME_OnCreate (HWND hWnd, CREATESTRUCT L_FAR * lpCreateStruct) Parameters : hWnd Handle to current window. lpCreateStruct pointer to CREATESTRUCT Return Value: TRUE The function was successful in creating window. FALSE The function was not successful. ==========================================================================*/ static L_BOOL FRAME_OnCreate (HWND hWnd, CREATESTRUCT L_FAR * lpCreateStruct) { CLIENTCREATESTRUCT clientcreate; L_DlgInit (DLG_INIT_COLOR) ; memset(&clientcreate, 0, sizeof(CLIENTCREATESTRUCT)); memset(&foParm, 0, sizeof(OPENDLGPARAMS)); clientcreate.hWindowMenu = hMenuChildWindow; clientcreate.idFirstChild = IDM_FIRSTCHILD; hWndClient = CreateWindow(TEXT("MDICLIENT"), NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, (HMENU) 1, hInst, (PSTR) &clientcreate); lpfnStatusBar = MakeProcInstance((FARPROC)StatusBarProc, hInst); hStatusWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_STATUSBAR), hWnd, (DLGPROC) lpfnStatusBar); hOldProgWndProc = (WNDPROC)SetWindowLong(GetDlgItem(hStatusWnd, IDC_STATUS_PROG), GWL_WNDPROC, (LONG)ProgressBarProc); ShowWindow(GetDlgItem(hStatusWnd, IDC_STATUS_PROG), SW_HIDE); if(hWndClient) { UNLOCKSUPPORT(); } /* Enable Drag and Drop Files */ DragAcceptFiles(hWnd, TRUE); StatusProc.lpfnStatusCB = MakeProcInstance (StatusCallBack, hInst); L_SetStatusCallBack (StatusProc.lpfnStatusCB, NULL, &StatusProc.lpfnOldStatusCB, NULL); StatusProc.bProgress = FALSE; StatusProc.bStillWork = FALSE; StatusProc.nPercent = 0; StatusProc.bOneTick = FALSE; #ifdef UNICODE GenerateDefaultFont ( &ghDlgFont ) ; #endif// UNICODE return ((hWndClient) ? TRUE : FALSE); } /*====(LEADTOOLS_OnSize)================================================== Description: Handles the WM_SIZE uMessage. It positions the Status Bar and Client windows. Syntax : VOID LEADTOOLS_OnSize(HWND hWnd, UINT state, int nCX, int nCY) Parameters : hWnd Handle to the window. state Window state nCX Client area width nCY Client area height Return Value: None. ==========================================================================*/ static VOID FRAME_OnSize(HWND hWnd, L_UINT nState, L_INT nCX, L_INT nCY) { RECT rcRect; L_INT cyStatus; GetWindowRect(hStatusWnd, &rcRect); cyStatus = RECTHEIGHT(&rcRect); MoveWindow(hStatusWnd, 0, nCY - cyStatus, nCX, cyStatus, TRUE); DefFrameProc (hWnd, hWndClient, WM_SIZE, (WPARAM)nState, MAKELPARAM(nCX, nCY - cyStatus)); } /*====(FRAME_OnClose)================================================== Description: Handles the WM_CLOSE uMessage. It sends IDM_CLOSEALL to close all open child windows and to destroy the frame window. Syntax : L_VOID FRAME_OnClose (HWND hWnd) Parameters : hWnd Handle to the window. Return Value: None. ==========================================================================*/ static L_VOID FRAME_OnClose (HWND hWnd) { FORWARD_WM_COMMAND(hWnd, IDM_WINDOW_CLOSEALL, 0, 0, SendMessage); DestroyWindow(hWnd); } /*====(FRAME_OnInitMenuPopup)============================================ Description: Initializes the main popup menu when the user clicks on one of the menu items. Syntax : L_VOID FRAME_OnInitMenuPopup (HWND hWnd, HMENU hMenu, L_INT nItem, BOOL fSystemMenu) Parameters : hWnd Handle to the window using the popup menu. hMenu Handle to the menu to be used. nItem Number of items in the menu. fSystemMenu Truth of "Is the menu a system menu". Return Value: None. ==========================================================================*/ static L_VOID FRAME_OnInitMenuPopup (HWND hWnd, HMENU hMenu, L_INT nItem, L_BOOL fSystemMenu) { L_BOOL bClipboardReady; pCHILDDATA pData = NULL; HWND hWndParent; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient,SendMessage); pData = (pCHILDDATA) GetWindowLong(hWndParent, GWL_USERDATA); bClipboardReady = L_ClipboardReady(); EnableMenuItem(hMenu, IDM_EDIT_PASTE, MF_BYCOMMAND | ((bClipboardReady) ? MF_ENABLED : MF_GRAYED)); if (pData) //UNDOLIST// { EnableMenuItem (hMenu, IDM_EDIT_UNDO, (L_UndoList_UndoExists (hWndParent)) ? MF_ENABLED : MF_GRAYED); EnableMenuItem (hMenu, IDM_EDIT_REDO, (L_UndoList_RedoExists (hWndParent)) ? MF_ENABLED : MF_GRAYED); } } /*====(FRAME_OnCommand)================================================== Description: Translates the WM_COMMAND uMessage sent to the frame window procedure. Other command messages that are specific to the child window will be forwarded to that window. Syntax : L_VOID FRAME_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, UINT codeNotify) Parameters : hWnd Handle to the window. nID Control or menu item identifier. hWndCtl Handle of control codeNotify Notification uMessage Return Value: None. ==========================================================================*/ static L_VOID FRAME_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, UINT codeNotify) { HWND hChildWnd; switch(nID) { case IDM_FILE_OPEN: OpenBitmap(hWnd); return; case IDM_FILE_CLOSE: hChildWnd = (HWND) SendMessage(hWndClient, WM_MDIGETACTIVE, 0, 0); if(SendMessage(hChildWnd, WM_QUERYENDSESSION, 0, 0)) SendMessage(hWndClient, WM_MDIDESTROY, (WPARAM) hChildWnd, 0); return; case IDM_FILE_EXIT: SendMessage(hWnd, WM_CLOSE, 0, 0); return; case IDM_EDIT_PASTE: PasteBitmap(hWnd); return; case IDM_WINDOW_CASCADE: SendMessage(hWndClient, WM_MDICASCADE, 0, 0); return; case IDM_WINDOW_TILE_HORIZONTAL: SendMessage(hWndClient, WM_MDITILE, MDITILE_HORIZONTAL | MDITILE_SKIPDISABLED, 0); return; case IDM_WINDOW_TILE_VERTICAL: SendMessage(hWndClient, WM_MDITILE, MDITILE_VERTICAL | MDITILE_SKIPDISABLED, 0); return; case IDM_WINDOW_ARRANGE: SendMessage(hWndClient, WM_MDIICONARRANGE, 0, 0); return; case IDM_WINDOW_CLOSEALL: EnumChildWindows(hWndClient, CloseEnumProc, 0); break; case IDM_ICCPROFILES: ShowICCProfileLoadDialog(hWnd); break; case IDM_HELP_ABOUT: DoDialogBoxParam(IDD_ABOUTBOX, hWnd, (DLGPROC) AboutDlgProc, 0); return; default: hChildWnd = (HWND) SendMessage(hWndClient, WM_MDIGETACTIVE, 0, 0); if(IsWindow(hChildWnd)) SendMessage(hChildWnd, WM_COMMAND, MAKEWPARAM((UINT)(nID),(UINT)(codeNotify)), (LPARAM)(HWND)(hWndCtl)); break; } DefFrameProc(hWnd, hWndClient, WM_COMMAND, MAKEWPARAM((UINT)(nID),(UINT)(codeNotify)), (LPARAM)(HWND)(hWndCtl)); } /*====(FRAME_OnDestroy)================================================= Description: Performs cleanup for the program, and posts WM_QUIT to terminate the application. Syntax : L_VOID FRAME_OnDestroy (HWND hWnd) Parameters : hWnd Handle to a window. Return Value: None. ==========================================================================*/ static L_VOID FRAME_OnDestroy (HWND hWnd) { if(hStatusWnd) DestroyWindow(hStatusWnd); if(lpfnStatusBar) FreeProcInstance(lpfnStatusBar); #ifdef UNICODE if ( NULL != ghDlgFont ) { DeleteObject ( ghDlgFont ) ; ghDlgFont = NULL ; } #endif L_DlgFree(); PostQuitMessage(0); } /*====(CreateChildWindow)================================================== Description: Sets up data for MDI child window creation. Syntax : HWND CreateChildWindow (L_CHAR L_FAR * pszTitle, pBITMAPHANDLE pBitmap, pBITMAPHANDLE pThumb, L_INT nBitmapFormat, L_BOOL bIsFile) Prototype : demo.h Parameters : pszTitle Title for the window. pBitmap Image to set in the window. pThumb pointer to thumbniel image. nBitmapFormat Image format. bIsFile if image from file or not. Return Value: hWndChild Window handle of the child window. ==========================================================================*/ HWND CreateChildWindow (L_TCHAR L_FAR * pszTitle, pBITMAPHANDLE pBitmap, pBITMAPHANDLE pThumb, L_INT nBitmapFormat, L_BOOL bIsFile) { HWND hWndChild; CREATEDATA CreateData; MDICREATESTRUCT mdiCreateStruct; L_ColorResBitmap(pBitmap, pBitmap, sizeof(BITMAPHANDLE), 24, CRF_BYTEORDERBGR, NULL, NULL, 0, NULL, NULL); CreateData.pszTitle = pszTitle; CreateData.pBitmap = pBitmap; CreateData.pThumbnel = pThumb; CreateData.nBitmapFormat = nBitmapFormat; CreateData.bIsFile = bIsFile; mdiCreateStruct.szClass = szChildClass; mdiCreateStruct.szTitle = pszTitle; mdiCreateStruct.hOwner = hInst; mdiCreateStruct.x = CW_USEDEFAULT; mdiCreateStruct.y = CW_USEDEFAULT; mdiCreateStruct.cx = CW_USEDEFAULT; mdiCreateStruct.cy = CW_USEDEFAULT; mdiCreateStruct.style = MDIS_ALLCHILDSTYLES | WS_CLIPCHILDREN; mdiCreateStruct.lParam = (LPARAM) (LPCREATEDATA) & CreateData; hWndChild = (HWND) SendMessage(hWndClient, WM_MDICREATE, 0, (LPARAM) (LPMDICREATESTRUCT) &mdiCreateStruct); return hWndChild; } L_INT DoDialogBoxParam (L_INT nDialog, HWND hWnd, DLGPROC pfnDialog, LPARAM lParam) { L_INT nRet; DLGPROC pfn; pfn = (DLGPROC) MakeProcInstance((FARPROC) pfnDialog, hInst); nRet = DialogBoxParam(hInst, MAKEINTRESOURCE(nDialog), hWnd, pfn, lParam); FreeProcInstance((FARPROC) pfn); return nRet; } L_BOOL CALLBACK CloseEnumProc (HWND hWnd, LPARAM lParam) { if (GetWindow (hWnd, GW_OWNER)) return TRUE; SendMessage (GetParent (hWnd), WM_MDIRESTORE, (WPARAM) hWnd, 0); if (!SendMessage (hWnd, WM_QUERYENDSESSION, 0, 0)) return TRUE; SendMessage (GetParent (hWnd), WM_MDIDESTROY, (WPARAM) hWnd, 0); return TRUE; } /*====(PasteBitmap)============================================================== Description: Pastes the image from the clipboard. Syntax : L_INT PasteBitmap (HWND hWnd) Parameters : hWnd Handle to a window.. Return Value: None. ==========================================================================*/ L_INT PasteBitmap (HWND hWnd) { L_INT nRet; L_TCHAR szBuffer[256]; HCURSOR hOldCur; BITMAPHANDLE Bitmap; BITMAPHANDLE Thumb; static L_INT nPasteNo = 0; hOldCur = SetCursor(LoadCursor(NULL, IDC_WAIT)); L_InitBitmap(&Bitmap, sizeof(BITMAPHANDLE), 0, 0, 0); nRet = 0; nRet = L_CopyFromClipboard(hWnd, &Bitmap, sizeof(BITMAPHANDLE)); if(nRet == SUCCESS) { memset(szBuffer, 0, sizeof(szBuffer)); wsprintf(szBuffer, TEXT("Clipboard Data: %d"), ++nPasteNo); L_ChangeBitmapViewPerspective(NULL, &Bitmap, sizeof(BITMAPHANDLE),TOP_LEFT); L_InitBitmap(&Thumb, sizeof(BITMAPHANDLE),0, 0, 0); L_CopyBitmap(&Thumb,&Bitmap, sizeof(BITMAPHANDLE)); L_SizeBitmap(&Thumb, 250, 200, SIZE_NORMAL); CreateChildWindow(szBuffer, &Bitmap, &Thumb,0, FALSE); } SetCursor(hOldCur); return nRet; } /*====(fMessageBox)======================================================== Description: Creates a uMessage box. Syntax : L_INT fMessageBox (HWND hWnd, LPSTR pCaption, UINT wType, LPSTR pFormat,...) Prototype : demo.h Parameters : hWnd Handle of a window. pCaption Pointer to the title of the uMessage box. wType Type of the uMessage box. pFormat Format of the uMessage box. Return Value: X Return value of Window's MessageBox function. ==========================================================================*/ L_INT fMessageBox (HWND hWnd, LPSTR pCaption, UINT wType, LPSTR pFormat,...) { L_CHAR szText[256]; va_list ap; va_start (ap, pFormat); #ifdef _ALPHA_ vsprintf (szText,pFormat,ap); #else vsprintf (szText, pFormat, (LPSTR) ap); #endif va_end (ap); return (MessageBoxA (hWnd, szText, pCaption, wType)); } /*====(L_FileError)======================================================== Description: Sets up parameters for an error uMessage box. Syntax : L_VOID L_FileError (HWND hWnd, L_INT nCode, LPSTR pTitle, LPSTR pFilename) Prototype : demo.h Parameters : hWnd Handle of a window. nCode Error code to be displayed. pTitle Pointer to the title of the uMessage box. pFilename Pointer to the filename associated with the error. Return Value: None. ==========================================================================*/ L_VOID L_FileError (HWND hWnd, L_INT nCode, LPTSTR pTitle, LPTSTR pFilename) { L_TCHAR ErrorBuf[1024]; switch (nCode) { case ERROR_TRUNCATE_WIDTH: wsprintf(ErrorBuf, TEXT("The image must have a width and height value that is a multiple of 2")); break; case ERROR_TRUNCATE_WIDTH_AND_HEIGHT: wsprintf(ErrorBuf, TEXT("The image must have a width and height value that is a multiple of 4")); break; case ERROR_NO_MEMORY: wsprintf (ErrorBuf, TEXT("Not enough memory available!")); break; case ERROR_NO_BITMAP: wsprintf (ErrorBuf, TEXT("Invalid bitmap handle!")); break; case ERROR_MEMORY_TOO_LOW: wsprintf (ErrorBuf, TEXT("Not enough memory available!")); break; case ERROR_FILE_LSEEK: wsprintf (ErrorBuf, TEXT("Error seeking to position!")); break; case ERROR_FILE_WRITE: wsprintf (ErrorBuf, TEXT("Error writing file!")); break; case ERROR_FILE_GONE: wsprintf (ErrorBuf, TEXT("File not present - abort!")); break; case ERROR_FILE_READ: wsprintf (ErrorBuf, TEXT("Error reading file!")); break; case ERROR_INV_FILENAME: wsprintf (ErrorBuf, TEXT("Invalid filename specified!")); break; case ERROR_FILE_FORMAT: wsprintf (ErrorBuf, TEXT("Invalid file format!")); break; case ERROR_FILENOTFOUND: wsprintf (ErrorBuf, TEXT("File not found!")); break; case ERROR_INV_RANGE: wsprintf (ErrorBuf, TEXT("Invalid width/height!")); break; case ERROR_IMAGE_TYPE: wsprintf (ErrorBuf, TEXT("Image format recognized, but sub-type not supported!")); break; case ERROR_INV_PARAMETER: wsprintf (ErrorBuf, TEXT("Invalid parameter!")); break; case ERROR_FILE_OPEN: wsprintf (ErrorBuf, TEXT("Not able to open file!")); break; case ERROR_UNKNOWN_COMP: wsprintf (ErrorBuf, TEXT("Unknown compression format!")); break; case ERROR_FEATURE_NOT_SUPPORTED: wsprintf (ErrorBuf, TEXT("Feature not supported!")); break; case ERROR_NOT_256_COLOR: wsprintf (ErrorBuf, TEXT("VGA card only supports 256 colors (8 bit)!")); break; case ERROR_PRINTER: wsprintf (ErrorBuf, TEXT("Printer error!")); break; case ERROR_CRC_CHECK: wsprintf (ErrorBuf, TEXT("Data CRC check error!")); break; case ERROR_QFACTOR: wsprintf (ErrorBuf, TEXT("Invalid QFactor specified!")); break; case ERROR_TARGAINSTALL: wsprintf (ErrorBuf, TEXT("TARGA not installed!")); break; case ERROR_OUTPUTTYPE: wsprintf (ErrorBuf, TEXT("Invalid compression format!")); break; case ERROR_XORIGIN: wsprintf (ErrorBuf, TEXT("X origin specified invalid!")); break; case ERROR_YORIGIN: wsprintf (ErrorBuf, TEXT("Y origin specified invalid!")); break; case ERROR_VIDEOTYPE: wsprintf (ErrorBuf, TEXT("Invalid video mode!")); break; case ERROR_BITPERPIXEL: wsprintf (ErrorBuf, TEXT("Invalid bits/pixel!")); break; case ERROR_WINDOWSIZE: wsprintf (ErrorBuf, TEXT("Invalid window size!")); break; case ERROR_NORMAL_ABORT: wsprintf (ErrorBuf, TEXT("Escape key pressed!")); break; case ERROR_NO_STAMP: wsprintf (ErrorBuf, TEXT("Stamp not found!")); break; case ERROR_G3CODE_INVALID: wsprintf (ErrorBuf, TEXT("Invalid group 3 data!")); break; case ERROR_G3CODE_EOF: case ERROR_G3CODE_EOL: wsprintf (ErrorBuf, TEXT("Group3 code end of code!")); break; case ERROR_PREMATURE_EOF: wsprintf (ErrorBuf, TEXT("Premature EOF at scanline!")); break; case ERROR_PREMATURE_EOL: case ERROR_UNCOMP_EOF: case ERROR_ACT_INCOMP: case ERROR_BAD_DECODE_STATE: wsprintf (ErrorBuf, TEXT("Premature end-of-line code!")); break; case ERROR_VERSION_NUMBER: wsprintf (ErrorBuf, TEXT("Bad version number!")); break; case ERROR_TWAIN_NODSM: wsprintf (ErrorBuf, TEXT("Source manager not found!")); break; case ERROR_TWAIN_BUMMER: wsprintf (ErrorBuf, TEXT("Failure due to unknown causes!")); break; case ERROR_TWAIN_LOWMEMORY: wsprintf (ErrorBuf, TEXT("Not enough memory to perform operation!")); break; case ERROR_TWAIN_NODS: wsprintf (ErrorBuf, TEXT("No Data Source!")); break; case ERROR_TWAIN_MAXCONNECTIONS: wsprintf (ErrorBuf, TEXT("DS is connected to max possible apps!")); break; case ERROR_TWAIN_OPERATIONERROR: wsprintf (ErrorBuf, TEXT("DS or DSM reported error, app shouldn't!")); break; case ERROR_TWAIN_BADCAP: wsprintf (ErrorBuf, TEXT("Unknown capability!")); break; case ERROR_TWAIN_BADPROTOCOL: wsprintf (ErrorBuf, TEXT("Unrecognized MSG DG DAT combination!")); break; case ERROR_TWAIN_BADVALUE: wsprintf (ErrorBuf, TEXT("Data parameter out of range!")); break; case ERROR_TWAIN_SEQERROR: wsprintf (ErrorBuf, TEXT("DG DAT MSG out of expected sequence!")); break; case ERROR_TWAIN_BADDEST: wsprintf (ErrorBuf, TEXT("Unknown destination App/Src in DSM_Entry!")); break; case ERROR_TWAIN_CANCEL: wsprintf (ErrorBuf, TEXT("Operation was cancelled!")); break; case ERROR_NOT_ENOUGH_IMAGES: wsprintf (ErrorBuf, TEXT("Not enough images to complete the process!")); break; case ERROR_IMAGE_EMPTY: wsprintf (ErrorBuf, TEXT("Image is empty!")); break; case ERROR_NO_CHANGE: wsprintf (ErrorBuf, TEXT("The image hasn't changed!")); break; case ERROR_LZW_LOCKED: wsprintf (ErrorBuf, TEXT("LZW capability is required to load/save this file!")); break; case ERROR_DOCUMENT_NOT_ENABLED: wsprintf (ErrorBuf, TEXT("Express capability is required to use this function!")); break; case ERROR_MEDICAL_NOT_ENABLED: wsprintf (ErrorBuf, TEXT("Medical Express capability is required to use this function!")); break; case ERROR_JBIG_NOT_ENABLED: wsprintf (ErrorBuf, TEXT("JBIG capability is required to use this function!")); break; case ERROR_FPX_FILE_IN_USE: wsprintf (ErrorBuf, TEXT("Error accessing file. The file is probably already open!")); break; #if defined(WIN32) && !defined(_ALPHA_) case ERROR_ISIS_NOCURSCANNER: wsprintf (ErrorBuf, TEXT("No ISIS Scanner selected!")); break; case ERROR_ISIS_CANCEL: wsprintf (ErrorBuf, TEXT("ISIS Operation canceled!")); break; case ERROR_ISIS_SCANDRIVER_NOT_LOADED: wsprintf (ErrorBuf, TEXT("ISIS Driver failed to load")); break; case ERROR_ISIS_BAD_TAG_OR_VALUE: case ERROR_ISIS_NOT_READY: case ERROR_ISIS_JAM: case ERROR_ISIS_SCANNER_ERROR: case ERROR_ISIS_BUSY: case ERROR_ISIS_FILE_ERROR: case ERROR_ISIS_NETWORK_ERROR: wsprintf (ErrorBuf, TEXT("ISIS Scanner Error acquiring image!")); break; case ERROR_ISIS_NO_PAGE: wsprintf (ErrorBuf, TEXT("No Page in ISIS Scanner!")); break; #endif case ERROR_USER_ABORT: case ERROR_DLG_FAILED: return; break; default: if(nCode >= ERROR_FPX_INVALID_FORMAT_ERROR && nCode <= ERROR_FPX_INVALID_TILE) wsprintf (ErrorBuf, TEXT("Internal FlashPix error!")); else wsprintf (ErrorBuf, TEXT("Internal or Unrecognized Error!")); break; } #ifdef UNICODE { L_CHAR szTempTitle [ L_MAXPATH ] = "" ; L_CHAR szTempFilename [ L_MAXPATH ] = "" ; L_CHAR szTempError [ L_MAXPATH ] = "" ; WideCharToMultiByte(CP_ACP, 0, pTitle, -1, szTempTitle, L_MAXPATH,NULL,NULL); WideCharToMultiByte(CP_ACP, 0, pFilename, -1, szTempFilename, L_MAXPATH,NULL,NULL); WideCharToMultiByte(CP_ACP, 0, ErrorBuf, -1, szTempError, L_MAXPATH,NULL,NULL); fMessageBox (hWnd, szTempTitle, MB_ICONEXCLAMATION | MB_OK, "%s\nLEADTOOLS DLL Error (%d)\n%s", szTempFilename, nCode, (LPSTR) szTempError); } #else fMessageBox (hWnd, pTitle, MB_ICONEXCLAMATION | MB_OK, "%s\nLEADTOOLS DLL Error (%d)\n%s", pFilename, nCode, (LPSTR) ErrorBuf); #endif return; } L_INT OpenBitmapChild ( LPTSTR szFileName) { BITMAPHANDLE Bitmap; L_INT nRet; nRet = L_LoadBitmap (szFileName, &Bitmap, sizeof(BITMAPHANDLE), 0, ORDER_BGR, NULL, NULL); if(nRet != SUCCESS) return nRet; L_ChangeBitmapViewPerspective(&Bitmap, &Bitmap, sizeof(BITMAPHANDLE),TOP_LEFT); CreateChildWindow(szFileName, &Bitmap, NULL, 0, FALSE); return nRet; } L_VOID StripWithExt(LPTSTR StripName, LPTSTR pszTitle) { L_INT nEndPos = 0; L_INT nSlashPos; L_INT nCount; L_TCHAR cX = '\0'; memset(StripName, 0, lstrlen(StripName)*sizeof(L_TCHAR)); while(pszTitle[nEndPos] != cX) { nEndPos++; } for(nSlashPos = nEndPos; nSlashPos >= 0; nSlashPos--) { if(pszTitle[nSlashPos ] == '\\') break; } for(nCount = 0, nSlashPos++; nSlashPos < nEndPos; nSlashPos++, nCount++) { StripName[nCount] = pszTitle[nSlashPos]; } } /*--------------------------------------------------------------------------+ | Function :CleanOpenDlgParam | Desc :Clean File open Param structuer | Return : | Notes : +--------------------------------------------------------------------------*/ L_VOID CleanOpenDlgParam(LPOPENDLGPARAMS pFOParam) { int i=0; if(pFOParam!=NULL && pFOParam->pFileData!= NULL ) { for(i=0; i < pFOParam->nNumOfFiles; ++i ) { if(pFOParam->pFileData[i].pBitmap != NULL) { L_FreeBitmap(pFOParam->pFileData[i].pBitmap); GlobalFreePtr(pFOParam->pFileData[i].pBitmap); pFOParam->pFileData[i].pBitmap = NULL; } if(pFOParam->pFileData[i].pThumbnail != NULL) { L_FreeBitmap(pFOParam->pFileData[i].pThumbnail); GlobalFreePtr(pFOParam->pFileData[i].pThumbnail); pFOParam->pFileData[i].pThumbnail = NULL; } if(pFOParam->pFileData[i].pFileInfo != NULL) { GlobalFreePtr(pFOParam->pFileData[i].pFileInfo); pFOParam->pFileData[i].pFileInfo = NULL; } } GlobalFreePtr(pFOParam->pFileData); pFOParam->pFileData =NULL; pFOParam->nNumOfFiles = 0; } } /*====(OpenBitmap)======================================================== Description: Loads the image from file and creates a child window for the image. Syntax : L_BOOL OpenBitmap( HWND hWnd, pBITMAPHANDLE pBitmap, pBITMAPHANDLE pThumb) Parameters : hWnd Handle to a window. pBitmap pointer to BitmapHandle. pThumb pointer to ThumbnielHandle. Return Value: None. ==========================================================================*/ L_BOOL OpenBitmap(HWND hWnd) { OPENFILENAME OpenFileName; L_INT nRet; L_INT nI; L_INT nFilterIndex; L_UINT nMin, nMax; memset(strSection, 0, sizeof(strSection)); GetProfileString(strSection, strStringItem, TEXT(""), szDirectory, sizeof(szDirectory)); memset(&OpenFileName, 0, sizeof(OPENFILENAME)); memset(&foParm, 0, sizeof(OPENDLGPARAMS)); OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.lpstrFilter = TEXT("BMP\0 *.bmp"); OpenFileName.nFilterIndex = 0;//nFilterIndex; OpenFileName.nMaxCustFilter = 12; OpenFileName.hwndOwner = hWnd; OpenFileName.lpstrTitle = TEXT("Open a File"); OpenFileName.Flags = OFN_ALLOWMULTISELECT; OpenFileName.lpstrInitialDir = szDirectory; foParm.bShowLoadOptions = FALSE; foParm.bPreviewEnabled = TRUE; foParm.uStructSize = sizeof(OPENDLGPARAMS); foParm.uDlgFlags = DLG_OPEN_ENABLESIZING | DLG_OPEN_SHOW_PREVIEW | DLG_OPEN_USEFILESTAMP | DLG_OPEN_SHOW_PROGRESSIVE | DLG_OPEN_SHOW_MULTIPAGE | DLG_OPEN_SHOW_DELPAGE | DLG_OPEN_SHOW_LOADROTATED | DLG_OPEN_SHOW_LOADCOMPRESSED | DLG_OPEN_SHOW_LOADOPTIONS | DLG_OPEN_SHOW_FILEINFO | DLG_OPEN_SHOW_PDFOPTIONS | DLG_OPEN_SHOW_RASTEROPTIONS | DLG_OPEN_SHOW_VECTOROPTIONS | DLG_OPEN_SHOW_PDFOPTIONS | DLG_OPEN_VIEWTOTALPAGES | DLG_OPEN_LOADBITMAP; nRet = L_DlgOpen( hWnd, &OpenFileName, &foParm); if(nRet == SUCCESS_DLG_OK ) { nFilterIndex = OpenFileName.nFilterIndex; _itot(nFilterIndex, StrExt, 10); memset(szDirectory, 0, sizeof(szDirectory)); GetDir(szDirectory, foParm.pFileData[0].szFileName); WriteProfileString(strSection, strStringItem, szDirectory); for ( nI = 0 ; nI < foParm.nNumOfFiles ; nI++ ) { if ( NULL != foParm.pFileData[nI].pFileInfo ) { L_ChangeBitmapViewPerspective(foParm.pFileData[nI].pBitmap, foParm.pFileData[nI].pBitmap, sizeof(BITMAPHANDLE),TOP_LEFT); if(L_IsGrayScaleBitmap(foParm.pFileData[nI].pBitmap) && (foParm.pFileData[nI].pBitmap->BitsPerPixel == 12 || foParm.pFileData[nI].pBitmap->BitsPerPixel == 16)) { if (!foParm.pFileData[nI].pBitmap->Flags.UseLUT) { L_GetMinMaxBits(foParm.pFileData[nI].pBitmap, &nMin, &nMax); foParm.pFileData[nI].pBitmap->LowBit = nMin; foParm.pFileData[nI].pBitmap->HighBit = nMax; } else { foParm.pFileData[nI].pBitmap->LowBit = 0; foParm.pFileData[nI].pBitmap->HighBit = (foParm.pFileData[nI].pBitmap->BitsPerPixel) - 1; } } memset(pszTitle1, 0, sizeof(pszTitle1)); StripWithExt(pszTitle1, foParm.pFileData[nI].szFileName); CreateChildWindow(pszTitle1, foParm.pFileData[nI].pBitmap, NULL, 0, FALSE); foParm.pFileData[nI].pBitmap = NULL; } } CleanOpenDlgParam(&foParm); } else { if (nRet != SUCCESS_DLG_CANCEL) L_FileError(hWndFrame, nRet,(LPTSTR)TEXT("Error Cannot Open File"), TEXT("")); } return(nRet); } L_VOID GetDir(LPTSTR Dir, LPTSTR pszTitle) { L_INT nEndPos = 0; L_INT nSlashPos; L_INT nCount; L_TCHAR cX = '\0'; while(pszTitle[nEndPos] != cX) nEndPos++; for(nSlashPos = nEndPos; nSlashPos >= 0; nSlashPos--) { if(pszTitle[nSlashPos] == '\\') break; } for(nCount=0; nCount <= nSlashPos; nCount++) { Dir[nCount] = pszTitle[nCount]; } }