/*[]=====================================================================[]*/ /*[] LeadTools Run Time Library - Version 12 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2001 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[]=====================================================================[]*/ //#include #include #include #include #include #include #include #include "resource.h" #include #include #include "global.h" /************************************/ /* Macro's definition */ /************************************/ #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 state, HWND hwndActDeact, BOOL fMinimized); static VOID LEADTOOLS_OnPaletteChanging(HWND hWnd, HWND hWndPaletteChange); static VOID LEADTOOLS_SysColorChange(HWND hwnd); 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); BOOL LEADTOOLS_OnQueryNewPalette (HWND hWnd); VOID LEADTOOLS_OnPaletteChanged (HWND hWnd, HWND hWndPaletteChange); L_INT yClientView(L_INT MousePos); L_INT xClientView(L_INT MousePos); COLORREF GetUserColor(COLORREF); L_VOID Stitch(pBITMAPHANDLE LeadBitmap,pBITMAPHANDLE TmpBitmap,L_INT X,L_INT Y); L_VOID ViewImage(HDC,HWND hWnd,pBITMAPHANDLE pBitmap,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,pBITMAPHANDLE pBitmap2); L_BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); L_VOID CreateMainImage(HWND hWnd, LPRGBQUAD pPalette); 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_INT ShowOpenFiles(HWND hWnd,HWND hwndCtl); L_INT CALLBACK OpenFileDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam); L_VOID GetOpenFile(HWND hDlg,TCHAR * pszCaption ,int nFileID); /************************************/ /* Global Variables */ /************************************/ pUSERSTRUCT pData; BITMAPHANDLE TmpBitmap1,TmpBitmap2 ; BITMAPHANDLE TmpBitmap3,TmpBitmap4 ; BITMAPHANDLE Bitmap; /*====(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 ("LEAD Floater Demo") ; 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 ; pData=new tagUSERSTRUCTA(); pData->hHandCursor=LoadCursor(hInstance , MAKEINTRESOURCE(IDC_CURS11)); if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("RegisterClass failed!"), szAppName, MB_ICONERROR) ; return 0 ; } UNLOCKSUPPORT(); hwnd = CreateWindow (szAppName, TEXT ("LEAD Floater Demo"), WS_OVERLAPPEDWINDOW| WS_HSCROLL| WS_VSCROLL, 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_LBUTTONUP, LEADTOOLS_OnLButtonUp); HANDLE_MSG (hWnd, WM_LBUTTONDOWN, LEADTOOLS_OnLButtonDown); HANDLE_MSG (hWnd, WM_MOUSEMOVE, LEADTOOLS_OnMouseMove); 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); } return DefWindowProc (hWnd, message, wParam, lParam) ; } /*====(OpenTheFile)======================================================== Description: Loads the image from file Syntax : L_BOOL OpenTheFile( HWND hWnd, pBITMAPHANDLE pBitmap1, pBITMAPHANDLE pBitmap2) Parameters : hWnd Handle to a window. pBitmap1 Handle to first bitmap. pBitmap2 Handle to second bitmap. pPalette Address of a RGBQUAD array (256 entries) that should be filled with the common palette (if either bitmap is less than 8BPP). Return Value: TRUE if SUCCESS or FALSE if there is an error. ==========================================================================*/ L_BOOL OpenTheFile( HWND hWnd, pBITMAPHANDLE pBitmap1, pBITMAPHANDLE pBitmap2, LPRGBQUAD pPalette) { L_INT nRet; L_INT nBitsPerPixel1; L_INT nBitsPerPixel2; L_INT nPaletteColors; nBitsPerPixel1 = pData->FileInfo1.BitsPerPixel; nBitsPerPixel2 = pData->FileInfo2.BitsPerPixel; // make the combined bitmap be of the highest bits/pixel, to improve quality pData->BitPerPixel = max(nBitsPerPixel1, nBitsPerPixel2); if((pData->BitPerPixel==12)||(pData->BitPerPixel==16)) { nRet=L_ColorResBitmap(pBitmap2, pBitmap2, sizeof(BITMAPHANDLE),16,CRF_BYTEORDERBGR, NULL,NULL,NULL,NULL,NULL); nRet=L_ColorResBitmap(pBitmap1, pBitmap1, sizeof(BITMAPHANDLE),16,CRF_BYTEORDERBGR, NULL,NULL,NULL,NULL,NULL); } else { if (pData->BitPerPixel>8) { if(nBitsPerPixel2 != pData->BitPerPixel) nRet=L_ColorResBitmap(pBitmap2, pBitmap2,sizeof(BITMAPHANDLE), pData->BitPerPixel,CRF_BYTEORDERBGR, NULL,NULL,0,NULL,NULL); if(nBitsPerPixel1 != pData->BitPerPixel) nRet=L_ColorResBitmap(pBitmap1, pBitmap1,sizeof(BITMAPHANDLE), pData->BitPerPixel,CRF_BYTEORDERBGR, NULL,NULL,0,NULL,NULL); } else { if(nBitsPerPixel1 < nBitsPerPixel2) { // make pBitmap2 the same bits per pixel as pBitmap1 nPaletteColors = L_GetBitmapColors(pBitmap2, 0, 256, pPalette); nRet=L_ColorResBitmap(pBitmap1, pBitmap1, sizeof(BITMAPHANDLE),pData->BitPerPixel,CRF_USERPALETTE | CRF_BYTEORDERBGR |CRF_FLOYDSTEINDITHERING, pPalette,NULL,nPaletteColors,NULL,NULL); } else { // make pBitmap1 the same bits per pixel as pBitmap2 nPaletteColors = L_GetBitmapColors(pBitmap1, 0, 256, pPalette); nRet=L_ColorResBitmap(pBitmap2, pBitmap2, sizeof(BITMAPHANDLE),pData->BitPerPixel,CRF_USERPALETTE | CRF_BYTEORDERBGR|CRF_FLOYDSTEINDITHERING, pPalette,NULL,nPaletteColors,NULL,NULL); } } } return(TRUE); } /*====(ViewImage)========================================================== Description: Paint image at any possition into DC , with selected view. Syntax : void ViewImage(HDC hdc, HWND hWnd, pBITMAPHANDLE pBitmap, 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,pBITMAPHANDLE pBitmap,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(!pBitmap->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(pBitmap)*pData->WFactor+pData->Xloc), (L_INT)(BITMAPHEIGHT(pBitmap)*pData->HFactor)+pData->Yloc); /* Use the palette created earlier (it is faster than creating it every time) */ if(pData->hPalette) { /* Select our palette and save the old one */ hSavedPalette = SelectPalette (hdc, pData->hPalette, TRUE); RealizePalette (hdc); } /* Realize our palette */ L_PaintDC ( hdc, /* Device context */ pBitmap,/* 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(pData->hPalette) { /* Restore the old palette */ SelectPalette (hdc, hSavedPalette, TRUE); } if(pData->MoveImage1||pData->MoveImage2) SetCursor (pData->hHandCursor); return; } /*====(Stitch)========================================================== Description: Paste two images together . Syntax : void Stitch(pBITMAPHANDLE LeadBitmap, pBITMAPHANDLE TmpBitmap, L_INT X, L_INT Y) Parameters : LeadBitmap Distination bitmap TmpBitmap Source bitmap X X possition for the source into ditination bitmap Y Y possition for the source into ditination bitmap ==========================================================================*/ void Stitch(pBITMAPHANDLE LeadBitmap,pBITMAPHANDLE TmpBitmap,L_INT X,L_INT Y) { L_INT XDst; /* Column offset of the destination */ L_INT XSize; /* Pixel width of the rectangle to combine */ L_INT YDst; /* Row offset of the destination */ L_INT YSize; /* Pixel height of the rectangle to combine */ L_INT XSrc; /* Column offset of the source */ L_INT YSrc; /* Column offset of the source */ L_INT nRet; /* Load both bitmaps, at Dist Image BitPerPixel */ /* Specify a position in the top left part of the displayed image */ XDst = X ; YDst = Y; /* Use the full size of the source bitmap */ YSize = BITMAPHEIGHT(TmpBitmap); XSize = BITMAPWIDTH(TmpBitmap); XSrc = 0; YSrc = 0; /* Combine TmpBitmap with LeadBitmap, using flags for an ordinary paste */ /*/*/ nRet=L_CombineBitmap(LeadBitmap, XDst, YDst, XSize, YSize, TmpBitmap, XSrc, YSrc,CB_DST_0 | CB_OP_OR); if(pData->MoveImage1||pData->MoveImage2) SetCursor (pData->hHandCursor); } /*====(GetUserColor)====================================================== Description: Open system color dailog and return user selected color . Syntax : COLORREF GetUserColor(COLORREF oldColor) Parameters : oldColor Old backgroun color. Return Value: user selected color. ==========================================================================*/ COLORREF GetUserColor(COLORREF oldColor) { static CHOOSECOLOR cc; static COLORREF crRef[16]; cc.lStructSize = sizeof(CHOOSECOLOR); cc.hwndOwner=NULL; cc.hInstance=NULL; cc.rgbResult=oldColor; cc.lpCustColors=crRef; cc.Flags=CC_RGBINIT; cc.lCustData=0; cc.lpfnHook=NULL; cc.lpTemplateName=NULL; ChooseColor(&cc); return cc.rgbResult; } /*====(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) { L_UINT uResCount; L_INT nSaveFormat; HCURSOR hCursor; L_INT nRet; static OPENFILENAME OpenFileName; static L_UINT uSaveMulti = FALSE; static SAVEDLGPARAMS FSParm; FILEJ2KOPTIONS FileJ2KOptions; pDIMENSION pOldResolutions=NULL; pDIMENSION pJBIGResolutions=NULL; memset(&FileJ2KOptions,0,sizeof(FILEJ2KOPTIONS)); OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.lpstrInitialDir = NULL; OpenFileName.lpstrTitle = TEXT("Save a File"); OpenFileName.nFilterIndex = 1; OpenFileName.Flags = 0; FSParm.uStructSize = sizeof(SAVEDLGPARAMS); FSParm.nQFactor = 2; FSParm.nPageNumber = 1; FSParm.uSaveMulti = uSaveMulti; FSParm.uDlgFlags = DLG_SAVE_ENABLESIZING | DLG_SAVE_SHOW_FILEOPTIONS_MULTIPAGE| DLG_SAVE_SHOW_FILEOPTIONS_PROGRESSIVE | DLG_SAVE_SHOW_FILEOPTIONS_QFACTOR | DLG_SAVE_SHOW_FILEOPTIONS_STAMP| DLG_SAVE_SHOW_FILEOPTIONS_BASICJ2KOPTIONS| DLG_SAVE_SHOW_FILEOPTIONS_J2KOPTIONS; nRet = L_DlgSave( hWnd,&OpenFileName,&FSParm); if(nRet == SUCCESS_DLG_OK) { SAVEFILEOPTION SaveFileOption; uSaveMulti = FSParm.uSaveMulti; int nSaveIndex = OpenFileName.nFilterIndex; hCursor = SetCursor (LoadCursor (NULL, IDC_WAIT)); L_GetDefaultSaveFileOption(&SaveFileOption, sizeof(SAVEFILEOPTION)); SaveFileOption.PageNumber = FSParm.nPageNumber; SaveFileOption.Flags = 0; switch(FSParm.uSaveMulti) { case MULTIPAGE_OPERATION_OVERWRITE: SaveFileOption.PageNumber = 1; break; case MULTIPAGE_OPERATION_APPEND: SaveFileOption.PageNumber = 2; break; case MULTIPAGE_OPERATION_REPLACE: SaveFileOption.Flags|=ESO_REPLACEPAGE; break; case MULTIPAGE_OPERATION_INSERT: SaveFileOption.Flags|=ESO_INSERTPAGE; break; } SaveFileOption.Passes = FSParm.nPasses; nSaveFormat = FSParm.nFormat; if(FSParm.nFormat == FILE_GIF) { if (!FSParm.bSaveInterlaced) SaveFileOption.Flags &= ~ESO_INTERLACED; else SaveFileOption.Flags |= ESO_INTERLACED; } if(nSaveFormat == FILE_JBIG) { /* get current resolutions */ L_GetSaveResolution (&uResCount, NULL); if(uResCount>0) { pOldResolutions = (pDIMENSION)GlobalAllocPtr(GHND, sizeof(DIMENSION)*uResCount); if(pOldResolutions) L_GetSaveResolution (&uResCount, pOldResolutions); } pJBIGResolutions = (pDIMENSION)GlobalAllocPtr(GHND, sizeof(DIMENSION)*FSParm.nPasses); if(pJBIGResolutions) { /* largest resolution will be actual image size */ pJBIGResolutions[0].nWidth = pBitmapHandle->Width; pJBIGResolutions[0].nHeight = pBitmapHandle->Height; /* will save nPasses resolution layers */ L_SetSaveResolution (FSParm.nPasses, pJBIGResolutions); } } if((FSParm.nFormat == FILE_J2K)|| (FSParm.nFormat == FILE_JP2)|| (FSParm.nFormat == FILE_CMW)|| (FSParm.nFormat == FILE_TIF_J2K)|| (FSParm.nFormat == FILE_TIF_CMW)) { /*Restore the old J2K Options*/ L_GetJ2KOptions(&FileJ2KOptions,sizeof(FILEJ2KOPTIONS)); L_SetJ2KOptions(&FSParm.FileJ2KOptions); } nRet = L_SaveBitmap( FSParm.szFileName, pBitmapHandle, nSaveFormat, FSParm.nBitsPerPixel, FSParm.nQFactor, &SaveFileOption ); if((FSParm.nFormat == FILE_J2K)|| (FSParm.nFormat == FILE_JP2)|| (FSParm.nFormat == FILE_CMW)|| (FSParm.nFormat == FILE_TIF_J2K)|| (FSParm.nFormat == FILE_TIF_CMW)) { /*Restore the old J2K Options*/ L_SetJ2KOptions(&FileJ2KOptions); } /* restore the old save dimensions */ if(pOldResolutions) { L_SetSaveResolution (uResCount, pOldResolutions); GlobalFreePtr(pOldResolutions); } if(pJBIGResolutions) GlobalFreePtr(pJBIGResolutions); } SetCursor (hCursor); if (nRet != SUCCESS) return -1; return (0); } /*====(xClientView)====================================================== Description: Calculate The View X Mouse Possition And Return it. Syntax : L_INT xClientView(L_INT MousePos) Parameters : MousePos Real mouse X possition on the window. Return Value: View X Mouse Possition ==========================================================================*/ L_INT xClientView(L_INT MousePos) { return (L_INT)((MousePos+pData->HScrollPos)/pData->WFactor); } /*====(yClientView)====================================================== Description: Calculate The View Y Mouse Possition And Return it. Syntax : L_INT yClientView(L_INT MousePos) Parameters : MousePos Real mouse Y possition on the window. Return Value: View Y Mouse Possition ==========================================================================*/ L_INT yClientView(L_INT MousePos) { return (L_INT)((MousePos+pData->VScrollPos)/pData->HFactor); } /*====(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) { HICON m_hIcon; switch(message) { case WM_INITDIALOG: m_hIcon = (HICON) LoadImage( pData->hIns, MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); SendMessage(hDlg,WM_SETICON, ICON_SMALL, (LPARAM) m_hIcon); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg,0); return TRUE; } break; case WM_CLOSE: 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->hPalette=NULL; pData->WFactor=1; pData->HFactor=1; pData->UpImage=1; pData->Xloc1=1; pData->Xloc2=1; pData->Yloc1=1; pData->Yloc2=1; pData->Xloc=1; pData->Yloc=1; pData->MouseEnabled=FALSE; pData->MouseButtonUp=TRUE; pData->MouseButtonDown=FALSE; pData->MoveImage1=FALSE; pData->MoveImage2=FALSE; pData->FileOneLoaded=FALSE; pData->FileTwoLoaded=FALSE; pData->MouseYStart=-1; pData->MouseXStart=-1; pData->oldbkColor=RGB(255,255,255); pData->newbkColor=RGB(255,255,255); pData->NormalSize=TRUE; pData->VPageLong=0; pData->HPageLong=0; L_FreeBitmap(&TmpBitmap1); L_FreeBitmap(&TmpBitmap2); L_FreeBitmap(&Bitmap); pData->hIns=lpCreateStruct->hInstance; pData->hMenu= LoadMenu(pData->hIns,MAKEINTRESOURCE(ID_MENU)) ; SetMenu(hWnd, pData->hMenu) ; 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) { if (pData->hPalette) /* Delete palette if there is one. */ DeleteObject (pData->hPalette); 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; HPALETTE hOldPal; hDc = BeginPaint (hWnd, &ps); if (pData->hPalette) /* Is there a palette that needs to be selected? */ hOldPal = SelectPalette (hDc, pData->hPalette, TRUE); /* Select it. */ if(pData->MoveImage1||pData->MoveImage2) SetCursor (pData->hHandCursor); ViewImage(hDc,hWnd,&Bitmap,pData->Xloc,pData->Yloc); if (pData->hPalette) /* Return old palette if there is one. */ SelectPalette (hDc, hOldPal, TRUE); 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) { switch (id) { case ID_FILE_OPENIMAGE: if (ShowOpenFiles(hWnd,hwndCtl)==SUCCESS) { RGBQUAD Palette[256]; OpenTheFile(hWnd, &TmpBitmap1 ,&TmpBitmap2, Palette); CreateMainImage(hWnd, Palette); } break ; case ID_BKCOLOR: SetImageBKColor(hWnd); break; case ID_FILE_EXIT: PostQuitMessage(0) ; break ; case ID_SAVING: SaveBitmapFile (hWnd,&Bitmap); break ; case ID_NORMAL: SetNormalView(hWnd); break; case ID_FITTOWINDOW: SetFitWindowView(hWnd); break ; case ID_HELP_ABOUT: ShowAboutDlg(hWnd,hwndCtl); break; case ID_STITCH: MakeFinalImage(hWnd); break; } } /*====(LEADTOOLS_OnLButtonUp )======================================================== Description: Set mouse move and image move , and all moving image flages to false Syntax : VOID LEADTOOLS_OnLButtonUp (HWND hWnd, L_INT x, L_INT y, UINT keyFlags) Parameters : hWnd Handle to a window. x Mouse x posintion. y Mouse y posintion. keyFlags Not used. Return Value: None. ==========================================================================*/ static VOID LEADTOOLS_OnLButtonUp (HWND hWnd, L_INT x, L_INT y, UINT keyFlags) { if(GetCapture()==hWnd) ReleaseCapture(); pData->MouseButtonUp=TRUE; pData->MouseButtonDown=FALSE; pData->MoveImage1=FALSE; pData->MoveImage2=FALSE; pData->MouseYStart=-1; pData->MouseXStart=-1; } /*====(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 rcDist; GetClientRect(hWnd,&rcDist); if (pData->NormalSize) { pData->WFactor=1; pData->HFactor=1; pData->Xloc=1; pData->Yloc=1; RECT rc; GetClientRect(hWnd,&rc); pData->VMaxPos=((Bitmap.Height-rc.bottom)>=0)? (Bitmap.Height-rc.bottom): 0; pData->HMaxPos=((Bitmap.Width-rc.right)>=0)? (Bitmap.Width-rc.right):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,TRUE); SetScrollRange(hWnd,SB_HORZ,0,pData->HMaxPos,TRUE); SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); SetScrollPos(hWnd,SB_HORZ,pData->HScrollPos,TRUE); } else { GetClientRect(hWnd,&rcDist); L_DOUBLE TmpV1; pData->ImageWidth=Bitmap.Width; pData->ImageHeight=Bitmap.Height; if(((double)rcDist.bottom/(double)pData->ImageHeight)<((double)rcDist.right/(double)pData->ImageWidth)) TmpV1= (double)rcDist.bottom/(double)pData->ImageHeight; else TmpV1= (double)rcDist.right/(double)pData->ImageWidth; pData->WFactor=TmpV1; pData->HFactor=TmpV1; pData->NormalSize=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; } if(nState==SIZE_RESTORED) { InvalidateRect(hWnd,&rcDist,TRUE); } } /*====(LEADTOOLS_OnLButtonDown )============================================== Description: check the mouse position if it within any of the two images and set the mouse move & image move to TRUE. Syntax : static VOID LEADTOOLS_OnLButtonDown (HWND hWnd, BOOL fDoubleClick, L_INT x, L_INT y, UINT keyFlags) Parameters : hWnd Handle to a window. x Mouse down x position. y Mouse down y position. fDoubleClick Not used. keyFlags Not used. Return Value: None. ==========================================================================*/ static VOID LEADTOOLS_OnLButtonDown (HWND hWnd, BOOL fDoubleClick, L_INT x, L_INT y,UINT keyFlags) { pData->MouseYStart=y; pData->MouseXStart=x; pData->MouseButtonUp=FALSE; pData->MouseButtonDown=TRUE; SetCapture(hWnd); if(pData->MouseEnabled) { if(pData->UpImage==2) { if (((xClientView(pData->MouseXStart)>=pData->Xloc2)&&(xClientView(pData->MouseXStart)<=pData->Xloc2+(TmpBitmap2.Width))) &&((yClientView(pData->MouseYStart)>=pData->Yloc2)&&(yClientView(pData->MouseYStart)<=pData->Yloc2+(TmpBitmap2.Height)))) { SetCursor (pData->hHandCursor); ShowCursor(TRUE); pData->MoveImage2=TRUE; pData->MoveImage1=FALSE; L_FillBitmap(&Bitmap,pData->newbkColor ); L_CombineBitmap(&Bitmap, pData->Xloc1, pData->Yloc1, BITMAPWIDTH(&TmpBitmap1), BITMAPHEIGHT(&TmpBitmap1), &TmpBitmap1,0 ,0 , CB_DST_0 | CB_OP_OR); L_CombineBitmap(&Bitmap, pData->Xloc2, pData->Yloc2,BITMAPWIDTH(&TmpBitmap2), BITMAPHEIGHT(&TmpBitmap2), &TmpBitmap2,0 ,0 , CB_DST_0 | CB_OP_OR); InvalidateRect(hWnd,NULL,FALSE); UpdateWindow(hWnd); pData->UpImage=2; } else if (((xClientView(pData->MouseXStart)>=pData->Xloc1) &&(xClientView(pData->MouseXStart)<=pData->Xloc1+TmpBitmap1.Width)) &&((yClientView(pData->MouseYStart)>=pData->Yloc1) &&(yClientView(pData->MouseYStart)<=pData->Yloc1+TmpBitmap1.Height))) { SetCursor (pData->hHandCursor); pData->MoveImage1=TRUE; pData->MoveImage2=FALSE; L_FillBitmap(&Bitmap,pData->newbkColor ); L_CombineBitmap(&Bitmap, pData->Xloc2, pData->Yloc2,BITMAPWIDTH(&TmpBitmap2), BITMAPHEIGHT(&TmpBitmap2), &TmpBitmap2,0 ,0 , CB_DST_0 | CB_OP_OR); L_CombineBitmap(&Bitmap, pData->Xloc1, pData->Yloc1, BITMAPWIDTH(&TmpBitmap1), BITMAPHEIGHT(&TmpBitmap1), &TmpBitmap1,0 ,0 , CB_DST_0 | CB_OP_OR); InvalidateRect(hWnd,NULL,FALSE); UpdateWindow(hWnd); pData->UpImage=1; } else { pData->MoveImage1=FALSE; pData->MoveImage2=FALSE; } } else { if (((xClientView(pData->MouseXStart)>=pData->Xloc1) &&(xClientView(pData->MouseXStart)<=pData->Xloc1+TmpBitmap1.Width)) &&((yClientView(pData->MouseYStart)>=pData->Yloc1) &&(yClientView(pData->MouseYStart)<=pData->Yloc1+TmpBitmap1.Height))) { SetCursor (pData->hHandCursor); pData->MoveImage1=TRUE; pData->MoveImage2=FALSE; L_FillBitmap(&Bitmap,pData->newbkColor ); L_CombineBitmap(&Bitmap, pData->Xloc2, pData->Yloc2,BITMAPWIDTH(&TmpBitmap2), BITMAPHEIGHT(&TmpBitmap2), &TmpBitmap2,0 ,0 , CB_DST_0 | CB_OP_OR); L_CombineBitmap(&Bitmap, pData->Xloc1, pData->Yloc1, BITMAPWIDTH(&TmpBitmap1), BITMAPHEIGHT(&TmpBitmap1), &TmpBitmap1,0 ,0 , CB_DST_0 | CB_OP_OR); InvalidateRect(hWnd,NULL,FALSE); UpdateWindow(hWnd); pData->UpImage=1; } else if (((xClientView(pData->MouseXStart)>=pData->Xloc2) &&(xClientView(pData->MouseXStart)<=pData->Xloc2+(TmpBitmap2.Width))) &&((yClientView(pData->MouseYStart)>=pData->Yloc2) &&(yClientView(pData->MouseYStart)<=pData->Yloc2+TmpBitmap2.Height))) { SetCursor (pData->hHandCursor); pData->MoveImage2=TRUE; pData->MoveImage1=FALSE; L_FillBitmap(&Bitmap,pData->newbkColor ); L_CombineBitmap(&Bitmap, pData->Xloc1, pData->Yloc1, BITMAPWIDTH(&TmpBitmap1), BITMAPHEIGHT(&TmpBitmap1), &TmpBitmap1,0 ,0 , CB_DST_0 | CB_OP_OR); L_CombineBitmap(&Bitmap, pData->Xloc2, pData->Yloc2,BITMAPWIDTH(&TmpBitmap2), BITMAPHEIGHT(&TmpBitmap2), &TmpBitmap2,0 ,0 , CB_DST_0 | CB_OP_OR); InvalidateRect(hWnd,NULL,FALSE); UpdateWindow(hWnd); pData->UpImage=2; } else { pData->MoveImage1=FALSE; pData->MoveImage2=FALSE; } }//if(UpImage==2) }//if (MouseEnabled) } /*====(LEADTOOLS_OnMouseMove )============================================== Description: check the images moving flages , and moving the image if the flages are sets to TRUE. Syntax : static VOID LEADTOOLS_OnMouseMove (HWND hWnd, L_INT x, L_INT y, UINT keyFlags) Parameters : hWnd Handle to a window. x Mouse down x position. y Mouse down y position. keyFlags Not used. Return Value: None. ==========================================================================*/ static VOID LEADTOOLS_OnMouseMove (HWND hWnd, L_INT x, L_INT y, UINT keyFlags) { RECT Rect; L_INT Width , Height; GetClientRect(hWnd,&Rect); if(pData->NormalSize) { Width =Rect.right; Height=Rect.bottom; } else { Width =pData->MainWidth; Height=pData->MainHight; } if((x > 0) && (y > 0) && (x < (Width*pData->WFactor)) && (y < (Height*pData->WFactor))) { if(pData->MoveImage1) { SetCursor (pData->hHandCursor); pData->MouseYCurnt=y; pData->MouseXCurnt=x; pData->Xloc1-=(xClientView(pData->MouseXStart)-xClientView(pData->MouseXCurnt)); pData->Yloc1-=(yClientView(pData->MouseYStart)-yClientView(pData->MouseYCurnt)); pData->MouseYStart=pData->MouseYCurnt; pData->MouseXStart=pData->MouseXCurnt; L_FillBitmap(&Bitmap,pData->newbkColor ); L_CombineBitmap(&Bitmap, pData->Xloc2, pData->Yloc2,BITMAPWIDTH(&TmpBitmap2), BITMAPHEIGHT(&TmpBitmap2), &TmpBitmap2,0 ,0 , CB_DST_0 | CB_OP_OR); L_CombineBitmap(&Bitmap, pData->Xloc1, pData->Yloc1, BITMAPWIDTH(&TmpBitmap1), BITMAPHEIGHT(&TmpBitmap1), &TmpBitmap1,0 ,0 , CB_DST_0 | CB_OP_OR); InvalidateRect(hWnd,NULL,FALSE); UpdateWindow(hWnd); SetCursor (pData->hHandCursor); } else if(pData->MoveImage2) { SetCursor (pData->hHandCursor); pData->MouseYCurnt=y; pData->MouseXCurnt=x; pData->Xloc2-=(xClientView(pData->MouseXStart)-xClientView(pData->MouseXCurnt)); pData->Yloc2-=(yClientView(pData->MouseYStart)-yClientView(pData->MouseYCurnt)); pData->MouseYStart=pData->MouseYCurnt; pData->MouseXStart=pData->MouseXCurnt; L_FillBitmap(&Bitmap,pData->newbkColor ); L_CombineBitmap(&Bitmap, pData->Xloc1, pData->Yloc1, BITMAPWIDTH(&TmpBitmap1), BITMAPHEIGHT(&TmpBitmap1), &TmpBitmap1,0 ,0 , CB_DST_0 | CB_OP_OR); L_CombineBitmap(&Bitmap, pData->Xloc2, pData->Yloc2, BITMAPWIDTH(&TmpBitmap2), BITMAPHEIGHT(&TmpBitmap2), &TmpBitmap2,0 ,0 , CB_DST_0 | CB_OP_OR); InvalidateRect(hWnd,NULL,FALSE); UpdateWindow(hWnd); SetCursor (pData->hHandCursor); } } else { pData->MouseButtonUp=TRUE; pData->MouseButtonDown=FALSE; pData->MoveImage1=FALSE; pData->MoveImage2=FALSE; pData->MouseYStart=-10000; pData->MouseXStart=-10000; ReleaseCapture(); } } /*====(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=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; SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); } else { pData->Yloc+=pData->VScrollPos; pData->VScrollPos=0; SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); } 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; } GetClientRect(hWnd,&rect); RECT rcInvalid; SetScrollPos(hWnd,SB_VERT,pData->VScrollPos,TRUE); ScrollWindowEx(hWnd,0,(VOldPos - pData->VScrollPos),&rect,NULL,NULL,&rcInvalid,SW_INVALIDATE); 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; } 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); } /*====(CreateMainImage)============================================== Description: Create the main image form two images Syntax : L_VOID CreateMainImage(HWND hWnd) Parameters : hWnd Handle to a window. pPalette Pointer to a palette array that contains the common palette. (Used only if one of the bitmaps is less than 8PP). Return Value: None. ==========================================================================*/ L_VOID CreateMainImage(HWND hWnd, LPRGBQUAD pPalette) { int nRet ; pData->HFactor=1; pData->WFactor=1; pData->NormalSize=TRUE; pData->MainWidth=TmpBitmap1.Width + TmpBitmap2.Width; pData->MainHight=TmpBitmap1.Height + TmpBitmap2.Height; pData->MouseEnabled=TRUE; /////////////////////////////////////////////// // Create a big temp bitmap contain the first// // image and 2nd image // /////////////////////////////////////////////// if((pData->BitPerPixel!=12)&&(pData->BitPerPixel!=16)) nRet = L_CreateBitmap(&Bitmap,sizeof(BITMAPHANDLE), TYPE_CONV, pData->MainWidth, pData->MainHight, pData->BitPerPixel, ORDER_BGR, (pData->BitPerPixel <= 8) ? pPalette : NULL, TOP_LEFT, NULL, NULL); else L_CreateBitmap(&Bitmap,sizeof(BITMAPHANDLE), TYPE_CONV, pData->MainWidth, pData->MainHight, 16, ORDER_BGR, (pData->BitPerPixel <= 8) ? pPalette : NULL, TOP_LEFT, NULL, NULL); L_FillBitmap(&Bitmap,pData->newbkColor ); //Insert First Image /////////////////////////////////////////////// //Calculate the Initiale Position For the 1st// //Image and 2nd Image // /////////////////////////////////////////////// pData->Xloc1=1; pData->Xloc2=TmpBitmap1.Width; pData->Yloc2=TmpBitmap1.Height; pData->Yloc1=1; Stitch(&Bitmap,&TmpBitmap1,pData->Xloc1,pData->Yloc1); //Insert 2nd Image Stitch(&Bitmap,&TmpBitmap2,pData->Xloc2,pData->Yloc2); pData->Xloc=1; pData->Yloc=1; RECT rc; GetClientRect(hWnd,&rc); pData->VMaxPos=((TmpBitmap1.Height+TmpBitmap2.Height)-rc.bottom); pData->HMaxPos=((TmpBitmap1.Width+TmpBitmap2.Width)-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); ENABLEMENUITEM(pData->hMenu, ID_SAVING, TRUE); ENABLEMENUITEM(pData->hMenu, ID_FITTOWINDOW, TRUE); ENABLEMENUITEM(pData->hMenu, ID_STITCH, TRUE); ENABLEMENUITEM(pData->hMenu, ID_NORMAL, TRUE); ENABLEMENUITEM(pData->hMenu, ID_BKCOLOR, TRUE); CHECKMENUITEM(pData->hMenu, ID_FITTOWINDOW, FALSE); CHECKMENUITEM(pData->hMenu, ID_NORMAL, TRUE); InvalidateRect(hWnd,&rc,TRUE); // simulate a WM_QUERYNEWPALETTE so the paint palette is created LEADTOOLS_OnQueryNewPalette(hWnd); } /*====(SetImageBKColor)============================================== Description: Change the bitmap background Syntax : L_VOID SetImageBKColor(HWND hWnd) Parameters : hWnd Handle to a window. Return Value: None. ==========================================================================*/ L_VOID SetImageBKColor(HWND hWnd) { pData->newbkColor=GetUserColor(pData->oldbkColor); pData->oldbkColor=pData->newbkColor; if (pData->MouseEnabled) { L_FillBitmap(&Bitmap,pData->newbkColor ); if(pData->UpImage==2) { //Insert First Image Stitch(&Bitmap,&TmpBitmap1,pData->Xloc1,pData->Yloc1); //Insert 2nd Image Stitch(&Bitmap,&TmpBitmap2,pData->Xloc2,pData->Yloc2); } else { //Insert 2nd Image Stitch(&Bitmap,&TmpBitmap2,pData->Xloc2,pData->Yloc2); //Insert First Image Stitch(&Bitmap,&TmpBitmap1,pData->Xloc1,pData->Yloc1); } } InvalidateRect(hWnd,NULL,TRUE); } /*====(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) { RECT rcDist; GetClientRect(hWnd,&rcDist); pData->NormalSize=TRUE; pData->HFactor = 1; pData->WFactor = 1; pData->Xloc = 1; pData->Yloc = 1; RECT rc; GetClientRect(hWnd,&rc); pData->VMaxPos=((TmpBitmap1.Height+TmpBitmap2.Height)-rc.bottom); pData->HMaxPos=((TmpBitmap1.Width+TmpBitmap2.Width)-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); CHECKMENUITEM(pData->hMenu, ID_FITTOWINDOW, FALSE); CHECKMENUITEM(pData->hMenu, ID_NORMAL, TRUE); InvalidateRect(hWnd,&rcDist,TRUE); } } /*====(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) { RECT rcDist; GetClientRect(hWnd,&rcDist); L_DOUBLE TmpV1; pData->ImageWidth=Bitmap.Width; pData->ImageHeight=Bitmap.Height; if(((double)rcDist.bottom/(double)pData->ImageHeight)<((double)rcDist.right/(double)pData->ImageWidth)) TmpV1= (double)rcDist.bottom/(double)pData->ImageHeight; else TmpV1= (double)rcDist.right/(double)pData->ImageWidth; pData->WFactor=TmpV1; pData->HFactor=TmpV1; pData->NormalSize=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, ID_FITTOWINDOW, TRUE); CHECKMENUITEM(pData->hMenu, ID_NORMAL, FALSE); InvalidateRect(hWnd,&rcDist,FALSE); } } /*====(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); } /*====(MakeFinalImage)============================================== Description: Create the finale image afterselect stitch from the menu item Syntax : L_VOID MakeFinalImage(HWND hWnd) Parameters : hWnd Handle to window. Return Value: None. ==========================================================================*/ L_VOID MakeFinalImage(HWND hWnd) { if (pData->MouseEnabled) { RGBQUAD Palette[256]; //Palette for the final image // Calculate Starting & End Point For The Image // X Axis pData->StartPointX=(pData->Xloc1>pData->Xloc2)? pData->Xloc2:pData->Xloc1; pData->StartPointX=(pData->StartPointX<1)? 1:pData->StartPointX; pData->EndPointX= ((pData->Xloc1+TmpBitmap1.Width)>(pData->Xloc2+TmpBitmap2.Width))? (pData->Xloc1+TmpBitmap1.Width) :(pData->Xloc2+TmpBitmap2.Width); pData->EndPointX=(pData->EndPointX>pData->MainWidth)? pData->MainWidth:pData->EndPointX; //Recalculate First Image & Secand Image Location //in the final image (X Axis) pData->Xloc1-=pData->StartPointX; pData->Xloc2-=pData->StartPointX; // Y Axis pData->StartPointY=(pData->Yloc1>pData->Yloc2)? pData->Yloc2:pData->Yloc1; pData->StartPointY=(pData->StartPointY<1)? 1:pData->StartPointY; pData->EndPointY=((pData->Yloc1+TmpBitmap1.Height)> (pData->Yloc2+TmpBitmap2.Height))? (pData->Yloc1+TmpBitmap1.Height) :(pData->Yloc2+TmpBitmap2.Height); pData->EndPointY=(pData->EndPointY>pData->MainHight)? pData->MainHight:pData->EndPointY; //Recalculate First Image & Secand Image Location //in the final image (Y Axis) pData->Yloc1=pData->Yloc1-pData->StartPointY; pData->Yloc2=pData->Yloc2-pData->StartPointY; // Calculate Final Image Height & Width pData->ImageWidth=pData->EndPointX-pData->StartPointX; pData->ImageHeight=pData->EndPointY-pData->StartPointY; //Create the final image and Fill It with the BKCOLOR L_UINT32 dwColors1,dwColors2; L_GetBitmapColorCount(&TmpBitmap1, &dwColors1); L_GetBitmapColorCount(&TmpBitmap2, &dwColors2); if(dwColors1>dwColors2) L_GetBitmapColors(&TmpBitmap1, 0, (int) pow((double)2,(double)TmpBitmap2.BitsPerPixel), Palette); else L_GetBitmapColors(&TmpBitmap2, 0,(int) pow((double)2,(double)TmpBitmap2.BitsPerPixel), Palette); if((pData->BitPerPixel!=12)&&(pData->BitPerPixel!=16)) L_CreateBitmap(&Bitmap, sizeof(BITMAPHANDLE), TYPE_CONV , pData->ImageWidth, pData->ImageHeight, pData->BitPerPixel, ORDER_BGR, (pData->BitPerPixel <= 8) ? Palette : NULL, TOP_LEFT, NULL, NULL); else L_CreateBitmap(&Bitmap,sizeof(BITMAPHANDLE), TYPE_CONV , pData->ImageWidth, pData->ImageHeight, 16, ORDER_BGR, (pData->BitPerPixel <= 8) ? Palette : NULL, TOP_LEFT, NULL, NULL); L_FillBitmap(&Bitmap,pData->newbkColor ); if(pData->UpImage==2) { //Insert First Image Stitch(&Bitmap,&TmpBitmap1,pData->Xloc1,pData->Yloc1); //Insert 2nd Image Stitch(&Bitmap,&TmpBitmap2,pData->Xloc2,pData->Yloc2); } else { //Insert 2nd Image Stitch(&Bitmap,&TmpBitmap2,pData->Xloc2,pData->Yloc2); //Insert First Image Stitch(&Bitmap,&TmpBitmap1,pData->Xloc1,pData->Yloc1); } pData->Xloc=1; pData->Yloc=1; RECT rc; GetClientRect(hWnd,&rc); if(pData->NormalSize) { pData->VMaxPos=((Bitmap.Height-rc.bottom)>=0)? (Bitmap.Height-rc.bottom): 0; pData->HMaxPos=((Bitmap.Width-rc.right)>=0)? (Bitmap.Width-rc.right):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); L_FreeBitmap(&TmpBitmap1); L_FreeBitmap(&TmpBitmap2); pData->newbkColor=RGB(255,255,255); pData->oldbkColor=RGB(255,255,255); InvalidateRect(hWnd,NULL,TRUE); } else SetNormalView(hWnd); pData->MouseEnabled=FALSE; pData->MouseButtonUp=TRUE; pData->MouseButtonDown=FALSE; pData->MoveImage1=FALSE; pData->MoveImage2=FALSE; pData->MouseYStart=-1; pData->MouseXStart=-1; } } /*---[LEADTOOLS_OnActivate]----------------------------------------------------- Syntax: static VOID LEADTOOLS_OnActivate( HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized) Parameters: hWnd Window handle. state WA_ACTIVE | WA_CLICKACTIVE | WA_INACTIVE hwndActDeact the winodw habdle that deactivate fMinimized Window is minimized Prototype: Color.h Notes: This procedure is responsible for handling WM_ACTIVATE. --------------------------------------------------------------------------*/ static VOID LEADTOOLS_OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized) { RECT rect; if(state!=WA_INACTIVE) LEADTOOLS_OnQueryNewPalette (hwnd); GetClientRect(hwnd,&rect); InvalidateRect(hwnd,&rect,FALSE); } /*====(Window_OnPaletteChanging)========================================== Description: Enumerates all child windows and asks them to realize their logical palettes beside the physical palette. Syntax : static 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. ==========================================================================*/ static VOID LEADTOOLS_OnPaletteChanging(HWND hWnd, HWND hWndPaletteChange) { LEADTOOLS_OnPaletteChanged (hWnd, hWndPaletteChange); } /*====(Window_SysColorChange)========================================== Syntax: static VOID Window_SysColorChange( HWND hWnd ) Parameters: hWnd Handle to a window. Prototype: Loadsave.h Notes: This procedure is responsible for handling WM_SYSCOLORCHANGE. --------------------------------------------------------------------------*/ static VOID LEADTOOLS_SysColorChange(HWND hwnd) { 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;//HGDIOBJ HRGN hClientRgn, hFillRgn; RECT rcView, rcClient,Tmprc; hBrush = GETHBRBACKGROUND (hWnd); GetClientRect (hWnd, &rcClient); GetUpdateRect(hWnd, &rcView,0); SetRect(&Tmprc,1,1,(L_INT)(BITMAPWIDTH(&Bitmap)*pData->WFactor)+1,(L_INT)(BITMAPHEIGHT(&Bitmap)*pData->HFactor)+1); IntersectRect (&rcView, &Tmprc, &rcClient); hClientRgn = CreateRectRgnIndirect (&rcClient); hFillRgn = CreateRectRgnIndirect (&rcView); CombineRgn (hFillRgn, hClientRgn, hFillRgn, RGN_DIFF); FillRgn (hDC, hFillRgn, hBrush); if(pData->MoveImage1||pData->MoveImage2) SetCursor (pData->hHandCursor); DeleteObject (hFillRgn); DeleteObject (hClientRgn); return(TRUE); } /*====(ShowOpenFiles)============================================== Description: Show Open Files Dailog Syntax : L_INT ShowOpenFiles(HWND hWnd, HWND hwndCtl) Parameters : hWnd Handle to window. hDC Handle to the device context. Return Value: Returned Value From OpenFileDlgProc. ==========================================================================*/ L_INT ShowOpenFiles(HWND hWnd,HWND hwndCtl) { DLGPROC pfn; L_INT nRet; pfn = (DLGPROC) MakeProcInstance((FARPROC) OpenFileDlgProc, pData->hIns); nRet = DialogBoxParam (pData->hIns, MAKEINTRESOURCE (IDD_OPENFILESDLG), hWnd, pfn,(LPARAM) hwndCtl); FreeProcInstance((FARPROC) pfn); return nRet; } /*====(OpenFileDlgProc)============================================== Description: Callback function to process all message dispatsh form Open Files Dailog Syntax : L_INT CALLBACK OpenFileDlgProc(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: 1 If Ok Pressed , 0 if Else. ==========================================================================*/ L_INT CALLBACK OpenFileDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) { HICON m_hIcon; switch(message) { case WM_INITDIALOG: m_hIcon = (HICON) LoadImage( pData->hIns, MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); SendMessage(hDlg,WM_SETICON, ICON_SMALL, (LPARAM) m_hIcon); return 1; case WM_PAINT: PAINTSTRUCT ps; HDC hDc; hDc = BeginPaint (hDlg, &ps); if(pData->FileOneLoaded&&pData->FileTwoLoaded) EnableWindow(GetDlgItem(hDlg,IDOK),TRUE); else EnableWindow(GetDlgItem(hDlg,IDOK),FALSE); EndPaint (hDlg, &ps); return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_SELECTFIRSTFILE: GetOpenFile(hDlg, TEXT("Select First File"), IDC_FIRSTFILE); return 1; case IDC_SELECTSECONDFILE: GetOpenFile(hDlg, TEXT("Select Second File"), IDC_SECONDFILE); return 1; case IDOK: L_CopyBitmap(&TmpBitmap1, &TmpBitmap3,sizeof(BITMAPHANDLE)); L_CopyBitmap(&TmpBitmap2, &TmpBitmap4,sizeof(BITMAPHANDLE)); L_FreeBitmap(&TmpBitmap3); L_FreeBitmap(&TmpBitmap4); pData->FileOneLoaded=FALSE; pData->FileTwoLoaded=FALSE; EndDialog(hDlg,1); return 1; case IDCANCEL: L_FreeBitmap(&TmpBitmap3); L_FreeBitmap(&TmpBitmap4); pData->FileOneLoaded=FALSE; pData->FileTwoLoaded=FALSE; EndDialog(hDlg,0); return 1; } } return 0; } 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; } } /*====(GetOpenFile)============================================== Description: Show Open File Dailog For The First File Syntax : L_VOID GetOpenFile(HWND hDlg) Parameters : hDlg Handle to a Dlgbox. Return Value: None. ==========================================================================*/ L_VOID GetOpenFile(HWND hDlg,TCHAR * pszCaption ,int nFileID) { static OPENDLGPARAMS FOParm; static OPENFILENAME OpenFileName; FILEINFO FileInfo; L_INT nRet; _fmemset(&FOParm, 0, sizeof(OPENDLGPARAMS)); FOParm.uStructSize = sizeof(OPENDLGPARAMS); FOParm.bShowLoadOptions = FALSE ; FOParm.bPreviewEnabled = TRUE; FOParm.uDlgFlags = DLG_OPEN_SHOW_PREVIEW | DLG_OPEN_SHOW_FILEINFO; OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.hwndOwner = hDlg; OpenFileName.lpstrFilter = NULL; OpenFileName.lpstrCustomFilter = NULL; OpenFileName.nMaxCustFilter = 0; OpenFileName.nFilterIndex = 1; OpenFileName.lpstrInitialDir = NULL; OpenFileName.lpstrTitle = pszCaption; OpenFileName.lpstrDefExt = NULL; OpenFileName.Flags = 0; nRet = L_DlgOpen( hDlg, &OpenFileName, &FOParm); if(nRet == SUCCESS_DLG_OK) { LOADFILEOPTION LoadFileOption; L_GetDefaultLoadFileOption(&LoadFileOption, sizeof(LOADFILEOPTION)); LoadFileOption.PageNumber = 1; L_FileInfo(FOParm.pFileData[ 0 ].szFileName,&FileInfo,sizeof(FILEINFO),0,NULL); if((FileInfo.Order!=0)&&(FileInfo.Order!=1)) { nRet=L_LoadBitmap (FOParm.pFileData[ 0 ].szFileName, ( nFileID==IDC_FIRSTFILE)?&TmpBitmap3:&TmpBitmap4, sizeof(BITMAPHANDLE),0,FileInfo.Order, &LoadFileOption, NULL); } else { nRet=L_LoadBitmap (FOParm.pFileData[ 0 ].szFileName, ( nFileID==IDC_FIRSTFILE)?&TmpBitmap3:&TmpBitmap4, sizeof(BITMAPHANDLE),0,ORDER_BGR /*FileInfo.Order*/, &LoadFileOption, NULL); } if(nRet!=SUCCESS) { SetDlgItemText(hDlg,IDC_FIRSTFILE,TEXT("Loading Failed ...")); pData->FileOneLoaded=FALSE; return ; } SetDlgItemText(hDlg,nFileID,FOParm.pFileData[ 0 ].szFileName); if( nFileID==IDC_FIRSTFILE) { pData->FileOneLoaded = TRUE; pData->FileInfo1 = FileInfo; } else { pData->FileTwoLoaded=TRUE; pData->FileInfo2 = FileInfo; } CleanOpenDlgParam(&FOParm); } } /*----(LEADTOOLS_OnQueryNewPalette)-------------------------------------------- Syntax: BOOL LEADTOOLS_OnQueryNewPalette( HWND hWnd ) Parameters: hWnd Handle to a window. 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 (pData->hPalette) { DeleteObject (pData->hPalette); pData->hPalette = NULL; } if (Bitmap.Flags.Allocated) { hDC = GetDC (hWnd); /* Generate a new logical palette (if needed) for painting. */ pData->hPalette = L_CreatePaintPalette (hDC, &Bitmap); if (pData->hPalette) /* Is a palette needed? */ { hPalette = SelectPalette (hDC, pData->hPalette, FALSE); nNoColors = RealizePalette (hDC); if(nNoColors) InvalidateRect (hWnd, NULL, FALSE); /* Restore the old palette. */ SelectPalette (hDC, hPalette, TRUE); } ReleaseDC (hWnd, hDC); } return (nNoColors); } /*----(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. 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 (pData->hPalette) { DeleteObject (pData->hPalette); pData->hPalette = NULL; } /* Does this window have a bitmap and a palette? */ if (Bitmap.Flags.Allocated) { hDC = GetDC (hWnd); /* Generate a new logical palette (if needed) for painting. */ pData->hPalette = L_CreatePaintPalette (hDC, &Bitmap); /* Select and Realize the palette. */ hPalette = SelectPalette (hDC, pData->hPalette, TRUE); RealizePalette (hDC); /* Force a repaint. */ InvalidateRect (hWnd, NULL, FALSE); /* Return the old palette. */ SelectPalette (hDC, hPalette, TRUE); ReleaseDC (hWnd, hDC); } return; }