#include "MultiAnn.h" #include "Leadtag.h" #include "resource.h" L_TCHAR szOpenFileFilter[] = { TEXT("TIF Files\0") TEXT("*.Tif\0")} ; HINSTANCE hInst; HWND hwndClient; HWND hwndFrame; HWND hwndToolBar; L_TCHAR szBitmapFile[_MAX_PATH]=TEXT(""); L_UINT32 uNextTag = 0; L_BOOL gbWangMode = FALSE; L_INT nAnnUserMode = IDS_DESIGNMODE ; FILESAVEFORMAT SaveFormat; LOADFILEOPTION LoadFileOption; SAVEFILEOPTION SaveFileOption; static L_VOID SaveBitmap( HWND hWnd ); static L_INT DoDialogBoxParam(L_INT nDialog, HWND hwnd, DLGPROC pfnDialog, LPARAM lParam); static L_VOID SetDefSaveParam ( L_VOID ) ; static L_VOID EnableDisableMenuItems ( HWND hwnd, LPCHILDDATA pData ) ; static L_VOID EnumerateSelectedObjects ( HWND hWnd, HANNOBJECT hContainer ); static L_INT CheckAnnEnumerate(HWND hWnd, HANNOBJECT hContainer ) ; static L_VOID CheckSaveFormat ( HMENU hMenu ) ; static L_VOID Child_OnNewPage ( HWND hwnd, LPCHILDDATA pData ) ; static L_INT GetHyperlink (HWND hWnd, HANNOBJECT hObject, LPCHILDDATA pData); L_INT PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, L_INT nCmdShow) { MSG msg; UNLOCKSUPPORT(); if (L_IsSupportLocked(L_SUPPORT_DOCUMENT)) { MessageBox(NULL, TEXT("Document/Medical Express Capability is Locked"), TEXT(""), MB_OK | MB_ICONWARNING); return 0; } // Enable v14.5 new annotation features L_AnnSetOptions(NULL, OPTIONS_NEW_ALL); L_GetDefaultLoadFileOption(&LoadFileOption, sizeof(LOADFILEOPTION)); L_GetDefaultSaveFileOption(&SaveFileOption, sizeof(SAVEFILEOPTION)); SetDefSaveParam ( ) ; hInst = hInstance; if (!hPrevInstance && !InitApplication ()) return (FALSE); if (!InitInstance (nCmdShow)) return (FALSE); L_DlgInit(DLG_INIT_COLOR); while (GetMessage (&msg, NULL, 0, 0)) { if (!TranslateMDISysAccel (hwndClient, &msg)) { TranslateMessage (&msg); DispatchMessage (&msg); } } L_DlgFree(); return(msg.wParam); } //........................................................................................ // // // //........................................................................................ BOOL InitApplication ( ) { WNDCLASS wndClass; L_BOOL fRegistered; wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = (WNDPROC) FrameWndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInst; wndClass.hIcon = LoadIcon (hInst, MAKEINTRESOURCE (IDI_MAIN)); wndClass.hCursor = LoadCursor (NULL, IDC_ARROW); wndClass.hbrBackground = GetStockObject (GRAY_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = SZ_FRAMECLASS; fRegistered = RegisterClass (&wndClass); if(!fRegistered) return(FALSE); wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wndClass.lpfnWndProc = (WNDPROC) ChildWndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 4; wndClass.hInstance = hInst; wndClass.hIcon = LoadIcon (hInst, MAKEINTRESOURCE (IDI_MAIN)); wndClass.hCursor = LoadCursor (NULL, IDC_ARROW); wndClass.hbrBackground = GetStockObject (GRAY_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = SZ_CHILDCLASS; fRegistered = RegisterClass (&wndClass); if(!fRegistered) return(FALSE); return(TRUE); } //........................................................................................ // // // //........................................................................................ BOOL InitInstance (L_INT nCmdShow) { L_GetDefaultLoadFileOption(&LoadFileOption, sizeof(LOADFILEOPTION)); L_GetDefaultSaveFileOption(&SaveFileOption, sizeof(SAVEFILEOPTION)); hwndFrame = CreateWindow (SZ_FRAMECLASS, TEXT("LEADTOOLS Multipage MultiAnnotation Demo"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, LoadMenu (hInst, MAKEINTRESOURCE (MENU_MAIN)), hInst, NULL); if (hwndFrame == NULL) return (FALSE); ShowWindow (hwndFrame, nCmdShow); UpdateWindow (hwndFrame); return (TRUE); } //........................................................................................ // // // //........................................................................................ static L_VOID ToolChecked( HWND hwnd, L_UINT uTool) { HWND hwndChild; LPCHILDDATA pData ; hwndChild = FORWARD_WM_MDIGETACTIVE(hwndClient, SendMessage); if(IsWindow(hwndChild)) { pData = (LPCHILDDATA) GetWindowLong ( hwndChild, GWL_USERDATA) ; L_AnnSetTool(pData -> hAutomation, uTool); } } //........................................................................................ // // // //........................................................................................ L_VOID SetDefSaveParam ( L_VOID ) { static FILESAVEFORMATBPP FileSaveFormatBpp[TIFFFORMATCOUNT]; SaveFormat.uStructSize = sizeof(SaveFormat); SaveFormat.nFormat = DLG_FF_SAVE_TIFF; SaveFormat.nBppCount = TIFFFORMATCOUNT; SaveFormat.pFileSaveFormatBpp = FileSaveFormatBpp; FileSaveFormatBpp[0].uStructSize = sizeof(SaveFormat); FileSaveFormatBpp[0].nFormatBpp = 1; FileSaveFormatBpp[0].uSubFormats = DLG_FF_SAVE_SUB_TIFF1_CCITT | DLG_FF_SAVE_SUB_TIFF1_CCITT_G3_1D | DLG_FF_SAVE_SUB_TIFF1_CCITT_G3_2D | DLG_FF_SAVE_SUB_TIFF1_CCITT_G4 | DLG_FF_SAVE_SUB_TIFF1_UNCOMPRESSEDRGB | DLG_FF_SAVE_SUB_TIFF1_RLERGB | DLG_FF_SAVE_SUB_TIFF1_LZWRGB ; FileSaveFormatBpp[1].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[1].nFormatBpp = 2; FileSaveFormatBpp[1].uSubFormats = DLG_FF_SAVE_SUB_TIFFOTHER_UNCOMPRESSED | DLG_FF_SAVE_SUB_TIFFOTHER_RLE | DLG_FF_SAVE_SUB_TIFFOTHER_LZW; FileSaveFormatBpp[2].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[2].nFormatBpp = 3; FileSaveFormatBpp[2].uSubFormats = DLG_FF_SAVE_SUB_TIFFOTHER_UNCOMPRESSED | DLG_FF_SAVE_SUB_TIFFOTHER_RLE | DLG_FF_SAVE_SUB_TIFFOTHER_LZW; FileSaveFormatBpp[3].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[3].nFormatBpp = 4; FileSaveFormatBpp[3].uSubFormats = DLG_FF_SAVE_SUB_TIFFOTHER_UNCOMPRESSED | DLG_FF_SAVE_SUB_TIFFOTHER_RLE | DLG_FF_SAVE_SUB_TIFFOTHER_LZW; FileSaveFormatBpp[4].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[4].nFormatBpp = 5; FileSaveFormatBpp[4].uSubFormats = DLG_FF_SAVE_SUB_TIFFOTHER_UNCOMPRESSED | DLG_FF_SAVE_SUB_TIFFOTHER_RLE | DLG_FF_SAVE_SUB_TIFFOTHER_LZW; FileSaveFormatBpp[5].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[5].nFormatBpp = 6; FileSaveFormatBpp[5].uSubFormats = DLG_FF_SAVE_SUB_TIFFOTHER_UNCOMPRESSED | DLG_FF_SAVE_SUB_TIFFOTHER_RLE | DLG_FF_SAVE_SUB_TIFFOTHER_LZW; FileSaveFormatBpp[6].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[6].nFormatBpp = 7; FileSaveFormatBpp[6].uSubFormats = DLG_FF_SAVE_SUB_TIFFOTHER_UNCOMPRESSED | DLG_FF_SAVE_SUB_TIFFOTHER_RLE | DLG_FF_SAVE_SUB_TIFFOTHER_LZW; FileSaveFormatBpp[7].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[7].nFormatBpp = 8; FileSaveFormatBpp[7].uSubFormats = DLG_FF_SAVE_SUB_TIFF8_UNCOMPRESSEDRGB| DLG_FF_SAVE_SUB_TIFF8_RLERGB | DLG_FF_SAVE_SUB_TIFF8_JPEG_GRAY_YCC | DLG_FF_SAVE_SUB_TIFF8_LOSSLESSJPEG | DLG_FF_SAVE_SUB_TIFF8_LZWRGB ; FileSaveFormatBpp[8].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[8].nFormatBpp = 12; FileSaveFormatBpp[8].uSubFormats = DLG_FF_SAVE_SUB_TIFF12_UNCOMPRESSED | DLG_FF_SAVE_SUB_TIFF12_LOSSLESSJPEG | DLG_FF_SAVE_SUB_TIFF12_JPEG_GRAY_YCC | DLG_FF_SAVE_SUB_TIFF12_LZW ; FileSaveFormatBpp[9].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[9].nFormatBpp = 16; FileSaveFormatBpp[9].uSubFormats = DLG_FF_SAVE_SUB_TIFF16_UNCOMPRESSED | DLG_FF_SAVE_SUB_TIFF16_RLE | DLG_FF_SAVE_SUB_TIFF16_LOSSLESSJPEG | DLG_FF_SAVE_SUB_TIFF16_LZW ; FileSaveFormatBpp[10].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[10].nFormatBpp = 24; FileSaveFormatBpp[10].uSubFormats = DLG_FF_SAVE_SUB_TIFF24_UNCOMPRESSEDRGB | DLG_FF_SAVE_SUB_TIFF24_UNCOMPRESSEDCMYK| DLG_FF_SAVE_SUB_TIFF24_UNCOMPRESSEDYCC | DLG_FF_SAVE_SUB_TIFF24_RLERGB | DLG_FF_SAVE_SUB_TIFF24_RLECMYK | DLG_FF_SAVE_SUB_TIFF24_RLEYCC | DLG_FF_SAVE_SUB_TIFF24_JPEG_YCC_444 | DLG_FF_SAVE_SUB_TIFF24_JPEG_YCC_422 | DLG_FF_SAVE_SUB_TIFF24_JPEG_YCC_411 | DLG_FF_SAVE_SUB_TIFF24_LOSSLESSJPEG | DLG_FF_SAVE_SUB_TIFF24_LZWRGB | DLG_FF_SAVE_SUB_TIFF24_LZWCMYK | DLG_FF_SAVE_SUB_TIFF24_LZWYCC; FileSaveFormatBpp[11].uSubFormats = sizeof(FileSaveFormatBpp);; FileSaveFormatBpp[11].nFormatBpp = 32; FileSaveFormatBpp [11].uSubFormats = DLG_FF_SAVE_SUB_TIFF32_UNCOMPRESSEDRGB | DLG_FF_SAVE_SUB_TIFF32_UNCOMPRESSEDCMYK | DLG_FF_SAVE_SUB_TIFF32_RLERGB | DLG_FF_SAVE_SUB_TIFF32_RLECMYK | DLG_FF_SAVE_SUB_TIFF32_LZWRGB | DLG_FF_SAVE_SUB_TIFF32_LZWCMYK ; FileSaveFormatBpp[12].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[12].nFormatBpp = 48; FileSaveFormatBpp[12].uSubFormats = DLG_FF_SAVE_SUB_TIFF48_UNCOMPRESSEDRGB | DLG_FF_SAVE_SUB_TIFF48_LZWRGB ; FileSaveFormatBpp[13].uStructSize = sizeof(FileSaveFormatBpp); FileSaveFormatBpp[13].nFormatBpp = 64; FileSaveFormatBpp[13].uSubFormats = DLG_FF_SAVE_SUB_TIFF64_UNCOMPRESSEDRGB | DLG_FF_SAVE_SUB_TIFF64_LZWRGB ; return ; } //........................................................................................ // // // //........................................................................................ #define ISTIF(nFormat) \ ((nFormat) == FILE_JTIF || \ (nFormat) == FILE_LEAD2JTIF || \ (nFormat) == FILE_LEAD1JTIF || \ (nFormat) == FILE_TIFLZW || \ (nFormat) == FILE_TIFLZW_CMYK || \ (nFormat) == FILE_TIFLZW_YCC || \ (nFormat) == FILE_TIF || \ (nFormat) == FILE_TIF_CMYK || \ (nFormat) == FILE_TIF_YCC || \ (nFormat) == FILE_TIF_PACKBITS || \ (nFormat) == FILE_TIF_PACKBITS_CMYK ||\ (nFormat) == FILE_TIF_PACKBITS_YCC || \ (nFormat) == FILE_CCITT || \ (nFormat) == FILE_CCITT_GROUP3_1DIM ||\ (nFormat) == FILE_CCITT_GROUP3_2DIM ||\ (nFormat) == FILE_CCITT_GROUP4) //........................................................................................ // // // //........................................................................................ L_BOOL IsAnnInLeadTag ( L_TCHAR FAR * pszFileName, L_UINT nPage, L_INT nFormat) { L_UINT16 uType; L_UINT32 uCount; LoadFileOption.PageNumber = nPage ; if(nFormat < 0 && L_ReadFileTag(pszFileName, ANNTAG_TIFF, &uType, &uCount, NULL, &LoadFileOption) > 0 || ISTIF(nFormat)) { return FALSE ; // the anotations are saved in wang compatible mode . } else { return TRUE ; // the anotations are saved in Lead mode . } } 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; } } //........................................................................................ // // // //........................................................................................ static OPENFILENAME OpenFileName; static OPENDLGPARAMS FOParm; L_BOOL GetFileName(HWND hwnd, LPTSTR pszTitle, LPTSTR pszFilter, LPTSTR pszFile, L_INT *pnPageNumber) { L_INT nRet; memset(&FOParm,0,sizeof(FOParm)); FOParm.uStructSize = sizeof(FOParm); FOParm.uDlgFlags = DLG_OPEN_SHOW_PREVIEW | DLG_OPEN_SHOW_MULTIPAGE | DLG_OPEN_SHOW_DELPAGE | DLG_OPEN_SHOW_LOADOPTIONS; FOParm.bPreviewEnabled = TRUE; OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.lpstrFilter = pszFilter; OpenFileName.lpstrCustomFilter = NULL; OpenFileName.nMaxCustFilter = 0; OpenFileName.nFilterIndex = 0; OpenFileName.lpstrInitialDir = NULL; OpenFileName.lpstrTitle = TEXT("Open a File"); OpenFileName.nFileOffset = 0; OpenFileName.nFileExtension = 0; OpenFileName.lpstrDefExt = NULL; OpenFileName.Flags = 0; nRet = L_DlgOpen( hwnd,&OpenFileName,&FOParm); if (nRet == SUCCESS_DLG_OK) { _tcscpy(pszFile,FOParm.pFileData[0].szFileName); if (pnPageNumber) *pnPageNumber = FOParm.pFileData->nPageNumber; CleanOpenDlgParam(&FOParm); return(TRUE); } else return(FALSE); } //........................................................................................ // // // //........................................................................................ static L_BOOL ConvertToBitmap(LPBITMAPINFO pbm, pBITMAPHANDLE pBitmap) { L_CHAR L_FAR*pBits; L_INT nPaletteEntries; if(!pbm) return FALSE; if(pbm->bmiHeader.biBitCount <= 8) nPaletteEntries = (L_INT)(pbm->bmiHeader.biClrUsed ? pbm->bmiHeader.biClrUsed : (1 << pbm->bmiHeader.biBitCount) ); else #ifdef WIN32 nPaletteEntries = (pbm->bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0; #else nPaletteEntries = 0; #endif pBits = (L_CHAR L_FAR*)(&pbm->bmiColors[nPaletteEntries]); return (L_ConvertFromDIB(pBitmap, sizeof(BITMAPHANDLE),pbm, pBits) == SUCCESS); } //........................................................................................ // // // //........................................................................................ static L_BOOL LoadAsBitmap (HINSTANCE hInstance, LPCTSTR pszName, pBITMAPHANDLE pBitmap) { HRSRC hrsrc; HGLOBAL hdib; L_BOOL bRet; L_InitBitmap(pBitmap, sizeof(BITMAPHANDLE),1, 1, 1); hrsrc = FindResource(hInstance, pszName, RT_BITMAP); if(!hrsrc) return FALSE; hdib = LoadResource(hInstance, hrsrc); if(!hdib) return FALSE; bRet = ConvertToBitmap((LPBITMAPINFO)LockResource(hdib), pBitmap); FreeResource(hdib); return bRet; } //........................................................................................ // // // //........................................................................................ static HWND MyCreateToolBar(HWND hwnd) { L_UINT uButtons; pANNBUTTON pButtons; BITMAPHANDLE UserToolBitmap; // create a toolbar identical to the default toolbar, except that it adds a user defined button // create the window hidden, since I want to modify its buttons if(L_AnnCreateToolBar(hwnd, NULL, ANNTOOLALIGN_RIGHT | ANNTOOLALIGN_TOP, FALSE, &hwnd, 0, NULL) != SUCCESS) return NULL; if(L_AnnGetToolBarButtons(hwnd, NULL,0, &uButtons) == SUCCESS) { pButtons = (pANNBUTTON)GlobalAllocPtr(GMEM_MOVEABLE, (uButtons+1) * sizeof(ANNBUTTON)); if(pButtons && L_AnnGetToolBarButtons(hwnd, pButtons,sizeof(*pButtons), &uButtons) == SUCCESS) { if(LoadAsBitmap(hInst, MAKEINTRESOURCE(IDB_USERBTN), &UserToolBitmap)) { pButtons[uButtons].uFlags = 0; // I will pass the string and there is only one tool pButtons[uButtons].uTool = ANNTOOL_USER; // make sure the bitmap is TOOLBARIMAGECX x TOOLBARIMAGECY L_SizeBitmap(&UserToolBitmap, TOOLBARIMAGECX, TOOLBARIMAGECY, 0); pButtons[uButtons].pBitmapUp = pButtons[uButtons].pBitmapDown = &UserToolBitmap; #ifdef WIN32 pButtons[uButtons].nToolTipTextID = -1; pButtons[uButtons].pToolTipText = TEXT("User defined Tool"); #endif L_AnnSetToolBarButtons(hwnd, pButtons, uButtons+1); L_FreeBitmap(&UserToolBitmap); } // free the memory allocated by L_AnnGetToolBarButtons L_AnnFreeToolBarButtons(pButtons, uButtons); } // free the pButtons buffer. L_AnnFreeToolBarButtons does not free it, since // the buffer was not allocated by it if(pButtons) GlobalFreePtr(pButtons); } // show the toolbar ShowWindow(hwnd, SW_SHOW); return hwnd; } //........................................................................................ // // // //........................................................................................ static L_BOOL Frame_OnCreate( HWND hwnd, CREATESTRUCT FAR * lpCreateStruct) { CLIENTCREATESTRUCT ClientStruct; UINT uTool; ClientStruct.hWindowMenu = GetSubMenu (GetMenu (hwnd), MENU_WINDOW_POS); ClientStruct.idFirstChild = IDM_FIRSTCHILD; hwndClient = CreateWindow (TEXT("MDICLIENT"), NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU) 1, hInst, (VOID FAR *) & ClientStruct); if (!hwndClient) return(FALSE); hwndToolBar = MyCreateToolBar(hwnd); L_AnnGetToolBarChecked(hwndToolBar, &uTool); ToolChecked(hwnd, uTool); CheckMenuItem(GetMenu(hwnd), nAnnUserMode, MF_CHECKED); CheckMenuItem(GetMenu(hwnd), IDM_ANNOTATIONTOOLBAR, MF_CHECKED); return(TRUE); } //........................................................................................ // // // //........................................................................................ L_BOOL CALLBACK CloseAll(HWND hwnd, LPARAM lParam) { if (GetWindow (hwnd, GW_OWNER)) return(TRUE); FORWARD_WM_MDIRESTORE (GetParent (hwnd), hwnd, SendMessage); FORWARD_WM_CLOSE (hwnd, SendMessage); return(TRUE); } //........................................................................................ // // // //........................................................................................ BOOL CALLBACK SetUserMode(HWND hwnd, LPARAM lParam) { L_INT nCur ; LPCHILDDATA pData ; pData = ( LPCHILDDATA ) GetWindowLong ( hwnd, GWL_USERDATA) ; if ( pData != NULL ) { nCur = pData -> uCurPage ; } else return FALSE ; if (GetWindow (hwnd, GW_OWNER)) return(TRUE); { L_AnnSetUserMode(pData->ppContList[nCur]-> hContainer, (nAnnUserMode == IDS_DESIGNMODE ) ? ANNUSER_DESIGN : ANNUSER_RUN ); } return(TRUE); } //........................................................................................ // // // //........................................................................................ static HWND CreateChildWindow (LPTSTR pszTitle, L_INT nPageNumber ) { MDICREATESTRUCT mdiCreateStruct; CREATEDATA CreateData; HWND hwndChild; CreateData.pszTitle = pszTitle; CreateData.nPageNumber = nPageNumber; mdiCreateStruct.szClass = SZ_CHILDCLASS; mdiCreateStruct.szTitle = pszTitle; mdiCreateStruct.hOwner = hInst; mdiCreateStruct.x = CW_USEDEFAULT; mdiCreateStruct.y = CW_USEDEFAULT; mdiCreateStruct.cx = CW_USEDEFAULT; mdiCreateStruct.cy = CW_USEDEFAULT; mdiCreateStruct.style = MDIS_ALLCHILDSTYLES; mdiCreateStruct.lParam = (LPARAM) (LPCREATEDATA) &CreateData; hwndChild = FORWARD_WM_MDICREATE (hwndClient, (LPMDICREATESTRUCT) & mdiCreateStruct, SendMessage); return(hwndChild); } //........................................................................................ // // // //........................................................................................ L_VOID LoadContainer ( HWND hwnd, LPCHILDDATA pData, HANNOBJECT * phObject, L_INT nPage ) { L_INT nRet ; * phObject = NULL; if ( ! ( IsAnnInLeadTag( pData->pszFileName, nPage, -1 ) ) ) { nRet = L_AnnLoad( pData-> pszFileName, phObject, &LoadFileOption) ; if ( nRet != SUCCESS ) phObject = NULL ; } else { L_GetDefaultLoadFileOption( &LoadFileOption, sizeof(LOADFILEOPTION)) ; LoadFileOption.PageNumber = nPage ; // The annotations maybe saved in lead format ( in ANNTIFF_LEADTAG ) . L_AnnReadLeadTag ( pData -> pszFileName, phObject, &LoadFileOption ) ; } } //........................................................................................ // // // //........................................................................................ static L_VOID OpenBitmap(HWND hwnd) { L_INT nRet ; BITMAPHANDLE Bitmap; L_INT nPageNumber; if(GetFileName(hwnd, TEXT("Open File"), szOpenFileFilter, szBitmapFile, &nPageNumber)) { nRet = L_LoadBitmap (szBitmapFile, &Bitmap, sizeof(BITMAPHANDLE),0, ORDER_BGRORGRAY, NULL,NULL ); if(nRet == SUCCESS) { CreateChildWindow(szBitmapFile, nPageNumber ) ; L_FreeBitmap ( &Bitmap ) ; } } } //........................................................................................ // // // //........................................................................................ static L_VOID Frame_OnCommand(HWND hwnd, L_INT id, HWND hwndCtl, UINT codeNotify) { FARPROC lpfn; HWND hwndChild; switch(id) { case IDS_DESIGNMODE: case IDS_RUNMODE : CheckMenuItem(GetMenu(hwndFrame), nAnnUserMode, MF_UNCHECKED); nAnnUserMode = id; CheckMenuItem(GetMenu(hwndFrame), nAnnUserMode, MF_CHECKED); ShowWindow(hwndToolBar, (nAnnUserMode == IDS_DESIGNMODE ) ? SW_NORMAL : SW_HIDE); EnableMenuItem(GetMenu(hwndFrame),IDM_ANNOTATIONTOOLBAR,((nAnnUserMode == IDS_DESIGNMODE ) ? MF_ENABLED : MF_GRAYED)); lpfn = MakeProcInstance((FARPROC) SetUserMode, hInst); EnumChildWindows(hwndClient, (WNDENUMPROC) lpfn, 0); FreeProcInstance(lpfn); break; case IDM_OPEN: { OpenBitmap(hwnd); } break; case IDM_CASCADE: { FORWARD_WM_MDICASCADE(hwndClient, 0, SendMessage); } break; case IDM_TILE: { FORWARD_WM_MDITILE(hwndClient, MDITILE_HORIZONTAL, SendMessage); } break; case IDM_ARRANGE: { FORWARD_WM_MDIICONARRANGE(hwndClient, SendMessage); } break; case IDM_EXIT: { FORWARD_WM_CLOSE(hwnd, SendMessage); } break; case IDM_CLOSEALL: { lpfn = MakeProcInstance((FARPROC) CloseAll, hInst); EnumChildWindows(hwndClient, (WNDENUMPROC) lpfn, 0); FreeProcInstance(lpfn); } break; case IDM_NEXT_PAGE : { hwndChild = (HWND) SendMessage (hwndClient, WM_MDIGETACTIVE, 0, 0) ; SendMessage ( hwndChild, WM_COMMAND, ( WPARAM )IDM_NEXT_PAGE, 0 ) ; } break ; case IDM_PREV_PAGE : { hwndChild = (HWND) SendMessage (hwndClient, WM_MDIGETACTIVE, 0, 0) ; SendMessage ( hwndChild, WM_COMMAND, ( WPARAM )IDM_PREV_PAGE, 0 ) ; } break ; case IDM_FIRST_PAGE : { hwndChild = (HWND) SendMessage (hwndClient, WM_MDIGETACTIVE, 0, 0) ; SendMessage ( hwndChild, WM_COMMAND, ( WPARAM )IDM_FIRST_PAGE, 0 ) ; } break ; case IDM_LAST_PAGE : { hwndChild = (HWND) SendMessage (hwndClient, WM_MDIGETACTIVE, 0, 0) ; SendMessage ( hwndChild, WM_COMMAND, ( WPARAM )IDM_LAST_PAGE, 0 ) ; } break ; case IDM_ANNOTATIONTOOLBAR: { if( IsWindow(hwndToolBar) ) DestroyWindow(hwndToolBar); else { hwndToolBar = MyCreateToolBar(hwnd); CheckMenuItem(GetMenu(hwnd), IDM_ANNOTATIONTOOLBAR, MF_CHECKED); } } break; case IDS_LEADMODE : { gbWangMode = FALSE ; CheckMenuItem(GetMenu(hwndFrame), IDS_WANGMODE, MF_UNCHECKED); CheckMenuItem(GetMenu(hwndFrame), IDS_LEADMODE, MF_CHECKED); } break ; case IDS_WANGMODE : { gbWangMode = TRUE ; CheckMenuItem(GetMenu(hwndFrame), IDS_LEADMODE, MF_UNCHECKED); CheckMenuItem(GetMenu(hwndFrame), IDS_WANGMODE, MF_CHECKED); } break ; case IDM_ENUMERATE : { hwndChild = (HWND) SendMessage (hwndClient, WM_MDIGETACTIVE, 0, 0) ; SendMessage ( hwndChild, WM_COMMAND, ( WPARAM )IDM_ENUMERATE, 0 ) ; } break ; case IDM_ABOUT: { DoDialogBoxParam(IDD_ABOUT, hwnd, (DLGPROC) AboutDlgProc, 0); } break; default: { hwndChild = FORWARD_WM_MDIGETACTIVE(hwndClient, SendMessage); if (IsWindow (hwndChild)) FORWARD_WM_COMMAND(hwndChild, id, hwndCtl, codeNotify, SendMessage); #ifdef WIN32 DefFrameProc(hwnd, hwndClient, WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl)); #else DefFrameProc(hwnd, hwndClient, WM_COMMAND, (WPARAM) (L_INT) (id), MAKELPARAM ((UINT) (hwndCtl), (codeNotify))); #endif } break; } return ; } //........................................................................................ // // // //........................................................................................ static L_VOID Frame_OnClose(HWND hwnd) { FORWARD_WM_COMMAND (hwnd, IDM_CLOSEALL, 0, 0, SendMessage); DestroyWindow (hwnd); } //........................................................................................ // // // //........................................................................................ static L_VOID Frame_OnDestroy(HWND hwnd) { PostQuitMessage (0); } //........................................................................................ // // // //........................................................................................ static LRESULT Frame_OnLtAnnEvent(HWND hwnd, L_INT id, LPARAM lParam) { switch(id) { case LTANNEVENT_TOOLCHECKED: ToolChecked(hwnd, (UINT) lParam); break; case LTANNEVENT_TOOLDESTROY: hwndToolBar = NULL; CheckMenuItem(GetMenu(hwnd),IDM_ANNOTATIONTOOLBAR,MF_UNCHECKED); break; } return(0); } //........................................................................................ // // // //........................................................................................ L_VOID CheckSaveFormat ( HMENU hMenu ) { HMENU hPreferenceMenu, hSaveMenu ; hPreferenceMenu = GetSubMenu ( hMenu, MENU_PAGE_PREFERENCES ) ; hSaveMenu = GetSubMenu ( hPreferenceMenu, 0 ) ; CheckMenuItem ( hSaveMenu, IDS_WANGMODE, gbWangMode ? MF_CHECKED: MF_UNCHECKED ); CheckMenuItem ( hSaveMenu, IDS_LEADMODE, gbWangMode ? MF_UNCHECKED: MF_CHECKED ); } //........................................................................................ // // // //........................................................................................ L_VOID Frame_OnInitMenuPopup (HWND hwnd, HMENU hMenu, L_INT item, L_BOOL fSystemMenu) { LPCHILDDATA pData ; HWND hwndChild = FORWARD_WM_MDIGETACTIVE(hwndClient, SendMessage); L_BOOL fHasChild = IsWindow(hwndChild); pData = ( LPCHILDDATA ) GetWindowLong ( hwndChild, GWL_USERDATA) ; if ( !fHasChild ) { hMenu = GetMenu ( hwnd ) ; EnableMenuItem ( hMenu, IDM_NEXT_PAGE, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_PREV_PAGE, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_FIRST_PAGE,MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_LAST_PAGE, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_SAVEAS, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_TILE, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_CASCADE, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_ARRANGE, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_CLOSEALL, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_ENUMERATE, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_DOUBLE_BUFFER, MF_GRAYED); } else { EnableMenuItem ( hMenu, IDM_TILE, MF_ENABLED ) ; EnableMenuItem ( hMenu, IDM_CASCADE, MF_ENABLED ) ; EnableMenuItem ( hMenu, IDM_ARRANGE, MF_ENABLED ) ; EnableMenuItem ( hMenu, IDM_CLOSEALL, MF_ENABLED ) ; EnableMenuItem ( hMenu, IDM_ENUMERATE, MF_ENABLED ) ; EnableMenuItem ( hMenu, IDM_DOUBLE_BUFFER, MF_ENABLED); CheckMenuItem (hMenu, IDM_DOUBLE_BUFFER, (fHasChild && pData->bDoubleBuffer) ? MF_CHECKED: MF_UNCHECKED); } EnableMenuItem(hMenu, IDM_REALIZE_REDACT, fHasChild ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, IDM_REALIZE_ALL, fHasChild ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, IDM_UNREALIZE, fHasChild ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, IDM_APPLY_ENCRYPTORS, fHasChild ? MF_ENABLED : MF_GRAYED); EnableMenuItem(hMenu, IDM_APPLY_DECRYPTORS, fHasChild ? MF_ENABLED : MF_GRAYED); CheckSaveFormat ( hMenu ) ; return ; } //........................................................................................ // // // //........................................................................................ BOOL CALLBACK PaletteChangedAll (HWND hwnd, LPARAM lParam) { if (GetWindow (hwnd, GW_OWNER)) return(TRUE); FORWARD_WM_PALETTECHANGED (hwnd, (HWND) (UINT) (lParam), SendMessage); return(TRUE); } //........................................................................................ // // // //........................................................................................ static void Frame_OnPaletteChanged(HWND hwnd, HWND hwndPaletteChange) { FARPROC lpfn = MakeProcInstance ((FARPROC) PaletteChangedAll, hInst); EnumChildWindows (hwndClient, (WNDENUMPROC) lpfn, (LPARAM) (UINT) hwndPaletteChange); FreeProcInstance (lpfn); return; } //........................................................................................ // // // //........................................................................................ static BOOL Frame_OnQueryNewPalette(HWND hwnd) { HWND hwndChild = FORWARD_WM_MDIGETACTIVE (hwndClient, SendMessage); // if there is no active window, pass the message to the toolbar window if(!IsWindow (hwndChild)) hwndChild = hwndToolBar; if (hwndChild) FORWARD_WM_QUERYNEWPALETTE (hwndChild, SendMessage); return(TRUE); } //........................................................................................ // // // //........................................................................................ VOID Frame_OnPaletteChanging(HWND hWnd, HWND hWndPaletteChange) { Frame_OnPaletteChanged (hWnd, hWndPaletteChange); } //........................................................................................ // // // //........................................................................................ static VOID Frame_SysColorChange(HWND hwnd) { Frame_OnQueryNewPalette(hwnd); } //........................................................................................ // // // //........................................................................................ LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { HANDLE_MSG (hwnd, WM_CREATE, Frame_OnCreate); HANDLE_MSG (hwnd, WM_PALETTECHANGED, Frame_OnPaletteChanged); HANDLE_MSG (hwnd, WM_QUERYNEWPALETTE, Frame_OnQueryNewPalette); HANDLE_MSG (hwnd, WM_PALETTEISCHANGING, Frame_OnPaletteChanging); HANDLE_MSG (hwnd, WM_SYSCOLORCHANGE, Frame_SysColorChange); HANDLE_MSG (hwnd, WM_DESTROY, Frame_OnDestroy); HANDLE_MSG (hwnd, WM_COMMAND, Frame_OnCommand); HANDLE_MSG (hwnd, WM_CLOSE, Frame_OnClose); HANDLE_MSG (hwnd, WM_LTANNEVENT, Frame_OnLtAnnEvent); HANDLE_MSG (hwnd, WM_INITMENUPOPUP, Frame_OnInitMenuPopup); } return(DefFrameProc (hwnd, hwndClient, msg, wParam, lParam)); } //........................................................................................ // // // //........................................................................................ L_VOID LoadBitmapList( LPCHILDDATA pData ) { L_LoadBitmapList( pData -> pszFileName, &(pData->hList), 0,ORDER_BGRORGRAY, &LoadFileOption,NULL ) ; L_GetBitmapListCount ( pData -> hList, &pData ->uPagesCount ) ; return ; } //........................................................................................ // // // //........................................................................................ static L_BOOL Child_OnCreate(HWND hwnd, CREATESTRUCT FAR* lpCreateStruct) { ANNENCRYPTOPTIONS EncryptOptions; L_UINT i ; LPCREATEDATA pCreateData = NULL ; LPCHILDDATA pData = NULL ; ANNRECT rc = { 0, 0, 0, 0 } ; pCreateData = (LPCREATEDATA) CHILDCREATELPARAM (lpCreateStruct); pData = (LPCHILDDATA) malloc ( sizeof (CHILDDATA)); if(!pData) return(FALSE); pData->bDoubleBuffer = TRUE; pData->hDoubleBuffer = NULL; L_DoubleBufferCreateHandle(&pData->hDoubleBuffer); L_DoubleBufferEnable(pData->hDoubleBuffer, pData->bDoubleBuffer); L_GetDefaultLoadFileOption( &LoadFileOption, sizeof(LOADFILEOPTION)) ; LoadFileOption.PageNumber = FIRSTPAGE ; SetWindowLong (hwnd, GWL_USERDATA, ( L_INT32 ) pData); pData->pszFileName = ( L_TCHAR FAR * ) malloc ( (_tcslen ( lpCreateStruct->lpszName ) + 1) * sizeof(L_TCHAR) ) ; _tcscpy(pData->pszFileName, lpCreateStruct->lpszName ) ; LoadBitmapList ( pData ) ; pData -> ppContList = ( pCONTAINERLIST * ) malloc ( sizeof ( pCONTAINERLIST ) * pData -> uPagesCount ) ; if ( !pData -> ppContList ) return ( FALSE ) ; // allocate the required memory . for ( i = 0; i < pData ->uPagesCount; i ++ ) { pData->ppContList[i] = ( pCONTAINERLIST ) malloc ( sizeof ( CONTAINERLIST ) ) ; // load the container with it's data LoadContainer ( hwnd, pData, &pData->ppContList[i] -> hContainer, i+1 ) ; L_GetBitmapListItem(pData -> hList, i, & pData -> Bitmap,sizeof(BITMAPHANDLE)); SetRect(&pData->rcView, 0, 0, BITMAPWIDTH(&pData->Bitmap), BITMAPHEIGHT(&pData->Bitmap)); if(pData->ppContList[i]-> hContainer != NULL ) { L_AnnSetWnd(pData-> ppContList [i]-> hContainer, hwnd); } else { rc.left =(L_DOUBLE) pData->rcView.left; rc.top =(L_DOUBLE) pData->rcView.top; rc.right =(L_DOUBLE) pData->rcView.right; rc.bottom=(L_DOUBLE) pData->rcView.bottom; L_AnnCreateContainer(hwnd, &rc, TRUE, &pData->ppContList[i]->hContainer); } } pData -> uCurPage = pCreateData->nPageNumber - 1; ; { HDC hdc = GetDC(NULL); L_AnnSetDpiX(pData->hAutomation, (L_DOUBLE) GetDeviceCaps(hdc,LOGPIXELSX), ANNFLAG_NOINVALIDATE); L_AnnSetDpiY(pData->hAutomation, (L_DOUBLE) GetDeviceCaps(hdc,LOGPIXELSY), ANNFLAG_NOINVALIDATE); ReleaseDC(NULL, hdc); } L_GetBitmapListItem(pData -> hList, pData -> uCurPage, &pData -> Bitmap,sizeof(BITMAPHANDLE)); SetRect(&pData->rcView, 0, 0, BITMAPWIDTH(&pData->Bitmap), BITMAPHEIGHT(&pData->Bitmap)); L_AnnSetUserMode(pData->ppContList[pData->uCurPage]->hContainer, (nAnnUserMode == IDS_DESIGNMODE ) ? ANNUSER_DESIGN : ANNUSER_RUN); // create the Automation L_AnnCreate ( ANNOBJECT_AUTOMATION, &pData-> hAutomation ); L_AnnSetHyperlinkMenuEnable(pData->hAutomation, TRUE, ANNFLAG_NOINVALIDATE); L_AnnSetAutoContainer(pData->hAutomation, pData->ppContList[pData->uCurPage]->hContainer); L_AnnSetActiveState(pData->hAutomation, ANNACTIVE_ENABLED); EncryptOptions.uStructSize = sizeof(ANNENCRYPTOPTIONS); EncryptOptions.uFlags = ANNENCRYPT_ENCRYPT_BITMAP | ANNENCRYPT_SAVE_ENCRYPTOR_KEY | ANNENCRYPT_SAVE_DECRYPTOR_KEY | ANNENCRYPT_CLEAR_ENCRYPTOR_KEY | ANNENCRYPT_CLEAR_DECRYPTOR_KEY; EncryptOptions.nReserved = 0; EncryptOptions.pEncryptBitmap = &pData->Bitmap; EncryptOptions.bSaveEncryptorKey = TRUE; EncryptOptions.bSaveDecryptorKey = TRUE; EncryptOptions.bClearEncryptorKey= FALSE; EncryptOptions.bClearDecryptorKey= FALSE; L_AnnSetEncryptOptions(pData->hAutomation, &EncryptOptions, 0); L_AnnSetEncryptOptions(pData->ppContList[pData->uCurPage]->hContainer, &EncryptOptions, ANNFLAG_RECURSE); Child_OnNewPage ( hwnd, pData ) ; return( TRUE ) ; } //........................................................................................ // // // //........................................................................................ static L_VOID Child_OnPaint(HWND hwnd) { LPCHILDDATA pData ; PAINTSTRUCT ps; HPALETTE hPalette; HDC hMemDC = NULL; L_UINT uCur; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; BeginPaint (hwnd, &ps); uCur = pData -> uCurPage ; if(pData->Bitmap.Flags.Allocated) { GetClientRect(hwnd, &pData->rcClient); hMemDC = L_DoubleBufferBegin(pData->hDoubleBuffer, ps.hdc, pData->rcClient.right, pData->rcClient.bottom); if(pData->bDoubleBuffer) { HBRUSH hBrush = GetStockObject (GRAY_BRUSH); FillRect(hMemDC, &ps.rcPaint, hBrush); } if (pData->hPalette) hPalette = SelectPalette (hMemDC, pData->hPalette, TRUE); GetWindowRect(hwnd, &pData->rcWindow); L_PaintDC (hMemDC, &pData->Bitmap, NULL, NULL, &pData->rcView, &ps.rcPaint, SRCCOPY); if (pData->hPalette) SelectPalette (hMemDC, hPalette, TRUE); L_AnnDraw(hMemDC, &ps.rcPaint, pData->ppContList [ uCur ] -> hContainer); L_DoubleBufferEnd(pData->hDoubleBuffer, ps.hdc); } EndPaint (hwnd, &ps); } //........................................................................................ // // // //........................................................................................ static BOOL Child_OnQueryNewPalette (HWND hwnd) { HDC hDC; HPALETTE hPalette; L_INT nNoColors = 0; LPCHILDDATA pData ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; if (pData->hPalette) { DeleteObject (pData->hPalette); pData->hPalette = NULL; } if (pData->Bitmap.Flags.Allocated) { hDC = GetDC (hwndFrame); pData->hPalette = L_CreatePaintPalette (hDC, &pData->Bitmap); if(pData->hPalette) { hPalette = SelectPalette (hDC, pData->hPalette, FALSE); nNoColors = RealizePalette (hDC); if (nNoColors) InvalidateRect (hwnd, NULL, FALSE); SelectPalette (hDC, hPalette, TRUE); } ReleaseDC (hwndFrame, hDC); } return(nNoColors); } //........................................................................................ // // // //........................................................................................ static void Child_OnPaletteChanged (HWND hwnd, HWND hwndPaletteChange) { HDC hDC; HPALETTE hPalette; LPCHILDDATA pData ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; if (hwnd == hwndPaletteChange) return; if (pData->hPalette) { DeleteObject (pData->hPalette); pData->hPalette = NULL; } hDC = GetDC (hwnd); pData->hPalette = L_CreatePaintPalette (hDC, &pData->Bitmap); hPalette = SelectPalette (hDC, pData->hPalette, TRUE); RealizePalette (hDC); InvalidateRect (hwnd, NULL, FALSE); SelectPalette (hDC, hPalette, TRUE); ReleaseDC (hwnd, hDC); } //........................................................................................ // // // //........................................................................................ static VOID Child_OnDestroy (HWND hwnd) { L_UINT i ; LPCHILDDATA pData ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; if(pData) { L_DoubleBufferDestroyHandle(pData->hDoubleBuffer); if (pData ->hList ) L_DestroyBitmapList ( pData -> hList ) ; if (pData->hPalette) DeleteObject (pData->hPalette); if(pData->hAutomation) { L_AnnSetActiveState(pData->hAutomation, ANNACTIVE_DISABLED); L_AnnDestroy(pData->hAutomation, ANNFLAG_NOINVALIDATE); } for ( i = 0; i < pData ->uPagesCount; i ++ ) { if ( pData->ppContList[i] != NULL ) { if(pData->ppContList[i]->hContainer) L_AnnDestroy(pData->ppContList[i]->hContainer, ANNFLAG_NOINVALIDATE); free ( pData->ppContList[i] ) ; } } if ( pData -> ppContList != NULL ) free ( pData -> ppContList ) ; if ( pData-> pszFileName != NULL ) free ( pData-> pszFileName ) ; free (pData); } } //........................................................................................ // // // //........................................................................................ static L_VOID Child_MDIActivate(HWND hwnd, L_BOOL fActive, HWND hwndActivate, HWND hwndDeactivate) { LPCHILDDATA pData ; L_UINT uTool, uCur ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; uCur = pData -> uCurPage ; EnableDisableMenuItems ( hwnd, pData ) ; if(fActive) { FORWARD_WM_QUERYNEWPALETTE (hwnd, SendMessage); SetFocus(hwnd); if(hwndToolBar) L_AnnGetToolBarChecked(hwndToolBar, &uTool); L_AnnSetTool(pData->hAutomation, uTool); } return; } //........................................................................................ // // // //........................................................................................ static L_INT DoDialogBoxParam(L_INT nDialog, HWND hwnd, DLGPROC pfnDialog, LPARAM lParam) { DLGPROC pfn; L_INT nRet; pfn = (DLGPROC) MakeProcInstance((FARPROC) pfnDialog, hInst); nRet = DialogBoxParam (hInst, MAKEINTRESOURCE (nDialog), hwnd, pfn, lParam); FreeProcInstance((FARPROC) pfn); return(nRet); } //........................................................................................ // // // //........................................................................................ L_VOID Child_ProcessSize(HWND hwnd, UINT state, L_INT cx, L_INT cy) { static L_BOOL fSizeInUse = FALSE ; L_INT nWidth, nHeight, nVScroll, nHScroll; LPCHILDDATA pData ; L_UINT uCur ; DWORD dwStyle; // L_INT cxOldClient, cyOldClient; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; uCur = pData -> uCurPage ; if (!fSizeInUse) { fSizeInUse = TRUE; if (state != SIZEICONIC) { L_GetBitmapListItem ( pData->hList, pData->uCurPage, &pData->Bitmap,sizeof(BITMAPHANDLE) ) ; SetRect(&pData->rcView, 0, 0, BITMAPWIDTH(&pData->Bitmap), BITMAPHEIGHT(&pData->Bitmap)); nWidth = BITMAPWIDTH(&pData->Bitmap) ; nHeight =BITMAPHEIGHT(&pData->Bitmap); // cxOldClient = pData->cxClient; // cyOldClient = pData->cyClient; pData->cxClient = cx; pData->cyClient = cy; dwStyle = GetWindowLong (hwnd, GWL_STYLE); nVScroll = GetSystemMetrics (SM_CXVSCROLL) - GetSystemMetrics(SM_CXBORDER); nHScroll = GetSystemMetrics (SM_CYHSCROLL) - GetSystemMetrics(SM_CYBORDER); if (WS_VSCROLL & dwStyle) pData->cxClient += nVScroll; if (WS_HSCROLL & dwStyle) pData->cyClient += nHScroll; if (pData->cxClient < nWidth) { pData->cyClient -= nHScroll; if (pData->cyClient < nHeight) pData->cxClient -= nVScroll; } else if (pData->cyClient < nHeight) { pData->cxClient -= nVScroll; if (pData->cxClient < nWidth) pData->cyClient -= nHScroll; } pData->nHScrollStep = max (1, pData->cxClient / 10); pData->nVScrollStep = max (1, pData->cyClient / 10); pData->nVScrollMax = max (0, (nHeight - pData->cyClient )); pData->nVScrollPos = max (0, min (pData->nVScrollPos, pData->nVScrollMax)); pData->nHScrollMax = max (0, (nWidth - pData->cxClient )); pData->nHScrollPos = max (0, min (pData->nHScrollPos, pData->nHScrollMax)); SetRect (&pData->rcView, 0, 0, nWidth, nHeight); OffsetRect (&pData->rcView, -pData->nHScrollPos, -pData->nVScrollPos); SetScrollRange (hwnd, SB_HORZ, 0, pData->nHScrollMax, FALSE); SetScrollPos (hwnd, SB_HORZ, pData->nHScrollPos, TRUE); SetScrollRange (hwnd, SB_VERT, 0, pData->nVScrollMax, FALSE); SetScrollPos (hwnd, SB_VERT, pData->nVScrollPos, TRUE); L_AnnSetOffsetX(pData->ppContList[uCur]->hContainer, (L_DOUBLE) pData->rcView.left, ANNFLAG_NOINVALIDATE); L_AnnSetOffsetY(pData->ppContList[uCur]->hContainer, (L_DOUBLE) pData->rcView.top, ANNFLAG_NOINVALIDATE); L_AnnSetScalarX(pData->ppContList[uCur]->hContainer, (L_DOUBLE) RECTWIDTH(&pData->rcView) / BITMAPWIDTH(&pData->Bitmap), ANNFLAG_NOINVALIDATE); L_AnnSetScalarY(pData->ppContList[uCur]->hContainer, (L_DOUBLE) RECTHEIGHT(&pData->rcView) / BITMAPHEIGHT(&pData->Bitmap), ANNFLAG_NOINVALIDATE); /* { RECT rcView = pData->rcView; SetRect (&pData->rcView, 0, 0, nWidth, nHeight); OffsetRect (&pData->rcView, -pData->nHScrollPos, -pData->nVScrollPos); // check if I can avoid repainting the old window if(EqualRect(&pData->rcView, &rcView)) { RECT rc; // I don't have to redraw the old portion if the top-left corner of the window hasn't moved GetWindowRect(hwnd, &rc); if(rc.left == pData->rcWindow.left && rc.top == pData->rcWindow.top) { SetRect(&rc, 0, 0, cxOldClient, cyOldClient); IntersectRect(&rc, &rc, &pData->rcClient); ValidateRect(hwnd, &rc); } } }*/ } fSizeInUse = FALSE; } } //........................................................................................ // // // //........................................................................................ L_VOID Child_OnSize(HWND hwnd, UINT state, L_INT cx, L_INT cy) { Child_ProcessSize(hwnd, state, cx, cy); DefMDIChildProc (hwnd, WM_SIZE, (WPARAM) state, MAKELPARAM (cy, cx)); } //............................................................................................ // // // // //............................................................................................ L_VOID EnableDisableMenuItems ( HWND hwnd, LPCHILDDATA pData ) { L_UINT uCurPage ; HWND hwndClient = GetParent (hwnd) ; HWND hwndFrame = GetParent (hwndClient) ; HMENU hMenu = GetMenu ( hwndFrame ) ; uCurPage = pData -> uCurPage ; if ( uCurPage >= 0 ) { EnableMenuItem ( hMenu, IDM_SAVEAS, MF_ENABLED ) ; if ( uCurPage == 0 ) { EnableMenuItem ( hMenu, IDM_PREV_PAGE, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_FIRST_PAGE, MF_GRAYED ) ; } else { EnableMenuItem ( hMenu, IDM_PREV_PAGE, MF_ENABLED ) ; EnableMenuItem ( hMenu, IDM_FIRST_PAGE, MF_ENABLED ) ; } if ( uCurPage == pData -> uPagesCount - 1 ) { EnableMenuItem ( hMenu, IDM_NEXT_PAGE, MF_GRAYED ) ; EnableMenuItem ( hMenu, IDM_LAST_PAGE, MF_GRAYED ) ; } else { EnableMenuItem ( hMenu, IDM_NEXT_PAGE, MF_ENABLED ) ; EnableMenuItem ( hMenu, IDM_LAST_PAGE, MF_ENABLED ) ; } } return ; } //........................................................................................ // // // //........................................................................................ L_VOID GetClientCordinates ( HWND hwnd, PPOINT pPoint ) { RECT rect ; GetClientRect ( hwnd, &rect ) ; pPoint-> x = rect.right - rect.left ; pPoint-> y = rect.bottom - rect.top ; return ; } //........................................................................................ // // // //........................................................................................ L_VOID Child_OnNewPage ( HWND hwnd, LPCHILDDATA pData ) { POINT Point ; ANNRECT rc = { 0, 0, 0, 0 } ; L_UINT uCur = pData -> uCurPage ; pData->nHScrollPos = 0 ; pData->nVScrollPos = 0 ; L_GetBitmapListItem(pData -> hList, pData -> uCurPage, & pData -> Bitmap,sizeof(BITMAPHANDLE)); SetRect(&pData->rcView, 0, 0, BITMAPWIDTH(&pData->Bitmap), BITMAPHEIGHT(&pData->Bitmap)); GetClientCordinates ( hwnd, &Point ) ; Child_ProcessSize(hwnd, SIZE_RESTORED, Point.x, Point.y); L_AnnSetAutoContainer(pData->hAutomation, pData->ppContList[pData -> uCurPage]->hContainer); rc.left =(L_DOUBLE) 0; rc.top =(L_DOUBLE) 0; rc.right =(L_DOUBLE) BITMAPWIDTH ( &pData->Bitmap ) ; rc.bottom=(L_DOUBLE) BITMAPHEIGHT( &pData->Bitmap ) ; L_AnnSetRect ( pData -> hAutomation, &rc ) ; L_AnnSetRect ( pData -> ppContList [pData -> uCurPage]->hContainer, &rc ) ; L_AnnSetBitmap ( pData->hAutomation, &pData -> Bitmap, 0 ) ; L_AnnSetBitmap ( pData->ppContList[pData -> uCurPage]->hContainer, &pData -> Bitmap, 0 ) ; L_AnnSetUserMode(pData->ppContList[uCur]-> hContainer, (nAnnUserMode == IDS_DESIGNMODE ) ? ANNUSER_DESIGN : ANNUSER_RUN); L_AnnSetActiveState(pData->hAutomation, ANNACTIVE_ENABLED); { HDC hdc = GetDC ( NULL ) ; L_AnnSetDpiX(pData->hAutomation, (L_DOUBLE) GetDeviceCaps(hdc,LOGPIXELSX), ANNFLAG_NOINVALIDATE); L_AnnSetDpiY(pData->hAutomation, (L_DOUBLE) GetDeviceCaps(hdc,LOGPIXELSY), ANNFLAG_NOINVALIDATE); ReleaseDC(NULL, hdc); } L_AnnSetAutoContainer(pData->hAutomation, pData->ppContList[uCur]->hContainer); L_AnnSetHyperlinkMenuEnable(pData->hAutomation, TRUE, ANNFLAG_NOINVALIDATE); L_AnnSetUndoDepth ( pData->hAutomation, UNDODEPTH ); L_AnnSetBitmapDpiX(pData->hAutomation, (L_DOUBLE) pData->Bitmap.XResolution, ANNFLAG_NOINVALIDATE); L_AnnSetBitmapDpiY(pData->hAutomation, (L_DOUBLE) pData->Bitmap.YResolution, ANNFLAG_NOINVALIDATE); L_AnnSetBitmapDpiX(pData->ppContList[uCur]->hContainer, (L_DOUBLE) pData->Bitmap.XResolution, ANNFLAG_RECURSE|ANNFLAG_NOINVALIDATE); L_AnnSetBitmapDpiY(pData->ppContList[uCur]->hContainer, (L_DOUBLE) pData->Bitmap.YResolution, ANNFLAG_RECURSE|ANNFLAG_NOINVALIDATE); L_AnnSetAutoOptions(pData->hAutomation, ANNAUTO_TABBEDDIALOG); { ANNENCRYPTOPTIONS EncryptOptions; EncryptOptions.uStructSize = sizeof(ANNENCRYPTOPTIONS); EncryptOptions.uFlags = ANNENCRYPT_ENCRYPT_BITMAP | ANNENCRYPT_SAVE_ENCRYPTOR_KEY | ANNENCRYPT_SAVE_DECRYPTOR_KEY | ANNENCRYPT_CLEAR_ENCRYPTOR_KEY | ANNENCRYPT_CLEAR_DECRYPTOR_KEY; EncryptOptions.nReserved = 0; EncryptOptions.pEncryptBitmap = &pData->Bitmap; EncryptOptions.bSaveEncryptorKey = TRUE; EncryptOptions.bSaveDecryptorKey = TRUE; EncryptOptions.bClearEncryptorKey= FALSE; EncryptOptions.bClearDecryptorKey= FALSE; L_AnnSetEncryptOptions(pData->hAutomation, &EncryptOptions, 0); L_AnnSetEncryptOptions(pData->ppContList[uCur]->hContainer, &EncryptOptions, ANNFLAG_RECURSE); } Child_OnQueryNewPalette ( hwnd ) ; Child_OnPaletteChanged ( hwnd, 0 ) ; EnableDisableMenuItems ( hwnd, pData ) ; return ; } //............................................................................................ // // // // //............................................................................................ L_VOID CreateNewAutomation ( LPCHILDDATA pData ) { L_AnnSetActiveState(pData->hAutomation, ANNACTIVE_DISABLED); L_AnnDestroy(pData->hAutomation, 0 ) ; L_AnnCreate(ANNOBJECT_AUTOMATION, &pData-> hAutomation ) ; return ; } //............................................................................................ // // // // //............................................................................................ static L_VOID Child_OnCommand(HWND hwnd, L_INT id, HWND hwndCtl, UINT codeNotify) { LPCHILDDATA pData ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; switch ( id ) { case IDM_SAVEAS: { SaveBitmap( hwnd ) ; } return ; case IDM_NEXT_PAGE : { CreateNewAutomation ( pData ) ; pData -> uCurPage ++ ; Child_OnNewPage ( hwnd, pData ) ; InvalidateRect ( hwnd, NULL, TRUE ) ; } return ; case IDM_PREV_PAGE : { CreateNewAutomation ( pData ) ; pData -> uCurPage -- ; Child_OnNewPage ( hwnd, pData ) ; InvalidateRect ( hwnd, NULL, TRUE ) ; } return ; case IDM_FIRST_PAGE : { CreateNewAutomation ( pData ) ; pData -> uCurPage = 0 ; Child_OnNewPage ( hwnd, pData ) ; InvalidateRect ( hwnd, NULL, TRUE ) ; } return ; case IDM_LAST_PAGE : { CreateNewAutomation ( pData ) ; pData -> uCurPage = pData -> uPagesCount - 1 ; Child_OnNewPage ( hwnd, pData ) ; InvalidateRect ( hwnd, NULL, TRUE ) ; } return ; case IDM_ENUMERATE : { EnumerateSelectedObjects ( hwnd, pData->ppContList[pData->uCurPage]->hContainer ) ; } return ; case IDM_DOUBLE_BUFFER: { pData->bDoubleBuffer = !pData->bDoubleBuffer; L_DoubleBufferEnable(pData->hDoubleBuffer, pData->bDoubleBuffer); } return; case IDM_REALIZE_ALL: case IDM_REALIZE_REDACT: { L_AnnRealize(&pData->Bitmap, NULL, pData->ppContList[pData->uCurPage]->hContainer, id == IDM_REALIZE_REDACT); } return; case IDM_UNREALIZE: { if(L_AnnUnrealize(&pData->Bitmap, NULL, pData->ppContList[pData->uCurPage]->hContainer, FALSE) == ERROR_ANN_LOCKED) MessageBox(hwnd, TEXT("Some redact objects are locked and cannot be restored"), TEXT("Warning"), MB_OK); } return; case IDM_APPLY_ENCRYPTORS: { L_AnnEncryptApply(pData->ppContList[pData->uCurPage]->hContainer, ANNENCRYPTAPPLY_ENCRYPTOR, ANNFLAG_RECURSE); } return; case IDM_APPLY_DECRYPTORS: { L_AnnEncryptApply(pData->ppContList[pData->uCurPage]->hContainer, ANNENCRYPTAPPLY_DECRYPTOR, ANNFLAG_RECURSE); } return; } } //........................................................................................ // // // //........................................................................................ static L_VOID Child_OnVScroll(HWND hwnd, HWND hwndCtl, UINT code, L_INT pos) { L_INT nScrollInc; LPCHILDDATA pData ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; pData->fInScroll = TRUE; switch (code) { case SB_BOTTOM: nScrollInc = pData->nVScrollMax - pData->nVScrollPos; break; case SB_TOP: nScrollInc = -pData->nVScrollPos; break; case SB_LINEDOWN: nScrollInc = pData->nVScrollStep; break; case SB_LINEUP: nScrollInc = -pData->nVScrollStep; break; case SB_PAGEDOWN: nScrollInc = max (pData->nVScrollStep, (pData->cyClient - pData->nVScrollStep)); break; case SB_PAGEUP: nScrollInc = -max (pData->nVScrollStep, (pData->cyClient - pData->nVScrollStep)); break; case SB_THUMBTRACK: case SB_THUMBPOSITION: nScrollInc = pos - pData->nVScrollPos; break; default: nScrollInc = 0; break; } nScrollInc = max (-pData->nVScrollPos, min (nScrollInc, (pData->nVScrollMax - pData->nVScrollPos))); if(nScrollInc) { L_UINT uCur = pData->uCurPage; pData->nVScrollPos += nScrollInc; OffsetRect (&pData->rcView, 0, -nScrollInc); L_AnnSetOffsetY(pData->ppContList [uCur]->hContainer, (L_DOUBLE) pData->rcView.top, ANNFLAG_NOINVALIDATE); if (pData->bDoubleBuffer) { InvalidateRect(hwnd, NULL, FALSE); } else // scroll window only if no fixed objects in view { L_UINT uCur = pData->uCurPage; RECT rcClient; L_BOOL bFixedInRect = FALSE; GetClientRect(hwnd, &rcClient); L_AnnIsFixedInRect(pData->ppContList[uCur]->hContainer, &rcClient, &bFixedInRect, ANNFLAG_RECURSE); if (bFixedInRect) InvalidateRect(hwnd, NULL, FALSE); else ScrollWindow (hwnd, 0, -nScrollInc, NULL, NULL); } SetScrollPos (hwnd, SB_VERT, pData->nVScrollPos, TRUE); UpdateWindow (hwnd); } pData->fInScroll = FALSE; } //........................................................................................ // // // //........................................................................................ static VOID Child_OnHScroll (HWND hwnd, HWND hwndCtl, UINT code, L_INT pos) { L_INT nScrollInc; LPCHILDDATA pData ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; pData->fInScroll = TRUE; switch (code) { case SB_LEFT: nScrollInc = -pData->nHScrollPos; break; case SB_RIGHT: nScrollInc = pData->nHScrollMax - pData->nHScrollPos; break; case SB_LINELEFT: nScrollInc = -pData->nHScrollStep; break; case SB_LINERIGHT: nScrollInc = pData->nHScrollStep; break; case SB_PAGELEFT: nScrollInc = -max (pData->nHScrollStep, (pData->cxClient - pData->nHScrollStep)); break; case SB_PAGERIGHT: nScrollInc = max (pData->nHScrollStep, (pData->cxClient - pData->nHScrollStep)); break; case SB_THUMBTRACK: case SB_THUMBPOSITION: nScrollInc = pos - pData->nHScrollPos; break; default: nScrollInc = 0; break; } nScrollInc = max (-pData->nHScrollPos, min (nScrollInc, (pData->nHScrollMax - pData->nHScrollPos))); if(nScrollInc) { L_UINT uCur = pData->uCurPage; pData->nHScrollPos += nScrollInc; OffsetRect (&pData->rcView, -nScrollInc, 0); L_AnnSetOffsetX(pData->ppContList [uCur]->hContainer, (L_DOUBLE) pData->rcView.left, ANNFLAG_NOINVALIDATE); if (pData->bDoubleBuffer) { InvalidateRect(hwnd, NULL, FALSE); } else // scroll window only if no fixed objects in view { L_UINT uCur = pData -> uCurPage; RECT rcClient; L_BOOL bFixedInRect = FALSE; GetClientRect(hwnd, &rcClient); L_AnnIsFixedInRect(pData->ppContList[uCur]->hContainer, &rcClient, &bFixedInRect, ANNFLAG_RECURSE); if (bFixedInRect) InvalidateRect(hwnd, NULL, FALSE); else ScrollWindow (hwnd, -nScrollInc, 0, NULL, NULL); } SetScrollPos (hwnd, SB_HORZ, pData->nHScrollPos, TRUE); UpdateWindow (hwnd); } pData->fInScroll = FALSE; } //........................................................................................ // // // //........................................................................................ static L_VOID AnnCheckMouse(LPCHILDDATA pData, pANNMOUSEPOS pMousePos) { L_UINT uCur ; L_INT dx, dy; L_UINT uTool; // If the current tool is user tool, create two annotation objects: // an ellipse inside a rectangle L_AnnGetToolBarChecked(hwndToolBar, &uTool); uCur = pData -> uCurPage ; if(pMousePos->uKeyFlags & MK_SHIFT) switch(uTool) { case ANNTOOL_RECT: case ANNTOOL_ELLIPSE: // restrict the mouse position to form square objects and circles // if the shift key is down dx = abs(pMousePos->pt.x - pData->pt0.x); dy = abs(pMousePos->pt.y - pData->pt0.y); if(dx < dy) { // adjust the x position by dx - dy if(pMousePos->pt.x > pData->pt0.x) pMousePos->pt.x -= dx - dy; else pMousePos->pt.x += dx - dy; } else if(dx > dy) { // adjust the y position by dy - dx if(pMousePos->pt.y > pData->pt0.y) pMousePos->pt.y -= dy - dx; else pMousePos->pt.y += dy - dx; } break; case ANNTOOL_LINE: case ANNTOOL_POINTER: // restrict the mouse position to form vertical or horizontal objects // if the shift key is down dx = abs(pMousePos->pt.x - pData->pt0.x); dy = abs(pMousePos->pt.y - pData->pt0.y); if(dx > dy) pMousePos->pt.y = pData->pt0.y; // horizontal lines else pMousePos->pt.x = pData->pt0.x; // vertical lines break; } } //........................................................................................ // // // //........................................................................................ LRESULT Child_OnLtAnnEvent(HWND hwnd, L_INT id, LPARAM lParam) { L_UINT uType; L_UINT uCur ; LPCHILDDATA pData ; L_UINT uSelected ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; uCur = pData -> uCurPage ; switch(id) { case LTANNEVENT_INSERT: L_AnnGetType((HANNOBJECT) lParam, &uType); if( uType == ANNOBJECT_BUTTON ) L_AnnSetTag((HANNOBJECT) lParam, ++uNextTag, 0); else if (uType == ANNOBJECT_HOTSPOT || uType == ANNOBJECT_FREEHANDHOTSPOT) L_AnnSetTag((HANNOBJECT) lParam, ++uNextTag, 0); break; case LTANNEVENT_AUTOENDSET: L_AnnSetToolBarChecked(hwndToolBar, ANNTOOL_SELECT); ToolChecked(hwndFrame, ANNTOOL_SELECT); break; case LTANNEVENT_LBUTTONDOWN: pData->fLeftButtonDown = TRUE; pData->pt0 = ((pANNMOUSEPOS)lParam)->pt; break; case LTANNEVENT_HYPERLINKMENU: GetHyperlink (hwnd, (HANNOBJECT)lParam, pData); break; case LTANNEVENT_HYPERLINK: MessageBox(hwnd, TEXT("Object's hyperlink has been activated!"), TEXT("WM_LTANNEVENT"), MB_OK); break; case LTANNEVENT_MOUSEMOVE: if(pData->fLeftButtonDown) AnnCheckMouse(pData, (pANNMOUSEPOS)lParam); break; case LTANNEVENT_LBUTTONUP: if(pData->fLeftButtonDown) { AnnCheckMouse(pData, (pANNMOUSEPOS)lParam); pData->fLeftButtonDown = FALSE; } break; case LTANNEVENT_MENU: // add the Flip menu only if we have one object selected L_AnnGetSelectCount(pData->ppContList[uCur]->hContainer, &uSelected); if(uSelected >= 1) { AppendMenu((HMENU)lParam, MF_SEPARATOR, 0, NULL); AppendMenu((HMENU)lParam, MF_ENABLED|MF_STRING, LTANNEVENT_MENUFIRST, TEXT("&Flip")); } break; case LTANNEVENT_MENUFIRST: if(pData->hAutomation == (HANNOBJECT)lParam) // flip all the selected objects L_AnnFlip(pData->ppContList[uCur]->hContainer, NULL, ANNFLAG_RECURSE|ANNFLAG_SELECTED); else // flip the selected object L_AnnFlip((HANNOBJECT)lParam, NULL, 0); break; } return(0); } //........................................................................................ // // // //........................................................................................ L_TCHAR *szObjectTypes[] = { TEXT("CONTAINER"), TEXT("POINTER"), TEXT("AUDIO"), TEXT("BUTTON"), TEXT("ELLIPSE"), TEXT("FREEHAND"), TEXT("HILITE"), TEXT("HOTSPOT"), TEXT("LINE"), TEXT("NOTE"), TEXT("POLYGON"), TEXT("POLYLINE"), TEXT("RECT"), TEXT("REDACT"), TEXT("STAMP"), TEXT("TEXT"), TEXT("AUTOMATION") }; LRESULT Child_OnUserMsg(HWND hwnd, L_INT id, LPARAM lParam) { L_TCHAR s[50]; HANNOBJECT hObject = (HANNOBJECT)lParam; L_UINT uType; if( L_AnnGetType( hObject, &uType ) == SUCCESS ) { if(uType < sizeof( szObjectTypes ) / sizeof( szObjectTypes [ 0 ] ) ) wsprintf(s, TEXT("Object type = %s, wParam = %d"), (LPTSTR)szObjectTypes[uType], id); else wsprintf(s, TEXT("Object type = Unknown(%d), wParam = %d"), uType, id); } else wsprintf(s, TEXT("Unknown object - cannot get the type, wParam = %d"), id); MessageBox(hwnd, s, TEXT("HYPERLINK USER MESSAGE"), MB_OK); return(0); } //........................................................................................ // // // //........................................................................................ L_VOID Child_OnLButtonDown(HWND hwnd, L_BOOL fDoubleClick, L_INT x, L_INT y, UINT keyFlags) { L_UINT uTool, uCur ; LPCHILDDATA pData ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; uCur = pData -> uCurPage ; // If the current tool is user tool, create two annotation objects: an ellipse inside a rectangle L_AnnGetToolBarChecked(hwndToolBar, &uTool); if(uTool == ANNTOOL_USER) { POINT pt; L_AnnCreateItem(pData->ppContList [uCur]->hContainer, ANNOBJECT_RECT, TRUE, &pData->hRect); L_AnnCreateItem(pData->ppContList [uCur]->hContainer, ANNOBJECT_ELLIPSE, TRUE, &pData->hEllipse); pt.x = x; pt.y = y; L_AnnDefine(pData->hRect, &pt, ANNDEFINE_BEGINSET); L_AnnDefine(pData->hEllipse, &pt, ANNDEFINE_BEGINSET); pData->fCapture = TRUE; } } //........................................................................................ // // // //........................................................................................ L_VOID Child_OnMouseMove(HWND hwnd, L_INT x, L_INT y, UINT keyFlags) { L_UINT uCur ; LPCHILDDATA pData ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; uCur = pData ->uCurPage ; if(pData->fCapture) { POINT pt; pt.x = x; pt.y = y; L_AnnDefine(pData->hRect, &pt, ANNDEFINE_APPEND); L_AnnDefine(pData->hEllipse, &pt, ANNDEFINE_APPEND); } } //........................................................................................ // // // //........................................................................................ BOOL Child_OnEraseBkgnd ( HWND hWnd, HDC hDC ) { LPCHILDDATA pData ; HRGN hrgnView = NULL ; HRGN hrgnClient = NULL ; RECT rcClient ; HBRUSH hbrBack ; pData = (LPCHILDDATA) GetWindowLong ( hWnd, GWL_USERDATA) ; if(!pData->bDoubleBuffer) { if ( NULL != pData ) { GetClientRect ( hWnd, &rcClient ) ; hrgnView = CreateRectRgn ( pData->rcView.left, pData->rcView.top, pData->rcView.right, pData->rcView.bottom ) ; hrgnClient = CreateRectRgn ( rcClient.left, rcClient.top, rcClient.right, rcClient.bottom ) ; // hbrBack = CreateSolidBrush ( GetSysColor ( COLOR_WINDOW ) ) ; hbrBack = GetStockObject(GRAY_BRUSH); CombineRgn ( hrgnView, hrgnClient, hrgnView, RGN_XOR ) ; SaveDC ( hDC ) ; SelectClipRgn ( hDC, hrgnView ) ; FillRect ( hDC, &rcClient, hbrBack ) ; RestoreDC ( hDC, -1 ) ; DeleteRgn ( hrgnView ) ; DeleteRgn ( hrgnClient ) ; DeleteBrush ( hbrBack ) ; return TRUE ; } else { return FALSE ; } } return TRUE; } //........................................................................................ // // // //........................................................................................ L_VOID Child_OnLButtonUp(HWND hwnd, L_INT x, L_INT y, UINT keyFlags) { L_UINT uCur ; LPCHILDDATA pData ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; uCur = pData ->uCurPage ; if(pData->fCapture) { POINT pt; pt.x = x; pt.y = y; L_AnnDefine(pData->hRect, &pt, ANNDEFINE_END); L_AnnDefine(pData->hEllipse, &pt, ANNDEFINE_END); pData->fCapture = FALSE; // set the new objects to be selected and set the default annotation properties L_AnnSetSelected(pData->ppContList [uCur]->hContainer, FALSE, ANNFLAG_RECURSE); L_AnnSetSelected(pData->hRect, TRUE, 0); L_AnnSetSelected(pData->hEllipse, TRUE, 0); // set the default settings from the automation object L_AnnSetAutoDefaults(pData->hAutomation, pData->ppContList [uCur]->hContainer, ANNFLAG_SELECTED|ANNFLAG_RECURSE); pData->hRect = pData->hEllipse = NULL; // set the toolbar tool to be ANNTOOL_SELECT to mimic what the other tools do L_AnnSetToolBarChecked(hwndToolBar, ANNTOOL_SELECT); ToolChecked(hwndFrame, ANNTOOL_SELECT); L_AnnGroup(pData->ppContList [uCur]->hContainer, ANNFLAG_SELECTED|ANNFLAG_RECURSE, NULL); } } //........................................................................................ // // // //........................................................................................ LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { HANDLE_MSG (hwnd, WM_CREATE, Child_OnCreate); HANDLE_MSG (hwnd, WM_PALETTECHANGED, Child_OnPaletteChanged); HANDLE_MSG (hwnd, WM_QUERYNEWPALETTE, Child_OnQueryNewPalette); HANDLE_MSG (hwnd, WM_DESTROY, Child_OnDestroy); HANDLE_MSG (hwnd, WM_MDIACTIVATE, Child_MDIActivate); HANDLE_MSG (hwnd, WM_COMMAND, Child_OnCommand); HANDLE_MSG (hwnd, WM_PAINT, Child_OnPaint); HANDLE_MSG (hwnd, WM_SIZE, Child_OnSize); HANDLE_MSG (hwnd, WM_HSCROLL, Child_OnHScroll); HANDLE_MSG (hwnd, WM_VSCROLL, Child_OnVScroll); HANDLE_MSG (hwnd, WM_ERASEBKGND, Child_OnEraseBkgnd); HANDLE_MSG (hwnd, WM_LTANNEVENT, Child_OnLtAnnEvent); HANDLE_MSG (hwnd, WM_USERMSG, Child_OnUserMsg); HANDLE_MSG (hwnd, WM_LBUTTONDOWN, Child_OnLButtonDown); HANDLE_MSG (hwnd, WM_MOUSEMOVE, Child_OnMouseMove); HANDLE_MSG (hwnd, WM_LBUTTONUP, Child_OnLButtonUp); } return(DefMDIChildProc (hwnd, msg, wParam, lParam)); } //........................................................................................ // // // //........................................................................................ static SAVEDLGPARAMS FSParm; static OPENFILENAME SaveFileName; static L_VOID SaveBitmap(HWND hwnd) { L_UINT i ; HCURSOR hCursor; L_INT nRet; L_UINT uCur ; LPCHILDDATA pData ; BITMAPHANDLE TempBitmap ; pData = (LPCHILDDATA) GetWindowLong ( hwnd, GWL_USERDATA) ; if( gbWangMode == TRUE ) // Check if the images will lost some properties { for ( i = 0; i < pData -> uPagesCount; i ++ ) { nRet = CheckAnnEnumerate ( hwnd, pData -> ppContList [i] -> hContainer ) ; if ( nRet == IDNO ) return ; if ( nRet == IDYES ) break ; } } memset(&SaveFileName,0,sizeof(SaveFileName)); memset(&FSParm,0,sizeof(FSParm)); FSParm.uStructSize = sizeof(FSParm); SaveFileName.nFilterIndex = 56; /* TIF 1-bit */ SaveFileName.lStructSize = sizeof(OPENFILENAME); SaveFileName.lpstrInitialDir = NULL; SaveFileName.lpstrTitle = TEXT("Save As"); SaveFileName.nFileOffset = 0; SaveFileName.Flags = 0; FSParm.nQFactor = 2; FSParm.pFileFormats = &SaveFormat; FSParm.uFileFormatsCount = 1; nRet = L_DlgSave( hwnd,&SaveFileName,&FSParm); uCur = pData -> uCurPage ; if(nRet == SUCCESS_DLG_OK) { hCursor = SetCursor (LoadCursor (NULL, IDC_WAIT)) ; if ( gbWangMode == TRUE ) // save as Wang annotation { for ( i = 0; i < pData -> uPagesCount; i ++ ) { L_GetDefaultSaveFileOption(&SaveFileOption, sizeof(SAVEFILEOPTION)); SaveFileOption.PageNumber = i + 1 ; SaveFileOption.Flags |= ESO_REPLACEPAGE ; nRet = L_AnnSaveTag( pData -> ppContList [i] -> hContainer, ANNFMT_WANGTAG, FALSE ) ; L_GetBitmapListItem ( pData -> hList, i, &TempBitmap,sizeof(BITMAPHANDLE) ) ; nRet = L_SaveBitmap( FSParm.szFileName, &TempBitmap, FSParm.nFormat, FSParm.nBitsPerPixel, FSParm.nQFactor, &SaveFileOption ); nRet = L_SetTag(ANNTAG_TIFF, 0, 0, NULL) ; } } else { HGLOBAL hTag=0; // Memory handle // save as Lead Format for ( i = 0; i < pData -> uPagesCount; i ++ ) { L_GetDefaultSaveFileOption(&SaveFileOption, sizeof(SAVEFILEOPTION)); SaveFileOption.PageNumber = i + 1 ; SaveFileOption.Flags |= ESO_REPLACEPAGE ; L_AnnSetLeadTag ( &pData -> ppContList [i] -> hContainer, FALSE, &hTag ) ; L_GetBitmapListItem ( pData -> hList, i, &TempBitmap,sizeof(BITMAPHANDLE) ) ; nRet = L_SaveBitmap( FSParm.szFileName, &TempBitmap, FSParm.nFormat, FSParm.nBitsPerPixel, FSParm.nQFactor, &SaveFileOption ); nRet = L_SetTag( ANNTIFF_LEADTAG, 0, 0, NULL) ; GlobalUnlock (hTag); GlobalFree (hTag); } } SetCursor (hCursor); } } //........................................................................................ // // // //........................................................................................ L_INT L_EXPORT EXT_CALLBACK EnumerateSelectedCallback ( HANNOBJECT hObject, L_INT L_FAR * pUserData) { L_BOOL bSelected ; L_UINT ObjectType; L_INT ObjectCount; ObjectCount = (L_INT) *pUserData; L_AnnGetType (hObject, &ObjectType) ; L_AnnGetSelected ( hObject, &bSelected ) ; if ( bSelected == TRUE ) { ObjectCount ++ ; } *pUserData = ObjectCount; return SUCCESS; } //........................................................................................ // // // //........................................................................................ L_VOID EnumerateSelectedObjects ( HWND hWnd, HANNOBJECT hContainer ) { L_TCHAR szMessage[80]; L_INT SelectedObjectCount; L_INT L_FAR * pCount = &SelectedObjectCount; SelectedObjectCount = 0; L_AnnEnumerate(hContainer, EnumerateSelectedCallback, pCount, ANNFLAG_RECURSE, NULL ) ; wsprintf (szMessage, TEXT("%d Selected Item in this Page "), SelectedObjectCount); MessageBox (hWnd, szMessage, TEXT("Notice"), MB_OK); return; } //........................................................................................ // // // //........................................................................................ L_BOOL CALLBACK L_EXPORT AboutDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return(TRUE); case WM_COMMAND: switch (CTLID(wParam, lParam)) { case IDOK: case IDCANCEL: EndDialog (hDlg, 0); return(TRUE); } } return(FALSE); } //........................................................................................ // // // //........................................................................................ L_INT L_EXPORT EXT_CALLBACK CheckAnnCallback (HANNOBJECT hObject, L_INT L_FAR * pUserData) { L_UINT ObjectType; L_INT ObjectCount; ObjectCount = (L_INT) *pUserData; L_AnnGetType (hObject, &ObjectType); if (( ObjectType == ANNOBJECT_ELLIPSE ) || ( ObjectType == ANNOBJECT_STAMP ) || ( ObjectType == ANNOBJECT_FREEHANDHOTSPOT ) || ( ObjectType == ANNOBJECT_HOTSPOT ) || ( ObjectType == ANNOBJECT_AUDIO ) || ( ObjectType == ANNOBJECT_VIDEO ) || ( ObjectType == ANNOBJECT_PUSHPIN ) ) { ObjectCount ++ ; } *pUserData = ObjectCount; return SUCCESS; } //........................................................................................ // // // //........................................................................................ L_INT CheckAnnEnumerate(HWND hWnd, HANNOBJECT hContainer ) { L_INT nRet = 100 ; // initialization value different from IDOK and IDNO L_TCHAR szMessage[ 255 ] ; L_INT ObjectCount; L_INT L_FAR *pCount = &ObjectCount; ObjectCount = 0; L_AnnEnumerate(hContainer, CheckAnnCallback, pCount, ANNFLAG_RECURSE, NULL); if ( ObjectCount > 0 ) { wsprintf (szMessage, TEXT("%s %s "), TEXT("You are using Wang save mode. \n Some Annotations may lose some properties.\n"), TEXT("Do You want to continue? ") ); nRet = MessageBox ( hWnd, szMessage, TEXT("Notice"), MB_YESNO | MB_ICONEXCLAMATION ) ; } return nRet ; } //........................................................................................ // // // //........................................................................................ L_BOOL CALLBACK L_EXPORT HyperlinkDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static LPHYPERLINKPARM pParm; switch (message) { case WM_INITDIALOG: pParm = (LPHYPERLINKPARM) lParam; CheckRadioButton(hDlg, IDC_RADIO1, IDC_RADIO5, IDC_RADIO1 + pParm->uType); if(pParm->uType == ANNLINK_RUN) SetDlgItemText(hDlg, IDC_EDIT1, pParm->Buffer); else if(pParm->uType == ANNLINK_WEBPAGE) SetDlgItemText(hDlg, IDC_EDIT2, pParm->Buffer); EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), pParm->uType == ANNLINK_RUN); EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), pParm->uType == ANNLINK_RUN); EnableWindow(GetDlgItem(hDlg, IDC_EDIT2), pParm->uType == ANNLINK_WEBPAGE); return (TRUE); case WM_COMMAND: switch (CTLID(wParam, lParam)) { case IDC_RADIO1: case IDC_RADIO2: case IDC_RADIO3: case IDC_RADIO4: case IDC_RADIO5: switch(NOTIFYCODE(wParam, lParam)) { case BN_CLICKED: EnableWindow(GetDlgItem(hDlg, IDC_EDIT1), CTLID(wParam, lParam) == IDC_RADIO4); EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), CTLID(wParam, lParam) == IDC_RADIO4); EnableWindow(GetDlgItem(hDlg, IDC_EDIT2), CTLID(wParam, lParam) == IDC_RADIO5); break; } break; case IDOK: if(IsDlgButtonChecked(hDlg, IDC_RADIO1) == BST_CHECKED) pParm->uType = ANNLINK_NONE; else if(IsDlgButtonChecked(hDlg, IDC_RADIO2) == BST_CHECKED) pParm->uType = ANNLINK_LTANNEVENT; else if(IsDlgButtonChecked(hDlg, IDC_RADIO3) == BST_CHECKED) { pParm->uType = ANNLINK_USERMSG; pParm->uMsg = WM_USERMSG; /* set a user message and a wParam */ pParm->wParam = 0; } else if(IsDlgButtonChecked(hDlg, IDC_RADIO4) == BST_CHECKED) { pParm->uType = ANNLINK_RUN; GetDlgItemText(hDlg, IDC_EDIT1, pParm->Buffer, sizeof(pParm->Buffer)); if(!pParm->Buffer[0]) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_EDIT1)); return TRUE; } } else if(IsDlgButtonChecked(hDlg, IDC_RADIO5) == BST_CHECKED) { pParm->uType = ANNLINK_WEBPAGE; GetDlgItemText(hDlg, IDC_EDIT2, pParm->Buffer, sizeof(pParm->Buffer)); if(!pParm->Buffer[0]) { MessageBeep (0); SetFocus (GetDlgItem (hDlg, IDC_EDIT2)); return TRUE; } } else /* one of the type buttons has to be checked!! */ { MessageBeep (0); return TRUE; } EndDialog (hDlg, IDOK); return (TRUE); case IDCANCEL: EndDialog (hDlg, IDCANCEL); return (TRUE); } } return (FALSE); } //........................................................................................ // // // //........................................................................................ static L_INT GetHyperlink (HWND hWnd, HANNOBJECT hObject, LPCHILDDATA pData) { HYPERLINKPARM Parm; L_INT nRet; L_UINT uCur = pData -> uCurPage ; nRet = L_AnnGetHyperlink(hObject, &Parm.uType, &Parm.uMsg, &Parm.wParam, &Parm.Buffer[0]); if(nRet != SUCCESS) return nRet; switch ( DoDialogBoxParam (IDD_HYPERLINK, hWnd, (DLGPROC) HyperlinkDlgProc, (LPARAM) (LPHYPERLINKPARM) &Parm)) { case IDOK: /* hObject is pData->hAutomation in one or two cases: a) there are no objects selected and you want to change the default properties of the objects that will be created or b) there are 2 or more objects that are selected and whose Hyperlinks need to be changed otherwise (if there is only one object selected) hObject is the handle of the selected object I change the automation object as well as the selected object(s) so that the newly created objects will have the same hyperlink as the last object's Hyperlink. If you don't want this, remove the line with L_AnnSetHyperlink(pData->hAutomation... */ if( hObject == pData -> hAutomation ) /* change the automation object and all selected objects */ { L_AnnSetHyperlink(pData->hAutomation, Parm.uType, Parm.uMsg, Parm.wParam, Parm.Buffer, 0); nRet = L_AnnSetHyperlink(pData->ppContList [uCur]-> hContainer, Parm.uType, Parm.uMsg, Parm.wParam, Parm.Buffer, ANNFLAG_RECURSE|ANNFLAG_SELECTED); } else /* change the automation object and the selected object */ { L_AnnSetHyperlink(pData->hAutomation, Parm.uType, Parm.uMsg, Parm.wParam, Parm.Buffer, 0); nRet = L_AnnSetHyperlink(hObject, Parm.uType, Parm.uMsg, Parm.wParam, Parm.Buffer, 0); } return nRet; case IDCANCEL: default: break; } return (SUCCESS); } //end.of.file,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,