/*[]=====================================================================[]*/ /*[] LeadTools Run Time Library - Version 12 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2001 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[]=====================================================================[]*/ #include #include #include #include #include "resource.h" #include #include #include #include "global.h" /************************************/ /* Macro's definition */ /************************************/ #define Progress_SetRange(hwnd, low, high) \ (LRESULT)SendMessage((hwnd), PBM_SETRANGE, (WPARAM) 0, (LPARAM)MAKELONG((low), (high))) #define Progress_SetPos(hwnd, pos) \ (int)SendMessage((hwnd), PBM_SETPOS, (WPARAM)(pos), 0) #define NOTIFYCODE(w, l) HIWORD(w) #define CTLID(w, l) LOWORD(w) #define SCROLLPOS(w, l) ((L_INT16) HIWORD(w)) #define SCROLLCODE(w, l) LOWORD(w) #define USERSTRUCTA USERSTRUCT #define GETHBRBACKGROUND(hwnd) ((HBRUSH) GetClassLong(hwnd, GCL_HBRBACKGROUND)) #define RECTWIDTH(lpRect) (((LPRECT) lpRect)->right - ((LPRECT) lpRect)->left) #define RECTHEIGHT(lpRect) (((LPRECT) lpRect)->bottom - ((LPRECT) lpRect)->top) #define L_SRCCOPY (CB_DST_0 | CB_OP_OR) #define ENABLEMENUITEM(hMenu, wID, fFlag) EnableMenuItem(hMenu, (UINT)wID, (UINT)MF_BYCOMMAND | ((fFlag) ? MF_ENABLED : (MF_DISABLED | MF_GRAYED))) #define CHECKMENUITEM(hMenu, wID, fFlag) CheckMenuItem(hMenu, (UINT)wID, (UINT)MF_BYCOMMAND | ((fFlag) ? MF_CHECKED : MF_UNCHECKED)) /************************************/ /* Function's Prototypes */ /************************************/ static VOID LEADTOOLS_OnActivate(HWND hWnd, UINT uLWwParam, HWND hlParam, BOOL bLWwParam); static BOOL LEADTOOLS_OnCreateDemo(HWND hWnd, CREATESTRUCT FAR * lpCreateStruct); static VOID LEADTOOLS_OnPaint (HWND hWnd); static VOID LEADTOOLS_OnDestroy (HWND hWnd); static VOID LEADTOOLS_OnCommand (HWND hWnd, int id, HWND hwndCtl, UINT codeNotify); static VOID LEADTOOLS_OnLButtonUp (HWND hWnd, L_INT x, L_INT y, UINT keyFlags); static VOID LEADTOOLS_OnSize (HWND hWnd, UINT nState, int nCx, int nCy); static VOID LEADTOOLS_OnLButtonDown (HWND hWnd, BOOL fDoubleClick, L_INT x, L_INT y,UINT keyFlags); static VOID LEADTOOLS_OnMouseMove (HWND hWnd, L_INT x, L_INT y, UINT keyFlags); static VOID LEADTOOLS_OnVScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int npos); static VOID LEADTOOLS_OnHScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int npos); static BOOL LEADTOOLS_OnEraseBkgnd (HWND hWnd, HDC hDC); static VOID LEADTOOLS_OnPaletteChanged (HWND hWnd, HWND hWndPaletteChange); static BOOL LEADTOOLS_OnQueryNewPalette (HWND hWnd); static VOID LEADTOOLS_OnPaletteChanging(HWND hWnd, HWND hWndPaletteChange); static VOID LEADTOOLS_SysColorChange(HWND hwnd); L_INT yClientView(L_INT MousePos); L_INT xClientView(L_INT MousePos); COLORREF GetUserColor(COLORREF); L_VOID Stetch(pBITMAPHANDLE LeadBitmap,pBITMAPHANDLE TmpBitmap,L_INT X,L_INT Y); L_VOID ViewImage(HDC,HWND hWnd,BITMAPHANDLE pasedBitmap,L_INT Xloc,L_INT Yloc); L_INT SaveBitmapFile (HWND hWnd, pBITMAPHANDLE pBitmapHandle); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ; L_BOOL OpenTheFile( HWND hWnd, pBITMAPHANDLE pBitmap1); L_BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); L_VOID CreateMainImage(HWND hWnd); L_VOID SetImageBKColor(HWND hWnd); L_VOID SetNormalView(HWND hWnd); L_VOID SetFitWindowView(HWND hWnd); L_VOID ShowAboutDlg(HWND hWnd,HWND hwndCtl); L_VOID MakeFinalImage(HWND hWnd); L_VOID LEADTOOLS_EnabledMenu(); L_VOID InvertImage(HWND hWnd); L_VOID Brightness(HWND hWnd); L_VOID ContrastImage(HWND hWnd); L_VOID ResolutionColor(HWND hWnd); L_VOID FastFlipImage(HWND hWnd); L_VOID FlipImage(HWND hWnd); L_VOID ReverseImage(HWND hWnd); L_VOID ReverseImage(HWND hWnd); L_VOID FastReverseImage(HWND hWnd); L_VOID ShearImage(HWND hWnd); L_VOID DeskewImage(HWND hWnd); L_VOID AutoTrimImage(HWND hWnd,HWND hwndCtl); L_BOOL CALLBACK DlgBox(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); L_INT GetTrimValue(HWND hWnd, LPSTR pszTitle, L_INT nInit,HWND hwndCtl); L_VOID ResizeImage(HWND hWnd,L_INT id); L_VOID FastRotateImage(HWND hWnd,L_INT id); L_VOID RotateImage(HWND hWnd,L_INT id); L_VOID RotateAngle(HWND hWnd,L_INT id); L_VOID PosterizeImage(HWND hWnd); L_VOID MosaicImage(HWND hWnd); L_VOID UnderLayImage(HWND hWnd); L_VOID AverageImage(HWND hWnd); L_VOID MedianImage(HWND hWnd); L_VOID SharpenImage(HWND hWnd); L_VOID DespeckleImage(HWND hWnd); L_VOID AddNoiseImage(HWND hWnd); L_VOID EmbossImage(HWND hWnd); L_VOID OilifyImage(HWND hWnd,HWND hwndCtl); L_VOID EdgeEnhanceImage(HWND hWnd); L_VOID GradientFilter(HWND hWnd); L_VOID LaplacianFilter(HWND hWnd); L_VOID SobelFilter(HWND hWnd); L_VOID PrewittFilter(HWND hWnd); L_VOID ShiftanddifferenceFilter(HWND hWnd); L_VOID LinesegmentFilter(HWND hWnd); L_VOID ErosionFilter(HWND hWnd); L_VOID DilationFilter(HWND hWnd); L_VOID MinFilter(HWND hWnd); L_VOID MaxFilter(HWND hWnd); L_VOID ZoomImage(HWND hWnd,HWND hwndCtl); L_INT L_FAR L_EXPORT StatusCallBack (L_INT nPercent, L_VOID L_FAR *pUserData); L_BOOL CALLBACK ProgressDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); L_VOID ProgressBar(HWND hWnd, HWND hwndCtl); /************************************/ /* Global Variables */ /************************************/ pUSERSTRUCT pData; //BITMAPHANDLE TmpBitmap1,TmpBitmap2 ; BITMAPHANDLE gBitmap; HPALETTE ghPalette; L_UINT32 uProcess; L_INT nCurZoom; /*====(WinMain)============================================================ Description: Main windows function required for all windows applications. Syntax : int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iComShow) Prototype : windows.h Parameters : hInstance Handle to current instance of application. hPrevInstance Handle to previous instance of application. szCmdLine Pointer to the Command Line. iCmdShow Integer used in ShowWindow. Return Value: The return value the user specify in wParam when send WM_QUIT message, or the paramter in PostQuitMessage. ==========================================================================*/ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Simplified Image Processing Demo") ; UNLOCKSUPPORT(); //L_UseBitmapClass(); HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (hInstance,MAKEINTRESOURCE (IDI_MAIN) ) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) CreateSolidBrush(RGB(128,128,128)) ; wndclass.lpszMenuName = szAppName ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("RegisterClass failed!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, TEXT ("Simplified Image Processing Demo"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; L_DlgInit(DLG_INIT_COLOR); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } L_DlgFree(); return msg.wParam ; } /*====(WndProc)=================================================== Description: Handles all messages dispatched to the window. Syntax : LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) Parameters : hWnd Handle to a window. message Windows message structure. wParam Windows word parameter. lParam Windows long parameter. Return Value: This is specific for each message. See Windows Programmer's Reference Volume 3. ==========================================================================*/ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { HANDLE_MSG (hWnd, WM_CREATE, LEADTOOLS_OnCreateDemo); HANDLE_MSG (hWnd, WM_PAINT, LEADTOOLS_OnPaint); HANDLE_MSG (hWnd, WM_VSCROLL, LEADTOOLS_OnVScroll); HANDLE_MSG (hWnd, WM_HSCROLL, LEADTOOLS_OnHScroll); HANDLE_MSG (hWnd, WM_DESTROY, LEADTOOLS_OnDestroy); HANDLE_MSG (hWnd, WM_COMMAND, LEADTOOLS_OnCommand); HANDLE_MSG (hWnd, WM_SIZE, LEADTOOLS_OnSize); HANDLE_MSG (hWnd, WM_ACTIVATE, LEADTOOLS_OnActivate); HANDLE_MSG (hWnd, WM_ERASEBKGND,LEADTOOLS_OnEraseBkgnd); HANDLE_MSG (hWnd, WM_PALETTECHANGED, LEADTOOLS_OnPaletteChanged); HANDLE_MSG (hWnd, WM_QUERYNEWPALETTE, LEADTOOLS_OnQueryNewPalette); HANDLE_MSG (hWnd, WM_PALETTEISCHANGING, LEADTOOLS_OnPaletteChanging); HANDLE_MSG (hWnd, WM_SYSCOLORCHANGE, LEADTOOLS_SysColorChange); } return DefWindowProc (hWnd, message, wParam, lParam) ; } 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); } if(pFOParam->pFileData[i].pThumbnail != NULL) { L_FreeBitmap(pFOParam->pFileData[i].pThumbnail); GlobalFreePtr(pFOParam->pFileData[i].pThumbnail); } if(pFOParam->pFileData[i].pFileInfo != NULL) { GlobalFreePtr(pFOParam->pFileData[i].pFileInfo); } } GlobalFreePtr(pFOParam->pFileData); pFOParam->pFileData =NULL; pFOParam->nNumOfFiles = 0; } } /*====(OpenTheFile)======================================================== Description: Loads the image from file Syntax : L_BOOL OpenTheFile( HWND hWnd, pBITMAPHANDLE pBitmap1) Parameters : hWnd Handle to a window. pBitmap1 Handle to bitmap. Return Value: TRUE if SUCCESS or FALSE if there is an error. ==========================================================================*/ L_BOOL OpenTheFile( HWND hWnd, pBITMAPHANDLE pBitmap1) { L_INT nRet; OPENFILENAME ofn1; OPENDLGPARAMS foParm1; if(pData->bFileChanged) { nRet = MessageBox(pData->hWndParent,TEXT("Do you want to save changes ?"), TEXT("Save Changes"), MB_YESNO); if (nRet== IDYES) { nRet = SaveBitmapFile (pData->hWndParent,pBitmap1); if (nRet != IDOK) return FALSE; } pData->bFileChanged=FALSE; } memset(&ofn1, 0, sizeof(OPENFILENAME)); memset(&foParm1, 0, sizeof(OPENDLGPARAMS)); foParm1.uStructSize = sizeof(OPENDLGPARAMS); foParm1.uDlgFlags = DLG_OPEN_SHOW_PROGRESSIVE | DLG_OPEN_SHOW_MULTIPAGE | DLG_OPEN_SHOW_LOADROTATED | DLG_OPEN_SHOW_LOADCOMPRESSED | DLG_OPEN_SHOW_FILEINFO | DLG_OPEN_SHOW_PREVIEW | DLG_OPEN_LOADBITMAP; ofn1.lStructSize = sizeof(ofn1); ofn1.hwndOwner = hWnd; ofn1.lpstrTitle = TEXT("Select File"); if(!pData->bShowPreview) foParm1.uDlgFlags &= ~(DLG_OPEN_SHOW_PREVIEW); nRet = L_DlgOpen(hWnd,&ofn1,&foParm1); if(nRet < 0 ) { MessageBox (NULL, TEXT ("Opening Error !!"), TEXT("Simplified Demo"), MB_ICONERROR) ; return 0; } if(nRet == SUCCESS_DLG_OK ) { if(foParm1.pFileData[0].pBitmap!=NULL) { L_CopyBitmap(pBitmap1, foParm1.pFileData[0].pBitmap,sizeof(BITMAPHANDLE)); nCurZoom = 100; LEADTOOLS_EnabledMenu(); pData->MainWidth=pBitmap1->Width; pData->MainHight=pBitmap1->Height; LEADTOOLS_OnQueryNewPalette (hWnd); } CleanOpenDlgParam(&foParm1); } return(nRet); } /*====(ViewImage)========================================================== Description: Paint image at any possition into DC , with selected view. Syntax : void ViewImage(HDC hdc, HWND hWnd, BITMAPHANDLE pasedBitmap, L_INT Xloc, L_INT Yloc) Parameters : hdc Device context for the current window hWnd Handle to the current window. pasedBitmap the bitmap X X possition for the source into ditination bitmap Y Y possition for the source into ditination bitmap ==========================================================================*/ void ViewImage(HDC hdc,HWND hWnd,BITMAPHANDLE pasedBitmap,L_INT Xloc,L_INT Yloc) { RECT rLeadDest; /* Destination rectangle for painting */ HPALETTE hSavedPalette = NULL; /* Temporary copy of the current system palette */ /* Get the device context */ if(!pasedBitmap.Flags.Allocated) return ; /* Set the destination rectangle to be the same as the bitmap. Other painting rectangles can take defaults. */ SetRect(&rLeadDest, pData->Xloc, pData->Yloc, (L_INT)(BITMAPWIDTH(&pasedBitmap)*pData->WFactor+pData->Xloc), (L_INT)(BITMAPHEIGHT(&pasedBitmap)*pData->HFactor)+pData->Yloc); /* Create the palette that we will use to paint */ if(ghPalette) { /* Select our palette and save the old one */ hSavedPalette = SelectPalette (hdc, ghPalette, TRUE); RealizePalette (hdc); } /* Realize our palette */ L_PaintDC ( hdc, /* Device context */ &pasedBitmap,/* Bitmap handle */ NULL, /* Default source rectangle */ NULL, /* Default source clip area */ &rLeadDest, /* Destination rectangle */ NULL, /* Default destination clipping rectangle */ SRCCOPY); /* ROP3 code for a Normal Paint */ if(ghPalette) { /* Restore the old palette */ SelectPalette (hdc, hSavedPalette, TRUE); } return; } /*----(LEADTOOLS_OnPaletteChanged)-------------------------------------------- Syntax: VOID LEADTOOLS_OnPaletteChanged( HWND hWnd, HWND hWndPaletteChange ) Parameters: hwnd Handle to a window. hWndPaletteChange Handle to a window that has the palette realized. Prototype: Loadsave.h Notes: This procedure is responsible for handling WM_PALETTECHANGED. --------------------------------------------------------------------------*/ VOID LEADTOOLS_OnPaletteChanged (HWND hWnd, HWND hWndPaletteChange) { HDC hDC; HPALETTE hPalette; /* If this window initiated the palette change, do nothing. */ if (hWnd == hWndPaletteChange) return; /* Delete the previous palette, if there is one. */ if (ghPalette) { DeleteObject (ghPalette); ghPalette = NULL; } /* Does this window have a bitmap and a palette? */ if (gBitmap.Flags.Allocated) { hDC = GetDC (hWnd); /* Generate a new logical palette (if needed) for painting. */ ghPalette = L_CreatePaintPalette (hDC, &gBitmap); /* Select and Realize the palette. */ hPalette = SelectPalette (hDC, ghPalette, TRUE); RealizePalette (hDC); /* Return the old palette. */ SelectPalette (hDC, hPalette, TRUE); ReleaseDC (hWnd, hDC); /* Force a repaint. */ InvalidateRect (hWnd, NULL, FALSE); } return; } /*====(LEADTOOLS_OnPaletteChanging)========================================== Description: Enumerates all child windows and asks them to realize their logical palettes beside the physical palette. Syntax : VOID LEADTOOLS_OnPaletteChanging(HWND hwnd, HWND hWndPaletteChange) Parameters : hwnd Handle to a window. hWndPaletteChange Handle to a window that has the palette realized. Return Value: None. ==========================================================================*/ VOID LEADTOOLS_OnPaletteChanging(HWND hWnd, HWND hWndPaletteChange) { LEADTOOLS_OnPaletteChanged (hWnd, hWndPaletteChange); } /*====(LEADTOOLS_SysColorChange)========================================== Syntax: VOID LEADTOOLS_SysColorChange( HWND hWnd ) Parameters: hWnd Handle to a window. Prototype: Loadsave.h Notes: This procedure is responsible for handling WM_SYSCOLORCHANGE. --------------------------------------------------------------------------*/ VOID LEADTOOLS_SysColorChange(HWND hwnd) { LEADTOOLS_OnQueryNewPalette (hwnd); } /*----(LEADTOOLS_OnQueryNewPalette)-------------------------------------------- Syntax: BOOL LEADTOOLS_OnQueryNewPalette( HWND hWnd ) Parameters: hWnd Handle to a window. Prototype: Loadsave.h Notes: This procedure is responsible for handling WM_QUERYNEWPALETTE. --------------------------------------------------------------------------*/ BOOL LEADTOOLS_OnQueryNewPalette (HWND hWnd) { HDC hDC; HPALETTE hPalette; L_INT nNoColors = 0; /* Delete the previous palette, if there is one. */ if (ghPalette) { DeleteObject (ghPalette); ghPalette = NULL; } if (gBitmap.Flags.Allocated) { hDC = GetDC (hWnd); /* Generate a new logical palette (if needed) for painting. */ ghPalette = L_CreatePaintPalette (hDC, &gBitmap); if (ghPalette) /* Is a palette needed? */ { hPalette = SelectPalette (hDC, ghPalette, FALSE); nNoColors = RealizePalette (hDC); InvalidateRect (hWnd, NULL, FALSE); /* Restore the old palette. */ SelectPalette (hDC, hPalette, TRUE); } ReleaseDC (hWnd, hDC); } return (nNoColors); } /*====(SaveBitmapFile)====================================================== Description: Saving the bitmap file. Syntax : L_INT SaveBitmapFile (HWND hWnd, pBITMAPHANDLE pBitmapHandle) Parameters : hWnd Handle to the window. pBitmapHandle the bitmap Return Value: SUCCESS or error code. ==========================================================================*/ L_INT SaveBitmapFile (HWND hWnd, pBITMAPHANDLE pBitmapHandle) { OPENFILENAME SaveFileName; SAVEDLGPARAMS FSParm; SAVEFILEOPTION SaveFileOption; L_UINT uFlags=0; L_TCHAR buf[80]; HCURSOR hCursor; L_INT nRet; FILESAVEFORMAT Formats[3]; _fmemset(&SaveFileName, 0, sizeof(OPENFILENAME)); _fmemset(&FSParm, 0, sizeof(SAVEDLGPARAMS)); FSParm.uStructSize = sizeof(SAVEDLGPARAMS); FSParm.uDlgFlags = DLG_SAVE_SHOW_FILEOPTIONS_MULTIPAGE | DLG_SAVE_SHOW_FILEOPTIONS_PROGRESSIVE | DLG_SAVE_SHOW_FILEOPTIONS_QFACTOR, FSParm.nQFactor = 2; SaveFileName.lStructSize = sizeof(OPENFILENAME); SaveFileName.lpstrInitialDir = NULL; SaveFileName.lpstrTitle = TEXT("Save As"); /* add some formats */ FILESAVEFORMATBPP CmpSub[1] = {sizeof(CmpSub),24,DLG_FF_SAVE_SUB_CMP_NONPROGRESSIVE|DLG_FF_SAVE_SUB_CMP_PROGRESSIVE}; Formats[0].nFormat = DLG_FF_SAVE_LEAD; Formats[0].nBppCount = 1; Formats[0].pFileSaveFormatBpp = CmpSub; FILESAVEFORMATBPP tifSub[1] = {sizeof(CmpSub),8, DLG_FF_SAVE_SUB_GIF_INTERLACED89A}; Formats[1].nFormat = DLG_FF_SAVE_TIFF; Formats[1].nBppCount = 1; Formats[1].pFileSaveFormatBpp = tifSub; FILESAVEFORMATBPP GifSub[1] = {sizeof(GifSub),8, DLG_FF_SAVE_SUB_GIF_NONINTERLACED89A}; Formats[2].nFormat = DLG_FF_SAVE_GIF; Formats[2].nBppCount = 1; Formats[2].pFileSaveFormatBpp = GifSub; FSParm.pFileFormats = Formats; FSParm.uFileFormatsCount = 3; nRet = L_DlgSave( hWnd,&SaveFileName,&FSParm); if(nRet == SUCCESS_DLG_OK) { L_GetDefaultSaveFileOption(&SaveFileOption, sizeof(SAVEFILEOPTION)); SaveFileOption.Flags &= ~(ESO_REPLACEPAGE|ESO_INSERTPAGE); switch(FSParm.uSaveMulti) { case MULTIPAGE_OPERATION_OVERWRITE: SaveFileOption.PageNumber = 1; break; case MULTIPAGE_OPERATION_APPEND: SaveFileOption.PageNumber = 2; break; case MULTIPAGE_OPERATION_REPLACE: SaveFileOption.PageNumber = FSParm.nPageNumber; SaveFileOption.Flags |= ESO_REPLACEPAGE; break; case MULTIPAGE_OPERATION_INSERT: SaveFileOption.PageNumber = FSParm.nPageNumber; SaveFileOption.Flags |= ESO_INSERTPAGE; break; } hCursor = SetCursor (LoadCursor (NULL, IDC_WAIT)); if (FSParm.nBitsPerPixel <= 4 && pBitmapHandle->BitsPerPixel != FSParm.nBitsPerPixel) uFlags = SAVEFILE_FIXEDPALETTE; else uFlags = SAVEFILE_OPTIMIZEDPALETTE; nRet = L_SaveFile( FSParm.szFileName, pBitmapHandle, FSParm.nFormat, FSParm.nBitsPerPixel, FSParm.nQFactor, uFlags, NULL, NULL, &SaveFileOption ); SetCursor (hCursor); if (nRet != SUCCESS) { wsprintf (buf, TEXT("ERROR %d saving the file %s."), nRet, (LPTSTR) FSParm.szFileName); MessageBox (hWnd, buf, TEXT("ERROR"), MB_OK); } else { pData->bFileChanged=FALSE; return (TRUE); } } return (2); } /*====(AboutDlgProc)=================================================== Description: Handles all messages dispatched to the About Dailog Box. Syntax : L_VOID CALLBACK AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Parameters : hWnd Handle to a Dlgbox. message Windows message structure. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE if handle the message , and FALSE if the message not handled . ==========================================================================*/ L_BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg,0); return TRUE; } } return FALSE; } /*====(LEADTOOLS_OnCreate)======================================================== Description: Creates a client window in response to WM_CREATE from the frame window. Syntax : BOOL LEADTOOLS_OnCreate(HWND hWnd, CREATESTRUCT 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. ==========================================================================*/ BOOL LEADTOOLS_OnCreateDemo (HWND hWnd, CREATESTRUCT FAR * lpCreateStruct) { UNREFERENCED_PARAMETER(lpCreateStruct); pData=new tagUSERSTRUCTA(); pData->WFactor=1; pData->angle=FALSE; pData->bShowPreview=TRUE; pData->bUseProgress=FALSE; pData->bFileChanged=FALSE; pData->bUseProgressUpdate=FALSE; pData->HFactor=1; pData->ProgressValue=0; pData->Xloc=1; pData->Yloc=1; pData->NormalSize=TRUE; pData->Zoom=FALSE; pData->VPageLong=0; pData->HPageLong=0; L_FreeBitmap(&gBitmap); pData->WFactor=1; pData->HFactor=1; pData->Xloc=1; pData->Yloc=1; pData->hIns=lpCreateStruct->hInstance; pData->hMenu= LoadMenu(pData->hIns,MAKEINTRESOURCE(ID_MENU)) ; pData->lpfnStatusCB = MakeProcInstance (StatusCallBack, pData->hIns); L_SetStatusCallBack (pData->lpfnStatusCB, NULL,NULL,NULL); SetMenu(hWnd, pData->hMenu) ; ghPalette =NULL; return TRUE; } /*====(LEADTOOLS_OnDestroy)================================================= Description: Performs cleanup for the program, and posts WM_QUIT to terminate the application. Syntax : VOID LEADTOOLS_OnDestroy(HWND hWnd) Parameters : hWnd Handle to a window. Return Value: None. ==========================================================================*/ VOID LEADTOOLS_OnDestroy (HWND hWnd) { UNREFERENCED_PARAMETER(hWnd); PostQuitMessage (0); return; } /*====(LEADTOOLS_OnPaint)====================================================== Description: Paints on the window. Syntax : VOID Child_OnPaint(HWND hWnd) Parameters : hWnd Handle of the window. Return Value: None. ==========================================================================*/ static VOID LEADTOOLS_OnPaint (HWND hWnd) { UNREFERENCED_PARAMETER(hWnd); PAINTSTRUCT ps; HDC hDc; hDc = BeginPaint (hWnd, &ps); ViewImage(hDc,hWnd,gBitmap,1,1); EndPaint (hWnd, &ps); } /*====(LEADTOOLS_OnCommand )======================================================== Description: Loads the image from file Syntax : static VOID LEADTOOLS_OnCommand (HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) Parameters : hWnd Handle to a window. id LOWORD(wParam) "Menu item id" hwndCtl (HWND) lParam. Return Value: None. ==========================================================================*/ static VOID LEADTOOLS_OnCommand (HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) { L_BOOL bChecked; pData->hWndParent=hWnd; pData->hwndCtl=hwndCtl; switch (id) { case IDM_OPENIMAGE: { RECT rc; GetClientRect(hWnd,&rc); OpenTheFile(hWnd, &gBitmap); pData->WFactor=1; pData->HFactor=1; CHECKMENUITEM(pData->hMenu, IDM_FITTOWINDOW, FALSE); CHECKMENUITEM(pData->hMenu, IDM_ZOOM, FALSE); CHECKMENUITEM(pData->hMenu, IDM_NORMAL, TRUE); pData->Xloc=1; pData->Yloc=1; GetClientRect(hWnd,&rc); pData->VMaxPos=((BITMAPHEIGHT(&gBitmap))-rc.bottom); pData->HMaxPos=((BITMAPWIDTH(&gBitmap))-rc.right); pData->VStep=pData->VMaxPos/10; pData->HStep=pData->HMaxPos / 10 ; pData->HPageLong=pData->HStep*2; pData->VPageLong=pData->VStep*2; pData->VScrollPos=0; pData->HScrollPos=0; SetScrollRange(hWnd,SB_VERT,0,pData->VMaxPos,FALSE); SetScrollRange(hWnd,SB_HORZ,0,pData->HMaxPos,FALSE); SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); SetScrollPos(hWnd,SB_HORZ,pData->HScrollPos,TRUE); InvalidateRect(hWnd,&rc,TRUE); } break ; case IDM_EXITPROG: PostQuitMessage(0) ; break ; case IDM_SAVEIMAGE: SaveBitmapFile (hWnd,&gBitmap); break ; case IDM_NORMAL: SetNormalView(hWnd); break; case IDM_FITTOWINDOW: SetFitWindowView(hWnd); break ; case IDM_ABOUT: ShowAboutDlg(hWnd,hwndCtl); break; case IDM_INVERT: InvertImage(hWnd); break; case IDM_BRIGHTNESS: Brightness(hWnd); break; case IDM_CONTRAST: ContrastImage(hWnd); break; case IDM_RESOLUTION: ResolutionColor(hWnd); break; case IDM_FLIP: FlipImage(hWnd); break; case IDM_FASTFLIP: FastFlipImage(hWnd); break; case IDM_REVERSE: ReverseImage(hWnd); break; case IDM_FASTREVERSE: FastReverseImage(hWnd); break; case IDM_SHEAR: pData->Recalc=TRUE; ShearImage(hWnd); SetNormalView(hWnd); break; case IDM_DESKEW: pData->Recalc=TRUE; DeskewImage(hWnd); SetNormalView(hWnd); break; case IDM_AUOTTRIM: pData->Recalc=TRUE; AutoTrimImage(hWnd,hwndCtl); SetNormalView(hWnd); break; case IDM_RESIZE: pData->Recalc=TRUE; ResizeImage(hWnd,IDM_RESIZE); SetNormalView(hWnd); break; /* case IDM_RESAMPLE: pData->Recalc=TRUE; ResizeImage(hWnd,IDM_RESAMPLE); SetNormalView(hWnd); break; case IDM_BICUBICRESIZE: pData->Recalc=TRUE; ResizeImage(hWnd,IDM_BICUBICRESIZE); SetNormalView(hWnd); break; */ case IDM_FASTROTATE90: pData->Recalc=TRUE; FastRotateImage(hWnd,IDM_FASTROTATE90); SetNormalView(hWnd); break; case IDM_FASTROTATE180: pData->Recalc=TRUE; FastRotateImage(hWnd,IDM_FASTROTATE180); SetNormalView(hWnd); break; case IDM_FASTROTATE270: pData->Recalc=TRUE; FastRotateImage(hWnd,IDM_FASTROTATE270); SetNormalView(hWnd); break; case IDM_ROTATE90: pData->Recalc=TRUE; RotateImage(hWnd,IDM_ROTATE90); SetNormalView(hWnd); break; case IDM_ROTATE180: pData->Recalc=TRUE; RotateImage(hWnd,IDM_ROTATE180); SetNormalView(hWnd); break; case IDM_ROTATE270: pData->Recalc=TRUE; RotateImage(hWnd,IDM_ROTATE270); SetNormalView(hWnd); break; case IDM_ROTATEANYANGLE: pData->Recalc=TRUE; RotateAngle(hWnd,IDM_ROTATEANYANGLE); SetNormalView(hWnd); break; case IDM_ROTATEINTER: pData->Recalc=TRUE; RotateAngle(hWnd,IDM_ROTATEINTER); SetNormalView(hWnd); break; case IDM_ROTATEANYBICUBIC: pData->Recalc=TRUE; RotateAngle(hWnd,IDM_ROTATEANYBICUBIC); SetNormalView(hWnd); break; case IDM_POSTERIZE: PosterizeImage(hWnd); break; case IDM_MOSAIC: MosaicImage(hWnd); break; case IDM_UNDERLAY: UnderLayImage(hWnd); break; case IDM_AVERAGE: AverageImage(hWnd); break; case IDM_MEDIAN: MedianImage(hWnd); break; case IDM_SHARPEN: SharpenImage(hWnd); break; case IDM_DESPECKLE: pData->Recalc=TRUE; DespeckleImage(hWnd); SetNormalView(hWnd); break; case IDM_ADDNOISE: AddNoiseImage(hWnd); break; case IDM_EMBOSS: EmbossImage(hWnd); break; case IDM_EDGEENHANCE: EdgeEnhanceImage(hWnd); break; case IDM_OILIFY: OilifyImage(hWnd,hwndCtl); break; case IDM_GRADIENT: GradientFilter(hWnd); break; case IDM_LAPLACIAN: LaplacianFilter(hWnd); break; case IDM_SOBEL: SobelFilter(hWnd); break; case IDM_PREWITT: PrewittFilter(hWnd); break; case IDM_SHIFTANDDIFFERENCE: ShiftanddifferenceFilter(hWnd); break; case IDM_LINESEGMENT: LinesegmentFilter(hWnd); break; case IDM_EROSION: ErosionFilter(hWnd); break; case IDM_DILATION: DilationFilter(hWnd); break; case IDM_MAX: MaxFilter(hWnd); break; case IDM_MIN: MinFilter(hWnd); break; case IDM_ZOOM: ZoomImage(hWnd,hwndCtl); break; case IDM_SHOWPREVIEW: bChecked=(GetMenuState(GetMenu(hWnd),id,MF_BYCOMMAND)&MF_CHECKED)!=0; CheckMenuItem(GetMenu(hWnd),id,MF_BYCOMMAND|((bChecked)? MF_UNCHECKED:MF_CHECKED)); pData->bShowPreview = !pData->bShowPreview; break; case IDM_PROGRESSBAR: bChecked=(GetMenuState(GetMenu(hWnd),id,MF_BYCOMMAND)&MF_CHECKED)!=0; CheckMenuItem(GetMenu(hWnd),id,MF_BYCOMMAND|((bChecked)? MF_UNCHECKED:MF_CHECKED)); pData->bUseProgress=!pData->bUseProgress; if(pData->bUseProgressUpdate) { bChecked=(GetMenuState(GetMenu(hWnd),IDM_PROGRESSBARUPDATE,MF_BYCOMMAND)&MF_CHECKED)!=0; CheckMenuItem(GetMenu(hWnd),IDM_PROGRESSBARUPDATE,MF_BYCOMMAND|((bChecked)? MF_UNCHECKED:MF_CHECKED)); pData->bUseProgressUpdate=!pData->bUseProgressUpdate; } break; case IDM_PROGRESSBARUPDATE: bChecked=(GetMenuState(GetMenu(hWnd),IDM_PROGRESSBARUPDATE,MF_BYCOMMAND)&MF_CHECKED)!=0; CheckMenuItem(GetMenu(hWnd),IDM_PROGRESSBARUPDATE,MF_BYCOMMAND|((bChecked)? MF_UNCHECKED:MF_CHECKED)); pData->bUseProgressUpdate=!pData->bUseProgressUpdate; if(pData->bUseProgress) { bChecked=(GetMenuState(GetMenu(hWnd),IDM_PROGRESSBAR,MF_BYCOMMAND)&MF_CHECKED)!=0; CheckMenuItem(GetMenu(hWnd),IDM_PROGRESSBAR,MF_BYCOMMAND|((bChecked)? MF_UNCHECKED:MF_CHECKED)); pData->bUseProgress=!pData->bUseProgress; } break; } InvalidateRect(hWnd,NULL,TRUE); LEADTOOLS_OnQueryNewPalette (hWnd); } /*====(LEADTOOLS_OnSize )======================================================== Description: resizing the window in the normal case and fitwindow case. Syntax : static VOID LEADTOOLS_OnSize (HWND hWnd, UINT nState, int nCx, int nCy) Parameters : hWnd Handle to a window. nCx Not used. nCy Not used nState Not used. Return Value: None. ==========================================================================*/ static VOID LEADTOOLS_OnSize (HWND hWnd, UINT nState, int nCx, int nCy) { RECT rc; L_INT cyStatus; GetClientRect(hWnd,&rc); cyStatus = RECTHEIGHT(&rc); static BOOL Flag=TRUE; if (pData->NormalSize||pData->Zoom) { GetClientRect(hWnd,&rc); if ((pData->Yloc<1)) if((nCy-BITMAPHEIGHT(&gBitmap)*pData->HFactor)<1) { if((nCy-(BITMAPHEIGHT(&gBitmap)*pData->HFactor+pData->Yloc))>0) pData->Yloc+=nCy-((L_INT)(BITMAPHEIGHT(&gBitmap)*pData->HFactor)+pData->Yloc); } else { pData->Yloc=1; pData->VScrollPos=0; } if ((pData->Xloc<1)) if((nCx-BITMAPWIDTH(&gBitmap)*pData->WFactor)<1) { if((nCx-(BITMAPWIDTH(&gBitmap)*pData->WFactor+pData->Xloc))>0) pData->Xloc+=nCx-((L_INT)(BITMAPWIDTH(&gBitmap)*pData->WFactor)+pData->Xloc); } else { pData->Xloc=1; pData->HScrollPos=0; } pData->VMaxPos= (L_INT)((((gBitmap.Height * pData->WFactor) - rc.bottom)>=0)? (gBitmap.Height *pData->WFactor - rc.bottom): 0); pData->HMaxPos= (L_INT)((((gBitmap.Width * pData->HFactor) - rc.right )>=0)? (gBitmap.Width * pData->HFactor - rc.right ): 0); pData->VStep=(L_INT)(pData->VMaxPos/10); pData->HStep=(L_INT)(pData->HMaxPos / 10 ); pData->HPageLong=pData->HStep*2; pData->VPageLong=pData->VStep*2; SetScrollRange(hWnd,SB_VERT,0,pData->VMaxPos,FALSE); SetScrollRange(hWnd,SB_HORZ,0,pData->HMaxPos,FALSE); SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); SetScrollPos(hWnd,SB_HORZ,pData->HScrollPos,TRUE); InvalidateRect(hWnd,&rc,TRUE); } else { RECT rcDist; GetClientRect(hWnd,&rcDist); L_DOUBLE TmpV1; BITMAPWIDTH(&gBitmap)=BITMAPWIDTH(&gBitmap); BITMAPHEIGHT(&gBitmap)=BITMAPHEIGHT(&gBitmap); if(((double)rcDist.bottom/(double)BITMAPHEIGHT(&gBitmap))<((double)rcDist.right/(double)BITMAPWIDTH(&gBitmap))) TmpV1= (double)rcDist.bottom/(double)BITMAPHEIGHT(&gBitmap); else TmpV1= (double)rcDist.right/(double)BITMAPWIDTH(&gBitmap); pData->WFactor=TmpV1; pData->HFactor=TmpV1; pData->Xloc=1; pData->Yloc=1; RECT rc; GetClientRect(hWnd,&rc); pData->VMaxPos=0; pData->HMaxPos=0; pData->VStep=rc.bottom /10; pData->HStep=rc.right / 10 ; pData->HPageLong=pData->HStep*2; pData->VPageLong=pData->VStep*2; pData->VScrollPos=0; pData->HScrollPos=0; InvalidateRect(hWnd,&rc,TRUE); } } /*====(LEADTOOLS_OnVScroll)============================================== Description: Scrolling window up and down Syntax : static VOID LEADTOOLS_OnVScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int npos) Parameters : hWnd Handle to a window. hWndCtl Not used. nCode Amount/Direction to be scrolled. npos The new position of the thumb. Return Value: None. ==========================================================================*/ static VOID LEADTOOLS_OnVScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int npos) { RECT rect; L_INT VOldPos=pData->VScrollPos; switch(nCode) { case SB_THUMBTRACK: { L_INT TmpValue=npos; pData->Yloc-=(TmpValue - pData->VScrollPos); pData->VScrollPos=TmpValue; } break; case SB_LINEUP: if(pData->VScrollPos>pData->VStep) { pData->VScrollPos-=pData->VStep; pData->Yloc+=pData->VStep; } else { pData->Yloc+=pData->VScrollPos; pData->VScrollPos=0; } break; case SB_LINEDOWN: if(pData->VScrollPos<(pData->VMaxPos-pData->VStep)) { pData->VScrollPos+=pData->VStep; pData->Yloc-=pData->VStep; } else { pData->Yloc-=(pData->VMaxPos-pData->VScrollPos); pData->VScrollPos=pData->VMaxPos; } break; case SB_PAGEUP: if(pData->VScrollPos>pData->VPageLong) { pData->VScrollPos-=pData->VPageLong; pData->Yloc+=pData->VPageLong; } else { pData->Yloc+=pData->VScrollPos; pData->VScrollPos=0; } break; case SB_PAGEDOWN: if(pData->VScrollPos<(pData->VMaxPos-pData->VPageLong)) { pData->VScrollPos+=pData->VPageLong; pData->Yloc-=pData->VPageLong; } else { pData->Yloc-=pData->VMaxPos-pData->VScrollPos; pData->VScrollPos=pData->VMaxPos; } break; } if(pData->Yloc>1) { pData->Yloc=1; pData->VScrollPos=0; } RECT rcInvalid; SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); ScrollWindowEx(hWnd,(VOldPos - pData->VScrollPos),0,&rect,NULL,NULL,&rcInvalid,SW_INVALIDATE); GetClientRect(hWnd,&rect); InvalidateRect(hWnd,&rect,FALSE); } /*====(LEADTOOLS_OnHScroll)============================================== Description: Scrolling window right and left Syntax : static VOID LEADTOOLS_OnHScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int npos) Parameters : hWnd Handle to a window. hWndCtl Not used. nCode Amount/Direction to be scrolled. npos The new position of the thumb. Return Value: None. ==========================================================================*/ static VOID LEADTOOLS_OnHScroll (HWND hWnd, HWND hWndCtl, UINT nCode, int npos) { RECT rect; L_INT HOldPos=pData->HScrollPos; switch(nCode) { case SB_THUMBTRACK: { L_INT TmpValue=npos; pData->Xloc-=(TmpValue - pData->HScrollPos); pData->HScrollPos= TmpValue; } break; case SB_LINEUP: if(pData->HScrollPos>pData->HStep) { pData->HScrollPos-=pData->HStep; pData->Xloc+=pData->HStep; } else { pData->Xloc+=pData->HScrollPos; pData->HScrollPos=0; } break; case SB_LINEDOWN: if((pData->HScrollPos+pData->HStep)HMaxPos) { pData->HScrollPos+=pData->HStep; pData->Xloc-=pData->HStep; } else { pData->Xloc-=(pData->HMaxPos-pData->HScrollPos); pData->HScrollPos=pData->HMaxPos; } break; case SB_PAGEUP: if(pData->HScrollPos>pData->HPageLong) { pData->HScrollPos-=pData->HPageLong; pData->Xloc+=pData->HPageLong; } else { pData->Xloc+=pData->HScrollPos; pData->HScrollPos=0; } break; case SB_PAGEDOWN: if(pData->HScrollPos<(pData->HMaxPos-pData->HPageLong)) { pData->HScrollPos+=pData->HPageLong; pData->Xloc-=pData->HPageLong; } else { pData->Xloc-=(pData->HMaxPos-pData->HScrollPos); pData->HScrollPos=pData->HMaxPos; } break; } if(pData->Xloc>1) { pData->Xloc=1; pData->HScrollPos=0; } GetClientRect(hWnd,&rect); RECT rcInvalid; SetScrollPos(hWnd,SB_HORZ,pData->HScrollPos,TRUE); ScrollWindowEx(hWnd,(HOldPos - pData->HScrollPos),0,&rect,NULL,NULL,&rcInvalid,SW_INVALIDATE); InvalidateRect(hWnd,&rect,FALSE); } /*====(SetNormalView)============================================== Description: Change the window view form fitwindow to normal view Syntax : L_VOID SetNormalView(HWND hWnd) Parameters : hWnd Handle to a window. Return Value: None. ==========================================================================*/ L_VOID SetNormalView(HWND hWnd) { if(!pData->NormalSize||pData->Recalc) { if (!pData->Recalc) { pData->Zoom=FALSE; pData->NormalSize=TRUE; pData->HFactor = 1; pData->WFactor = 1; pData->Xloc = 1; pData->Yloc = 1; pData->VScrollPos = 0; pData->HScrollPos = 0; CHECKMENUITEM(pData->hMenu, IDM_FITTOWINDOW, FALSE); CHECKMENUITEM(pData->hMenu, IDM_ZOOM, FALSE); CHECKMENUITEM(pData->hMenu, IDM_NORMAL, TRUE); } RECT rc; GetClientRect(hWnd,&rc); pData->VMaxPos=((L_INT)((BITMAPHEIGHT(&gBitmap)+pData->Yloc)*pData->HFactor)-rc.bottom); pData->HMaxPos=((L_INT)((BITMAPWIDTH(&gBitmap)+pData->Xloc)*pData->HFactor)-rc.right); pData->VStep = rc.bottom / 10; pData->HStep = rc.right / 10 ; pData->HPageLong = pData->HStep * 2; pData->VPageLong = pData->VStep * 2; SetScrollRange(hWnd,SB_VERT,0,pData->VMaxPos,TRUE); SetScrollRange(hWnd,SB_HORZ,0,pData->HMaxPos,TRUE); SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); SetScrollPos(hWnd,SB_HORZ,pData->HScrollPos,TRUE); pData->Recalc=FALSE; InvalidateRect(hWnd,&rc,TRUE); nCurZoom = 100; } } /*====(SetFitWindowView)============================================== Description: Change the window view form normal to fitwindowview Syntax : L_VOID SetFitWindowView(HWND hWnd) Parameters : hWnd Handle to a window. Return Value: None. ==========================================================================*/ L_VOID SetFitWindowView(HWND hWnd) { if(pData->NormalSize||pData->Zoom) { RECT rcDist; GetClientRect(hWnd,&rcDist); L_DOUBLE TmpV1; if(((double)rcDist.bottom/(double)BITMAPHEIGHT(&gBitmap))<((double)rcDist.right/(double)BITMAPWIDTH(&gBitmap))) TmpV1= (double)rcDist.bottom/(double)BITMAPHEIGHT(&gBitmap); else TmpV1= (double)rcDist.right/(double)BITMAPWIDTH(&gBitmap); pData->WFactor=TmpV1; pData->HFactor=TmpV1; pData->NormalSize=FALSE; pData->Zoom=FALSE; pData->Xloc=1; pData->Yloc=1; RECT rc; GetClientRect(hWnd,&rc); pData->VMaxPos=0; pData->HMaxPos=0; pData->VStep=rc.bottom /10; pData->HStep=rc.right / 10 ; pData->HPageLong=pData->HStep*2; pData->VPageLong=pData->VStep*2; pData->VScrollPos=0; pData->HScrollPos=0; SetScrollRange(hWnd,SB_VERT,0,pData->VMaxPos,FALSE); SetScrollRange(hWnd,SB_HORZ,0,pData->HMaxPos,FALSE); SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); SetScrollPos(hWnd,SB_HORZ,pData->HScrollPos,TRUE); CHECKMENUITEM(pData->hMenu, IDM_FITTOWINDOW, TRUE); CHECKMENUITEM(pData->hMenu, IDM_NORMAL, FALSE); CHECKMENUITEM(pData->hMenu, IDM_ZOOM, FALSE); InvalidateRect(hWnd,&rcDist,FALSE); nCurZoom = 100; } } /*====(ShowAboutDlg)============================================== Description: Show about dailog box Syntax : L_VOID ShowAboutDlg(HWND hWnd, HWND hwndCtl) Parameters : hWnd Handle to window. hwndCtl Handle to dailog box Return Value: None. ==========================================================================*/ L_VOID ShowAboutDlg(HWND hWnd,HWND hwndCtl) { DLGPROC pfn; L_INT nRet; pfn = (DLGPROC) MakeProcInstance((FARPROC) AboutDlgProc, pData->hIns); nRet = DialogBoxParam (pData->hIns, MAKEINTRESOURCE (AboutDlg), hWnd, pfn,(LPARAM) hwndCtl); FreeProcInstance((FARPROC) pfn); } /*====(LEADTOOLS_OnActivate)============================================== Description: redraw the window when reactivate the window Syntax : static VOID LEADTOOLS_OnActivate(HWND hWnd, UINT uLWwParam, HWND hlParam, BOOL bLWwParam) Parameters : hWnd Handle to window. uLWwParam Not used. hlParam Not used. bLWwParam Not used. Return Value: None. ==========================================================================*/ static VOID LEADTOOLS_OnActivate(HWND hWnd, UINT uLWwParam, HWND hlParam, BOOL bLWwParam) { if(uLWwParam!=WA_INACTIVE) LEADTOOLS_OnQueryNewPalette (hWnd); } /*====(LEADTOOLS_OnEraseBkgnd )============================================== Description: redraw the image when background erased Syntax : static BOOL LEADTOOLS_OnEraseBkgnd (HWND hWnd, HDC hDC) Parameters : hWnd Handle to window. hDC Handle to the device context. Return Value: None. ==========================================================================*/ static BOOL LEADTOOLS_OnEraseBkgnd (HWND hWnd, HDC hDC) { HBRUSH hBrush; HRGN hClientRgn, hFillRgn; RECT rcView, rcClient,Tmprc; if(pData->EraseBK) { hBrush = GETHBRBACKGROUND (hWnd); GetClientRect (hWnd, &rcClient); FillRect (hDC,&rcClient , hBrush); pData->EraseBK=FALSE; } else { hBrush = GETHBRBACKGROUND (hWnd); GetClientRect (hWnd, &rcClient); GetUpdateRect(hWnd, &rcView,0); SetRect(&Tmprc,pData->Xloc,pData->Yloc, (L_INT)((BITMAPWIDTH(&gBitmap))*pData->WFactor)+pData->Xloc, (L_INT)((BITMAPHEIGHT(&gBitmap))*pData->HFactor)+pData->Yloc); IntersectRect (&rcView, &Tmprc, &rcClient); hClientRgn = CreateRectRgnIndirect (&rcClient); hFillRgn = CreateRectRgnIndirect (&rcView); CombineRgn (hFillRgn, hClientRgn, hFillRgn, RGN_DIFF); FillRgn (hDC, hFillRgn, hBrush); DeleteObject (hFillRgn); DeleteObject (hClientRgn); } return(TRUE); } /*====(LEADTOOLS_EnabledMenu)============================================== Description: Enabled all menu items Syntax : L_VOID LEADTOOLS_EnabledMenu() Parameters : None Return Value: None. ==========================================================================*/ L_VOID LEADTOOLS_EnabledMenu() { ENABLEMENUITEM(pData->hMenu,IDM_NORMAL,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_SAVEIMAGE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_FITTOWINDOW,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_MAX,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_MIN,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_DILATION,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_EROSION,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_LINESEGMENT,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_SHIFTANDDIFFERENCE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_PREWITT,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_SOBEL,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_LAPLACIAN,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_GRADIENT,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_OILIFY,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_EDGEENHANCE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_UNDERLAY,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_EMBOSS,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_ADDNOISE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_DESPECKLE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_SHARPEN,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_MEDIAN,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_AVERAGE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_MOSAIC,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_POSTERIZE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_BICUBICRESIZE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_RESAMPLE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_RESIZE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_AUOTTRIM,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_DESKEW,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_SHEAR,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_FASTREVERSE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_REVERSE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_FASTFLIP,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_FLIP,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_RESOLUTION,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_CONTRAST,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_BRIGHTNESS,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_INVERT,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_ZOOM,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_FASTROTATE90,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_FASTROTATE180,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_FASTROTATE270,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_ROTATE90,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_ROTATE180,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_ROTATE270,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_ROTATEANYANGLE,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_ROTATEINTER,TRUE); ENABLEMENUITEM(pData->hMenu,IDM_ROTATEANYBICUBIC,TRUE); } /*====(InvertImage)============================================== Description: Invert color of bitmap Syntax : L_VOID InvertImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID InvertImage(HWND hWnd) { RECT rc; GetClientRect(hWnd,&rc); L_InvertBitmap(&gBitmap); pData->bFileChanged=TRUE; InvalidateRect(hWnd,&rc,TRUE); } /*====(Brightness)============================================== Description: Brightness color of bitmap Syntax : L_VOID Brightness(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID Brightness(HWND hWnd) { BRIGHTNESSDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(BRIGHTNESSDLGPARAMS)); DlgParams.uStructSize = sizeof(BRIGHTNESSDLGPARAMS); DlgParams.pBitmap = &gBitmap; DlgParams.nChange = 0; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_BRIGHTNESS_SHOW_PREVIEW:0)| DLG_BRIGHTNESS_SHOW_TOOL_ZOOMLEVEL ; if ( L_DlgBrightness ( hWnd, &DlgParams ) == SUCCESS_DLG_OK ) { if(DlgParams.nChange) { L_INT nRet = L_ChangeBitmapIntensity (&gBitmap, DlgParams.nChange); pData->bFileChanged=TRUE; } } } /*====(ContrastImage)============================================== Description: Contrast color of bitmap Syntax : L_VOID ContrastImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID ContrastImage(HWND hWnd) { CONTRASTDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(CONTRASTDLGPARAMS)); DlgParams.uStructSize = sizeof(CONTRASTDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.nChange = 0; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_CONTRAST_SHOW_PREVIEW:0)| DLG_CONTRAST_SHOW_TOOL_ZOOMLEVEL ; if ( L_DlgContrast(hWnd, &DlgParams)== SUCCESS_DLG_OK ) { if(DlgParams.nChange) { L_INT nRet = L_ChangeBitmapContrast(&gBitmap, DlgParams.nChange); pData->bFileChanged=TRUE; } } } /*====(ResolutionColor)============================================== Description: Change the image resolution color of bitmap Syntax : L_VOID ContrastImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID ResolutionColor(HWND hWnd) { COLORRESDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(COLORRESDLGPARAMS)); DlgParams.uStructSize = sizeof(COLORRESDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.nBitsPerPixel = gBitmap.BitsPerPixel ; DlgParams.uColorResFlags = CRF_SLOWMATCH; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_COLORRES_SHOW_PREVIEW:0) | DLG_COLORRES_SHOW_ORDER | DLG_COLORRES_SHOW_TOOL_ZOOMLEVEL | DLG_COLORRES_SHOW_OPENPALFILE ; DlgParams.uDlgFlagsEx = DLG_COLORRES_SHOW_BITALL | DLG_COLORRES_SHOW_DITHER_ALL | DLG_COLORRES_SHOW_PAL_ALL ; if(L_DlgColorRes ( hWnd, &DlgParams )== SUCCESS_DLG_OK) { L_INT nValue = 0; L_INT nRet = L_ColorResBitmap( &gBitmap, &gBitmap,sizeof(BITMAPHANDLE), DlgParams.nBitsPerPixel, DlgParams.uColorResFlags, NULL, DlgParams.hpalCustom, 0, NULL, (L_VOID L_FAR *) &nValue); pData->bFileChanged=TRUE; } } /*====(FlipImage)============================================== Description: Flip the bitmap Syntax : L_VOID FlipImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID FlipImage(HWND hWnd) { RECT rc; GetClientRect(hWnd,&rc); L_FlipBitmap(&gBitmap); pData->bFileChanged=TRUE; InvalidateRect(hWnd,&rc,TRUE); } /*====(FastFlipImage)============================================== Description: Flip the bitmap Syntax : L_VOID FastFlipImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID FastFlipImage(HWND hWnd) { RECT rc; GetClientRect(hWnd,&rc); L_FlipBitmapViewPerspective(&gBitmap); pData->bFileChanged=TRUE; InvalidateRect(hWnd,&rc,TRUE); } /*====(ReverseImage)============================================== Description: Reversing the bitmap Syntax : L_VOID ReverseImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID ReverseImage(HWND hWnd) { RECT rc; GetClientRect(hWnd,&rc); L_ReverseBitmap(&gBitmap); pData->bFileChanged=TRUE; InvalidateRect(hWnd,&rc,TRUE); } /*====(FastReverseImage)============================================== Description: Reversing the bitmap Syntax : L_VOID FastReverseImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID FastReverseImage(HWND hWnd) { RECT rc; GetClientRect(hWnd,&rc); L_ReverseBitmapViewPerspective(&gBitmap); pData->bFileChanged=TRUE; InvalidateRect(hWnd,&rc,TRUE); } /*====(ShearImage)============================================== Description: Shear The Image. Syntax : L_VOID ShearImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID ShearImage(HWND hWnd) { SHEARDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(SHEARDLGPARAMS)) ; DlgParams.uStructSize = sizeof ( SHEARDLGPARAMS ) ; DlgParams.pBitmap = &gBitmap; DlgParams.crBack = RGB(255,255,255); DlgParams.nAngle = 0 ; DlgParams.bHorizontal = TRUE ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_SHEAR_SHOW_PREVIEW:0) | DLG_SHEAR_SHOW_HORIZONTAL| DLG_SHEAR_SHOW_BACKCOLOR; if(L_DlgShear( hWnd, &DlgParams )== SUCCESS_DLG_OK) { L_ShearBitmap (&gBitmap, DlgParams.nAngle, DlgParams.bHorizontal, DlgParams.crBack); pData->bFileChanged=TRUE; } } /*====(DeskewImage)============================================== Description: Deskew The Image. Syntax : L_VOID DeskewImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID DeskewImage(HWND hWnd) { RECT rc; L_INT32 nAngle ; GetClientRect(hWnd,&rc); L_DeskewBitmap(&gBitmap,&nAngle,NULL,0); pData->bFileChanged=TRUE; InvalidateRect(hWnd,&rc,TRUE); } /*====(GetTrimValue)============================================== Description: View dailog Box and return User input trim value. Syntax : L_VOID GetTrimValue( HWND hWnd, LPSTR pszTitle, L_INT nInit) Parameters : hWnd Handle to window. pszTitle Dialog Box Title nInit Initiale value for the scroll bar in the dailog box Return Value: dailog Box Returnd Value Or -1 if Cancled. ==========================================================================*/ L_INT GetTrimValue(HWND hWnd, LPSTR pszTitle, L_INT nInit,HWND hwndCtl) { DLGPROC pfn; L_INT nRet; pfn = (DLGPROC) MakeProcInstance((FARPROC) DlgBox, pData->hIns); nRet = DialogBoxParam (pData->hIns, MAKEINTRESOURCE (TrimDlg), hWnd, pfn,(LPARAM) hwndCtl); FreeProcInstance((FARPROC) pfn); return pData->DSValue; } /*====(DlgBox)=================================================== Description: Handles all messages dispatched to the Get Trim Dailog Box. Syntax : L_VOID CALLBACK DlgBox(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Parameters : hWnd Handle to a Dlgbox. message Windows message structure. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE if handle the message , and FALSE if the message not handled . ==========================================================================*/ L_BOOL CALLBACK DlgBox(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) { L_INT n; BOOL fTranslated; L_TCHAR s[256]; switch (message) { case WM_INITDIALOG: SetWindowText (hDlg, (LPTSTR) pData->szTitle); wsprintf(s,TEXT("%d"),pData->DSValue); SetDlgItemText (hDlg, IDC_SCROLL, (LPTSTR) s); SetScrollRange (GetDlgItem (hDlg, IDC_SCROLL), SB_CTL, pData->DSMin, pData->DSMax, FALSE); SetScrollPos (GetDlgItem (hDlg, IDC_SCROLL), SB_CTL, pData->DSValue, TRUE); SetDlgItemInt (hDlg, IDC_TRIMVALUE, pData->DSValue, TRUE); return (TRUE); case WM_HSCROLL: n = GetDlgItemInt (hDlg, IDC_TRIMVALUE, &fTranslated, TRUE); if (!(!fTranslated || n < pData->DSMin|| n > pData->DSMax)) pData->DSValue= n; switch (SCROLLCODE(wParam, lParam)) { case SB_LEFT: pData->DSValue= pData->DSMin; break; case SB_RIGHT: pData->DSValue= pData->DSMax; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: pData->DSValue= SCROLLPOS(wParam, lParam); break; case SB_LINELEFT: pData->DSValue= max (pData->DSValue- pData->DSSteps, pData->DSMin); break; case SB_LINERIGHT: pData->DSValue = min (pData->DSValue+ pData->DSSteps, pData->DSMax); break; case SB_PAGELEFT: pData->DSValue = max (pData->DSValue- pData->DSPage, pData->DSMin); break; case SB_PAGERIGHT: pData->DSValue = min (pData->DSValue + pData->DSPage, pData->DSMax); break; } SetDlgItemInt (hDlg, IDC_TRIMVALUE, pData->DSValue, TRUE); SetScrollPos (GetDlgItem (hDlg, IDC_SCROLL), SB_CTL, pData->DSValue, TRUE); return (TRUE); case WM_COMMAND: switch (CTLID(wParam, lParam)) { case IDC_TRIMVALUE: switch (NOTIFYCODE(wParam, lParam)) { case EN_CHANGE: n = GetDlgItemInt (hDlg, IDC_TRIMVALUE, &fTranslated, TRUE); if (!(!fTranslated || n < pData->DSMin || n > pData->DSMax)) { pData->DSValue = n; SetScrollPos (GetDlgItem (hDlg, IDC_SCROLL), SB_CTL, n, TRUE); } break; } return (TRUE); case IDOK: n = GetDlgItemInt (hDlg, IDC_TRIMVALUE, &fTranslated, TRUE); if (!fTranslated || n < pData->DSMin || n > pData->DSMax) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_TRIMVALUE)); SendDlgItemMessage(hDlg, IDC_TRIMVALUE, EM_SETSEL, TRUE, MAKELPARAM(0, -1)); } else { pData->DSValue= n; EndDialog (hDlg, IDOK); } return (TRUE); case IDCANCEL: pData->DSValue=-1; EndDialog (hDlg, IDCANCEL); return (TRUE); } } return (FALSE); } /*====(AutoTrimImage)============================================== Description: Trim Image.Automaticly Syntax : L_VOID AutoTrimImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID AutoTrimImage(HWND hWnd,HWND hwndCtl) { RECT rc; AUTOTRIMDLGPARAMS AutoTrimDlg; GetClientRect(hWnd,&rc); memset(&AutoTrimDlg, 0, sizeof ( AUTOTRIMDLGPARAMS )); AutoTrimDlg.uStructSize = sizeof ( AUTOTRIMDLGPARAMS ); AutoTrimDlg.pBitmap = &gBitmap; AutoTrimDlg.nThreshold = 128 ; AutoTrimDlg.uDlgFlags = DLG_AUTOTRIM_SHOW_PREVIEW| DLG_AUTOTRIM_AUTOPROCESS; if (L_DlgAutoTrim ( hWnd, &AutoTrimDlg ) == SUCCESS_DLG_OK) { L_AutoTrimBitmap (&gBitmap, AutoTrimDlg.nThreshold); pData->bFileChanged=TRUE; } InvalidateRect(hWnd,&rc,TRUE); } /*====(ResizeImage)============================================== Description: Resizing The Image. Syntax : L_VOID ResizeImage(HWND hWnd, L_INT id) Parameters : hWnd Handle to window. id Type of resizing "RESIZE ,RESAMPLE , BICUBIC" Return Value: None. ==========================================================================*/ L_VOID ResizeImage(HWND hWnd,L_INT id) { RECT rc; RESIZEDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(RESIZEDLGPARAMS)); DlgParams.uStructSize = sizeof(RESIZEDLGPARAMS); DlgParams.uOriginalWidth = BITMAPWIDTH(&gBitmap); DlgParams.uOriginalHeight = BITMAPHEIGHT(&gBitmap); DlgParams.uOriginalBitsPerPixel = gBitmap.BitsPerPixel; DlgParams.uOriginalResolutionX = gBitmap.XResolution; DlgParams.uOriginalResolutionY = gBitmap.YResolution; DlgParams.uNewWidth = BITMAPWIDTH(&gBitmap); DlgParams.uNewHeight = BITMAPHEIGHT(&gBitmap); DlgParams.uNewResolutionX = gBitmap.XResolution; DlgParams.uNewResolutionY = gBitmap.YResolution; DlgParams.uResize = SIZE_NORMAL ; DlgParams.uDlgFlags = DLG_RESIZE_SHOW_PERCENTAGE | DLG_RESIZE_SHOW_IDENTICALVALUE | DLG_RESIZE_SHOW_MAINTAINASPECT | DLG_RESIZE_SHOW_RESOLUTIONGRP; if(L_DlgResize(hWnd,&DlgParams) == SUCCESS_DLG_OK) { L_SizeBitmap (&gBitmap, DlgParams.uNewWidth, DlgParams.uNewHeight, DlgParams.uResize); pData->bFileChanged=TRUE; } pData->MainWidth=BITMAPWIDTH(&gBitmap); pData->MainHight=BITMAPHEIGHT(&gBitmap); pData->Xloc=1; pData->Yloc=1; GetClientRect(hWnd,&rc); pData->VMaxPos=((BITMAPHEIGHT(&gBitmap))-rc.bottom); pData->HMaxPos=((BITMAPWIDTH(&gBitmap))-rc.right); pData->VStep=rc.bottom /10; pData->HStep=rc.right / 10 ; pData->HPageLong=pData->HStep*2; pData->VPageLong=pData->VStep*2; pData->VScrollPos=0; pData->HScrollPos=0; SetScrollRange(hWnd,SB_VERT,0,pData->VMaxPos,FALSE); SetScrollRange(hWnd,SB_HORZ,0,pData->HMaxPos,FALSE); SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); SetScrollPos(hWnd,SB_HORZ,pData->HScrollPos,TRUE); InvalidateRect(hWnd,&rc,TRUE); } /*====(FastRotateImage)============================================== Description: Rotate The Image. Syntax : L_VOID FastRotateImage(HWND hWnd, L_INT id) Parameters : hWnd Handle to window. id Type of Rotation "FastRotate90,180,270" Return Value: None. ==========================================================================*/ L_VOID FastRotateImage(HWND hWnd,L_INT id) { RECT rc; L_INT nValue; GetClientRect(hWnd,&rc); nValue=(id==IDM_FASTROTATE90)? 90:(id==IDM_FASTROTATE180)? 180:270; L_RotateBitmapViewPerspective(&gBitmap, nValue); pData->bFileChanged=TRUE; pData->EraseBK=TRUE; InvalidateRect(hWnd,&rc,TRUE); UpdateWindow(hWnd); } /*====(RotateImage)============================================== Description: Rotate The Image. Syntax : L_VOID FastRotateImage(HWND hWnd, L_INT id) Parameters : hWnd Handle to window. id Type of Rotation "Rotate90,180,270" Return Value: None. ==========================================================================*/ L_VOID RotateImage(HWND hWnd,L_INT id) { RECT rc; L_INT nValue; GetClientRect(hWnd,&rc); nValue=(id==IDM_ROTATE90)? 9000:(id==IDM_ROTATE180)? 18000:27000; L_RotateBitmap (&gBitmap, nValue, ROTATE_RESIZE, RGB(128, 128, 128)); pData->bFileChanged=TRUE; pData->EraseBK=TRUE; InvalidateRect(hWnd,&rc,TRUE); } /*====(RotateAngle)============================================== Description: Rotate The Image with any Angle. Syntax : L_VOID RotateAngle(HWND hWnd ,L_INT id) Parameters : hWnd Handle to window. id Type of Rotation "ROTATE ,INTERPOLATED ,BICUBIC" Return Value: None. ==========================================================================*/ L_VOID RotateAngle(HWND hWnd,L_INT id) { ROTATEDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(ROTATEDLGPARAMS)) ; DlgParams.uStructSize = sizeof ( ROTATEDLGPARAMS ) ; DlgParams.pBitmap = &gBitmap; DlgParams.bResize = TRUE ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_ROTATE_SHOW_PREVIEW:0)| DLG_ROTATE_SHOW_RESIZE | DLG_ROTATE_SHOW_BACKCOLOR; if(L_DlgRotate ( hWnd, &DlgParams ) == SUCCESS_DLG_OK) { L_RotateBitmap (&gBitmap, DlgParams.nAngle, DlgParams.uRotateFlags, DlgParams.crBack); pData->bFileChanged=TRUE; } } /*====(PosterizeImage)============================================== Description: Posterizing The Image . Syntax : L_VOID PosterizeImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID PosterizeImage(HWND hWnd) { POSTERIZEDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(POSTERIZEDLGPARAMS)); DlgParams.uStructSize = sizeof(POSTERIZEDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.nLevels = 2; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_POSTERIZE_SHOW_PREVIEW:0)| DLG_POSTERIZE_SHOW_TOOL_ZOOMLEVEL ; if(L_DlgPosterize ( hWnd, &DlgParams ) == SUCCESS_DLG_OK) if(DlgParams.nLevels) { L_PosterizeBitmap (&gBitmap, DlgParams.nLevels); pData->bFileChanged=TRUE; } } /*====(MosaicImage)============================================== Description: Mosaic The Image . Syntax : L_VOID MosaicImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID MosaicImage(HWND hWnd) { MOSAICDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(MOSAICDLGPARAMS)); DlgParams.uStructSize = sizeof(MOSAICDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.uDim = 3; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_MOSAIC_SHOW_PREVIEW:0)| DLG_MOSAIC_SHOW_TOOL_ZOOMLEVEL ; if(L_DlgMosaic ( hWnd, &DlgParams ) == SUCCESS_DLG_OK) if(DlgParams.uDim) { L_MosaicBitmap (&gBitmap, DlgParams.uDim); pData->bFileChanged=TRUE; } } /*====(UnderLayImage)============================================== Description: Underlay The Image . Syntax : L_VOID UnderLayImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID UnderLayImage(HWND hWnd) { RECT rc; GetClientRect(hWnd,&rc); L_UnderlayBitmap (&gBitmap, &gBitmap, UB_TILE); pData->bFileChanged=TRUE; pData->EraseBK=TRUE; InvalidateRect(hWnd,&rc,TRUE); } /*====(AverageImage)============================================== Description: Average The Image . Syntax : L_VOID AverageImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID AverageImage(HWND hWnd) { AVERAGEDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(AVERAGEDLGPARAMS)); DlgParams.uStructSize = sizeof(AVERAGEDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.uDim = 3; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_AVERAGE_SHOW_PREVIEW:0)| DLG_AVERAGE_SHOW_TOOL_ZOOMLEVEL ; if(L_DlgAverage ( hWnd, &DlgParams )== SUCCESS_DLG_OK) { if(DlgParams.uDim) { L_AverageFilterBitmap (&gBitmap, DlgParams.uDim); pData->bFileChanged=TRUE; } } } /*====(MedianImage)============================================== Description: Median The Image . Syntax : L_VOID MedianImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID MedianImage(HWND hWnd) { MEDIANDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(MEDIANDLGPARAMS)); DlgParams.uStructSize = sizeof(MEDIANDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.uDim = 3; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_MEDIAN_SHOW_PREVIEW:0)| DLG_MEDIAN_SHOW_TOOL_ZOOMLEVEL ; if(L_DlgMedian ( hWnd, &DlgParams )== SUCCESS_DLG_OK) { if(DlgParams.uDim) { L_MedianFilterBitmap(&gBitmap, DlgParams.uDim); pData->bFileChanged=TRUE; } } } /*====(SharpenImage)============================================== Description: Sharpen The Image . Syntax : L_VOID SharpenImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID SharpenImage(HWND hWnd) { SHARPENDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(SHARPENDLGPARAMS)); DlgParams.uStructSize = sizeof(SHARPENDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.nSharpness = 0; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_SHARPEN_SHOW_PREVIEW:0)| DLG_SHARPEN_SHOW_TOOL_ZOOMLEVEL ; if(L_DlgSharpen ( hWnd, &DlgParams )== SUCCESS_DLG_OK) if(DlgParams.nSharpness) { L_SharpenBitmap (&gBitmap, DlgParams.nSharpness); pData->bFileChanged=TRUE; } } /*====(DespeckleImage)============================================== Description: Despeckle The Image . Syntax : L_VOID DespeckleImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID DespeckleImage(HWND hWnd) { RECT rc; GetClientRect(hWnd,&rc); L_DespeckleBitmap(&gBitmap); pData->bFileChanged=TRUE; pData->EraseBK=TRUE; InvalidateRect(hWnd,&rc,TRUE); } /*====(AddNoiseImage)============================================== Description: Adding Noise to The Image . Syntax : L_VOID AddNoiseImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID AddNoiseImage(HWND hWnd) { ADDNOISEDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(ADDNOISEDLGPARAMS)); DlgParams.uStructSize = sizeof(ADDNOISEDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.uRange = 100 ; DlgParams.uChannel = CHANNEL_MASTER ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_ADDNOISE_SHOW_PREVIEW:0)| DLG_ADDNOISE_SHOW_TOOL_ZOOMLEVEL ; if(L_DlgAddNoise ( hWnd, &DlgParams ) == SUCCESS_DLG_OK) { L_AddBitmapNoise (&gBitmap, DlgParams.uRange, DlgParams.uChannel); pData->bFileChanged=TRUE; } } /*====(EmbossImage)============================================== Description: Emboss The Image . Syntax : L_VOID EmbossImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID EmbossImage(HWND hWnd) { EMBOSSDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(EMBOSSDLGPARAMS)); DlgParams.uStructSize = sizeof(EMBOSSDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.uDepth = 0; DlgParams.uDirection = EMBOSS_N ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_EMBOSS_SHOW_PREVIEW:0)| DLG_EMBOSS_SHOW_TOOL_ZOOMLEVEL ; if(L_DlgEmboss ( hWnd, &DlgParams ) == SUCCESS_DLG_OK) { L_EmbossBitmap (&gBitmap, DlgParams.uDirection, DlgParams.uDepth); pData->bFileChanged=TRUE; } } /*====(EdgeEnhanceImage)============================================== Description: Edge Enhance Bitmap . Syntax : L_VOID EdgeEnhanceImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID EdgeEnhanceImage(HWND hWnd) { RECT rc; GetClientRect(hWnd,&rc); BITMAPHANDLE WrkBitmap; L_INT nRet=SUCCESS; L_INT nOldBitsPerPixel = gBitmap.BitsPerPixel; if(nOldBitsPerPixel<=8) { nRet = L_ColorResBitmap(&gBitmap, &gBitmap, sizeof(BITMAPHANDLE), 24, CRF_BYTEORDERBGR, NULL, NULL, 0, NULL, NULL); if(nRet!=SUCCESS)return; } nRet = L_CopyBitmap(&WrkBitmap, &gBitmap,sizeof(BITMAPHANDLE)); if(nRet == SUCCESS) nRet = L_SpatialFilterBitmap (&WrkBitmap, FLT_LAPLACE_1); if(nRet == SUCCESS) { L_CombineBitmap(&gBitmap, 0, 0, BITMAPWIDTH(&gBitmap), BITMAPHEIGHT(&gBitmap), &WrkBitmap, 0, 0, CB_OP_ADD); pData->bFileChanged=TRUE; } if(nOldBitsPerPixel<=8) { nRet = L_ColorResBitmap(&gBitmap, &gBitmap, sizeof(BITMAPHANDLE), nOldBitsPerPixel, CRF_OPTIMIZEDPALETTE, NULL, NULL, 0, NULL, NULL); if(nRet!=SUCCESS)return; } InvalidateRect(hWnd,&rc,TRUE); } /*====(OilifyImage)============================================== Description: Oilify The Bitmap. Syntax : L_VOID OilifyImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID OilifyImage(HWND hWnd,HWND hwndCtl) { OILIFYDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(OILIFYDLGPARAMS)); DlgParams.uStructSize = sizeof(OILIFYDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.uDim = 3; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_OILIFY_SHOW_PREVIEW:0)| DLG_OILIFY_SHOW_TOOL_ZOOMLEVEL ; if(L_DlgOilify ( hWnd, &DlgParams ) == SUCCESS_DLG_OK) { if(DlgParams.uDim) { L_OilifyBitmap (&gBitmap, DlgParams.uDim); pData->bFileChanged=TRUE; } } } /*====(GradientFilter)============================================== Description:Apply Gradient Filter on the Bitmap. Syntax : L_VOID GradientFilter(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID GradientFilter(HWND hWnd) { GRADIENTFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(GRADIENTFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(GRADIENTFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap; DlgParams.pFilter = FLT_GRADIENT_N ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_GRADIENTFILTER_SHOW_PREVIEW:0)| DLG_GRADIENTFILTER_SHOW_TOOL_ZOOMLEVEL; if(L_DlgGradientFilter( hWnd,&DlgParams ) == SUCCESS_DLG_OK) { L_SpatialFilterBitmap (&gBitmap, DlgParams.pFilter); pData->bFileChanged=TRUE; } } /*====(LaplacianFilter)============================================== Description:Apply Laplacian Filter on the Bitmap. Syntax : L_VOID SpatialFilter(HWND hWnd Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID LaplacianFilter(HWND hWnd) { LAPLACIANFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(LAPLACIANFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(LAPLACIANFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap; DlgParams.pFilter = FLT_LAPLACE_1 ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_LAPLACIANFILTER_SHOW_PREVIEW:0)| DLG_LAPLACIANFILTER_SHOW_TOOL_ZOOMLEVEL; if(L_DlgLaplacianFilter( hWnd,&DlgParams ) == SUCCESS_DLG_OK) { L_SpatialFilterBitmap (&gBitmap, DlgParams.pFilter); pData->bFileChanged=TRUE; } } /*====(SobelFilter)============================================== Description:Apply Sobel Filter on the Bitmap. Syntax : L_VOID SobelFilter(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID SobelFilter(HWND hWnd) { SOBELFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(SOBELFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(SOBELFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap; DlgParams.pFilter = FLT_SOBEL_HORZ ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_SOBELFILTER_SHOW_PREVIEW:0)| DLG_SOBELFILTER_SHOW_TOOL_ZOOMLEVEL; if(L_DlgSobelFilter ( hWnd,&DlgParams ) == SUCCESS_DLG_OK) { L_SpatialFilterBitmap (&gBitmap, DlgParams.pFilter); pData->bFileChanged=TRUE; } } /*====(PrewittFilter)============================================== Description:Apply Prewitt Filter on the Bitmap. Syntax : L_VOID PrewittFilter(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID PrewittFilter(HWND hWnd) { PREWITTFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(PREWITTFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(PREWITTFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap; DlgParams.pFilter = FLT_PREWITT_HORZ ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_PREWITTFILTER_SHOW_PREVIEW:0)| DLG_PREWITTFILTER_SHOW_TOOL_ZOOMLEVEL; if(L_DlgPrewittFilter ( hWnd,&DlgParams ) == SUCCESS_DLG_OK) { L_SpatialFilterBitmap (&gBitmap, DlgParams.pFilter); pData->bFileChanged=TRUE; } } /*====(ShiftanddifferenceFilter)============================================== Description:Apply Shiftanddifference Filter on the Bitmap. Syntax : L_VOID ShiftanddifferenceFilter(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID ShiftanddifferenceFilter(HWND hWnd) { SHIFTDIFFERENCEFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(SHIFTDIFFERENCEFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(SHIFTDIFFERENCEFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap; DlgParams.pFilter = FLT_SHIFTDIFF_DIAG ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_SHIFTDIFFERENCEFILTER_SHOW_PREVIEW:0)| DLG_SHIFTDIFFERENCEFILTER_SHOW_TOOL_ZOOMLEVEL; if(L_DlgShiftDifferenceFilter ( hWnd,&DlgParams ) == SUCCESS_DLG_OK) { L_SpatialFilterBitmap (&gBitmap, DlgParams.pFilter); pData->bFileChanged=TRUE; } } /*====(LinesegmentFilter)============================================== Description:Apply Linesegment Filter on the Bitmap. Syntax : L_VOID LinesegmentFilter(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID LinesegmentFilter(HWND hWnd) { LINESEGMENTFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(LINESEGMENTFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(LINESEGMENTFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap; DlgParams.pFilter = FLT_LINESEG_HORZ ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_LINESEGMENTFILTER_SHOW_PREVIEW:0)| DLG_LINESEGMENTFILTER_SHOW_TOOL_ZOOMLEVEL; if(L_DlgLineSegmentFilter( hWnd,&DlgParams ) == SUCCESS_DLG_OK) { L_SpatialFilterBitmap (&gBitmap, DlgParams.pFilter); pData->bFileChanged=TRUE; } } /*====(ErosionFilter)============================================== Description:Apply Erosion Filter on the Bitmap. Syntax : L_VOID ErosionFilter(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID ErosionFilter(HWND hWnd) { EROSIONFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(EROSIONFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(EROSIONFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap; DlgParams.pFilter = BFLT_EROSION_OMNI ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_EROSIONFILTER_SHOW_PREVIEW:0)| DLG_EROSIONFILTER_SHOW_TOOL_ZOOMLEVEL; if(L_DlgErosionFilter( hWnd,&DlgParams ) == SUCCESS_DLG_OK) { L_BinaryFilterBitmap(&gBitmap, DlgParams.pFilter); pData->bFileChanged=TRUE; } } /*====(DilationFilter)============================================== Description:Apply Dilation Filter on the Bitmap. Syntax : L_VOID DilationFilter(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID DilationFilter(HWND hWnd) { DILATIONFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(DILATIONFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(DILATIONFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap; DlgParams.pFilter = BFLT_DILATION_OMNI ; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_DILATIONFILTER_SHOW_PREVIEW:0)| DLG_DILATIONFILTER_SHOW_TOOL_ZOOMLEVEL; if(L_DlgDilationFilter( hWnd,&DlgParams ) == SUCCESS_DLG_OK) { L_BinaryFilterBitmap (&gBitmap, DlgParams.pFilter); pData->bFileChanged=TRUE; } } /*====(MinFilter)============================================== Description:Apply Min Filter on the Bitmap. Syntax : L_VOID MinFilter(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID MinFilter(HWND hWnd) { MINFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(MINFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(MINFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.uDim = 3; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_MINFILTER_SHOW_PREVIEW:0)| DLG_MINFILTER_SHOW_TOOL_ZOOMLEVEL; if(L_DlgMinFilter ( hWnd, &DlgParams ) == SUCCESS_DLG_OK) { if(DlgParams.uDim) { L_MinFilterBitmap (&gBitmap, DlgParams.uDim); pData->bFileChanged=TRUE; } } } /*====(MaxFilter)============================================== Description:Apply Max Filter on the Bitmap. Syntax : L_VOID MaxFilter(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID MaxFilter(HWND hWnd) { MAXFILTERDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(MAXFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(MAXFILTERDLGPARAMS); DlgParams.pBitmap = &gBitmap ; DlgParams.uDim = 3; DlgParams.uDlgFlags = (pData->bShowPreview?DLG_MAXFILTER_SHOW_PREVIEW:0)| DLG_MAXFILTER_SHOW_TOOL_ZOOMLEVEL ; if(L_DlgMaxFilter ( hWnd, &DlgParams ) == SUCCESS_DLG_OK) { if(DlgParams.uDim) { L_MaxFilterBitmap (&gBitmap, DlgParams.uDim); pData->bFileChanged=TRUE; } } } /*====(ZoomImage)============================================== Description:Apply Max Filter on the Bitmap. Syntax : L_VOID ZoomImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID ZoomImage(HWND hWnd,HWND hwndCtl) { lstrcpy (pData->szTitle, TEXT("Zoom")); pData->DSValue= nCurZoom; pData->DSMax=800; pData->DSMin=1; pData->DSSteps=1; pData->DSPage=100; L_INT nValue = GetTrimValue(hWnd, "Zoom", 1,hwndCtl); if (nValue>0) { RECT rcDist; nCurZoom =nValue; pData->Zoom=TRUE; GetClientRect(hWnd,&rcDist); BITMAPWIDTH(&gBitmap)=BITMAPWIDTH(&gBitmap); BITMAPHEIGHT(&gBitmap)=BITMAPHEIGHT(&gBitmap); pData->WFactor=(L_DOUBLE)(nValue) / 100; pData->HFactor=(L_DOUBLE)(nValue) / 100; pData->NormalSize=FALSE; RECT rc; GetClientRect(hWnd,&rc); pData->VMaxPos=((L_INT)((BITMAPHEIGHT(&gBitmap)+1)*pData->HFactor)-rc.bottom); pData->HMaxPos=((L_INT)((BITMAPWIDTH(&gBitmap)+1)*pData->WFactor)-rc.right); pData->VStep=pData->VMaxPos/10; pData->HStep=pData->HMaxPos/ 10 ; pData->HPageLong=pData->HStep*2; pData->VPageLong=pData->VStep*2; pData->VScrollPos=0; pData->HScrollPos=0; SetScrollRange(hWnd,SB_VERT,0,pData->VMaxPos,FALSE); SetScrollRange(hWnd,SB_HORZ,0,pData->HMaxPos,FALSE); SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); SetScrollPos(hWnd,SB_HORZ,pData->HScrollPos,TRUE); CHECKMENUITEM(pData->hMenu, IDM_FITTOWINDOW, FALSE); CHECKMENUITEM(pData->hMenu, IDM_NORMAL, FALSE); CHECKMENUITEM(pData->hMenu, IDM_ZOOM, FALSE); InvalidateRect(hWnd,&rc,TRUE); } } /*====(StatusCallBack)============================================== Description:Track The Processes witch come from LEADTOOLS API's Syntax : L_INT L_FAR StatusCallBack (L_INT nPercent, L_VOID L_FAR *pUserData) Parameters : nPercent How Much Done From The Process. Return Value: SUCCESS Or 0. ==========================================================================*/ L_INT L_FAR L_EXPORT StatusCallBack (L_INT nPercent, L_VOID L_FAR *pUserData) { MSG msg; HWND hWnd; if((pData->bUseProgress)||(pData->bUseProgressUpdate)) { hWnd = GetDlgItem (pData->hProgressDlg, IDC_PROGRESS); while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage (&msg); DispatchMessage (&msg); } if(nPercent==0) { ProgressBar(pData->hWndParent,pData->hwndCtl); Progress_SetRange(hWnd,0,100); EnableWindow(pData->hWndParent,FALSE); } pData->ProgressValue=nPercent; if (pData->ProgressValue==100) SendMessage(pData->hProgressDlg, WM_DESTROY, 0, 0L); else { Progress_SetPos(hWnd,pData->ProgressValue); if(pData->bUseProgressUpdate) { InvalidateRect(pData->hWndParent,NULL,FALSE); UpdateWindow(pData->hWndParent); } } } return (SUCCESS); } /*====(ProgressBar)============================================== Description: Show ProgressBar dailog box Syntax : L_VOID ProgressBar(HWND hWnd, HWND hwndCtl) Parameters : hWnd Handle to window. hwndCtl Handle to dailog box Return Value: None. ==========================================================================*/ L_VOID ProgressBar(HWND hWnd, HWND hwndCtl) { pData->hProgressDlg= CreateDialogParam(pData->hIns, MAKEINTRESOURCE(ProgressDlg), hWnd, (DLGPROC)ProgressDlgProc, (LPARAM)hwndCtl); if(!pData->hProgressDlg) { MessageBox(hWnd, TEXT("Error Creating Dialog"), TEXT("Error"), MB_OK); return; } ShowWindow(pData->hProgressDlg, SW_SHOW); SendMessage(pData->hProgressDlg, WM_PAINT, 0, 0L); } /*====(ProgressDlgProc)=================================================== Description: Handles all messages dispatched to the Progress Bar Dailog Box. Syntax : L_BOOL CALLBACK ProgressDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) Parameters : hDlg Handle to a Dlgbox. message Windows message structure. wParam Windows word parameter. lParam Windows long parameter. Return Value: TRUE if handle the message , and FALSE if the message not handled . ==========================================================================*/ L_BOOL CALLBACK ProgressDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_INITDIALOG: RECT rc,rc2; GetWindowRect(pData->hWndParent,&rc); GetClientRect(hDlg,&rc2); SetWindowPos(hDlg,HWND_BOTTOM,((rc.left+rc.right)/2)-(rc2.right/2) , ((rc.top+rc.bottom)/2)-(rc2.bottom/2),0,0,SWP_NOSIZE); case WM_DESTROY: EndDialog (hDlg, IDCANCEL); return TRUE; } return FALSE; }