/*[]=====================================================================[]*/ /*[] LEADTOOLS for Windows - Version 10 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2000 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[]=====================================================================[]*/ /*---(Dicom)------------------------------------------------------------ LEAD Functions Used. L_DicomCreateDS L_DicomResetDS L_DicomFreeDS L_DicomLoadDS L_DicomSaveDS L_DicomGetFirstElement L_DicomGetRootElement L_DicomGetChildElement L_DicomGetParentElement L_DicomGetNextElement L_DicomFindTag L_FreeBitmap L_GetBitmapListCount L_DeleteBitmapListItems L_DicomExistsElement L_DicomGetCountImage L_DicomGetCountValue L_GetBitmapListItem L_CreatePaintPalette L_PaintDC L_DicomGetCharValue L_DicomFreeValue L_DicomGetBinaryValue L_DicomGetCharValue L_DicomGetShortValue L_DicomGetLongValue L_DicomGetFloatValue L_DicomGetDoubleValue L_DicomGetStringValue L_DicomGetAgeValue L_DicomGetDateValue L_DicomGetTimeValue L_DicomGetDateTimeValue L_DicomGetCountImage L_DicomGetInfoImage L_DicomGetImage L_DicomConformanceDS L_DicomGetInfoImage L_DicomGetCountModule L_DicomGetInfoDS L_DicomFindIndexModule L_DicomGetChildElement L_DicomGetNextElement L_DicomGetInfoDS L_DicomDeleteElement L_DicomDeleteModule L_DicomSetImage L_DicomDeleteImage We have made the assumption that the user has the knowledge of programing in C and Windows. This example will: 1. load a dicom file, and add all the elements to a tree control 2. display the image in a window when a pixel data tag is clicked Usage: DICOM --------------------------------------------------------------------------*/ #include /* Required for all Windows applications. */ #include /* Needed for message crackers. */ #include /* Windows' header for common dialog box. */ #include /* Standard C header files. */ #include #include /* Windows' header for common controls. */ #include #include "..\\..\\..\\include\\l_bitmap.h" /* LEADTOOLS main header file. */ #include "..\\..\\..\\include\\l_error.h" /* LEADTOOLS error definition header file. */ #include "..\\..\\..\\include\\ltdic.h" /* LEADTOOLS main header file. */ #include "..\\..\\..\\include\\lttmb.h" #include "dicom.h" /* Application specific header file. */ #include "resource.h" /*---[WinMain]--------------------------------------------------------------- Syntax: int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) Parameters: hInstance Current instance. hPrevInstance previous instance. lpCmdLine command line. nCmdShow show-window type. Prototype: Windows.h Notes: Windows main function, calls initialization function and processes message loop. --------------------------------------------------------------------------*/ L_INT nBitmapsCount; L_INT nImageListCount = 15; int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { L_INT nRetCode; UNLOCKSUPPORT (); if(L_IsSupportLocked(L_SUPPORT_MEDICAL)) { MessageBox(NULL, "Medical-Express Support Must be unlocked for this demo!", "Error", MB_OK); return -1; } Data.hInst = hInstance; InitCommonControls(); L_DlgInit(DLG_INIT_COLOR); nRetCode = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DICOMDLG), NULL, DicomDlgProc); L_DlgFree(); return nRetCode; } BOOL CALLBACK DicomDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HDC hDC=NULL; HCURSOR hOldCursor=NULL; HICON m_hIcon; switch(uMsg) { case WM_INITDIALOG: Data.OldProc = (WNDPROC)GetWindowLong(GetDlgItem(hDlg, IDC_IMAGEBTN), GWL_WNDPROC); SetWindowLong(GetDlgItem(hDlg, IDC_IMAGEBTN), GWL_WNDPROC, (long)(WNDPROC)ImageBtnWindowProc); ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_IMAGEBTN), SW_HIDE); Data.bLoaded = FALSE; Data.LoadFlags = 0; Data.SaveFlags = 0; Data.nSaveCompression = IMAGE_COMPRESSION_NONE; Data.nSavePhotometric = IMAGE_PHOTOMETRIC_RGB; Data.nSaveBitsPerPixel = 24; Data.nSaveQFactor = 2; Data.nTempQFactor = 2; Data.bAnimationLoop = TRUE; Data.bAnimationPlay = FALSE; Data.bChild = FALSE; Data.bSequence = FALSE; Data.bFit = FALSE; Data.Zoom = 100; Data.bImage = FALSE; Data.bHighLevel= FALSE; Data.pCurrentElement = NULL; Data.nCurrentModule = (L_UINT32)-1; Data.hDicomDS = L_DicomCreateDS(NULL); Data.hImageList = ImageList_LoadBitmap(Data.hInst, MAKEINTRESOURCE(IDB_BITMAP1), 16, 0, CLR_NONE); Data.lItemCount = 0; Data.pItems = NULL; L_DicomGetJ2KOptions(Data.hDicomDS,&Data.J2KOptions,sizeof(FILEJ2KOPTIONS)); TreeView_SetImageList(GetDlgItem(hDlg, IDC_TREE1), Data.hImageList, TVSIL_NORMAL); Data.hBitmapList = NULL; L_CreateBitmapList(&Data.hBitmapList); if(!Data.hDicomDS) { MessageBox(hDlg, "Error Creating DataSet", "Error", MB_OK); EndDialog(hDlg, FALSE); return FALSE; } UpdateMenuStatus(hDlg); m_hIcon = (HICON) LoadImage( Data.hInst, MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); SendMessage(hDlg,WM_SETICON, ICON_SMALL, (LPARAM) m_hIcon); break; case WM_NOTIFY: HandleNotify(hDlg, wParam, (LPNMHDR)lParam); return FALSE; break; case WM_DRAWITEM: DrawImageBtn(hDlg, (LPDRAWITEMSTRUCT)lParam); return FALSE; break; case WM_DESTROY: SetWindowLong(GetDlgItem(hDlg, IDC_IMAGEBTN), GWL_WNDPROC, (long)(WNDPROC)Data.OldProc); if(Data.bLoaded) L_DicomResetDS(Data.hDicomDS); Data.bLoaded = FALSE; L_DicomFreeDS(Data.hDicomDS); if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); if(Data.hBitmapList) L_DestroyBitmapList(Data.hBitmapList); return FALSE; break; case WM_COMMAND: if(Data.bAnimationPlay) Data.bAnimationPlay = FALSE; switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: case IDABORT: case ID_FILE_EXIT: EndDialog(hDlg, TRUE); break; case ID_FILE_LOAD: LoadDS(hDlg); return FALSE; break; case ID_FILE_SAVE: SaveDS(hDlg); return FALSE; break; case ID_VIEW_LOWLEVELTREE: FillTreeLowLevel(hDlg); UpdateMenuStatus(hDlg); return FALSE; break; case ID_VIEW_HIGHLEVEL: FillTreeHighLevel(hDlg); UpdateMenuStatus(hDlg); return FALSE; break; case ID_OPTIONS_LOAD: DialogBox(Data.hInst, MAKEINTRESOURCE(IDD_LOADOPT), hDlg, LoadOptDlgProc); return FALSE; break; case ID_OPTIONS_SAVE: DialogBox(Data.hInst, MAKEINTRESOURCE(IDD_SAVEOPT), hDlg, SaveOptDlgProc); return FALSE; break; case ID_OPTIONS_CONFORMANCETEST: /* start the test */ hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); L_DicomConformanceDS(Data.hDicomDS, ConformanceCallback, (L_VOID L_FAR*)hDlg); SetCursor(hOldCursor); return FALSE; break; case ID_DATASET_INSELEMENT: InsertDSElement(hDlg); return FALSE; break; case ID_DATASET_INSMODULE: InsertDSModule(hDlg); return FALSE; break; case ID_DATASET_DELELEMENT: DeleteDSElement(hDlg); return FALSE; break; case ID_DATASET_DELMODULE: DeleteDSModule(hDlg); return FALSE; break; case ID_DATASET_INFO: ShowDSInfo(hDlg); return FALSE; break; case IDC_LIST1: if(HIWORD(wParam)==LBN_DBLCLK) EditValue(hDlg); return FALSE; break; case ID_DATASET_EDITVALUE: EditValue(hDlg); return FALSE; break; case ID_FLIP: case ID_REVERSE: case ID_ROTATE: case ID_RESIZE: case ID_POSTERIZE: case ID_MOSAIC: case ID_AVERAGE: case ID_MEDIAN: case ID_SHARPEN: case ID_OILIFY: case ID_MIN: case ID_MAX: case ID_SOLARIZE: case ID_GRADIENT: case ID_LAPLACE: case ID_SOBEL: case ID_PREWITT: case ID_SHIFTDIFF: case ID_LINESEG: case ID_EROSION: case ID_DILATION: case ID_HALFTONE: case ID_GRAYSCALE8: case ID_GRAYSCALE12: case ID_GRAYSCALE16: case ID_COLORRES: case ID_WINDOWLEVEL: case ID_INVERT: case ID_BRIGHTNESS: case ID_CONTRAST: case ID_HUE: case ID_SATURATION: case ID_HISTOEQUALIZE: case ID_STRETCHINTENSITY: case ID_GAMMA: case ID_DETECT: case ID_HISTOCONTRAST: ProcessImage(hDlg, GET_WM_COMMAND_ID(wParam, lParam)); break; case ID_VIEWOPT_NORMAL: case ID_VIEWOPT_FIT: case ID_VIEWOPT_ZOOMIN_2: case ID_VIEWOPT_ZOOMIN_4: case ID_VIEWOPT_ZOOMOUT_2: case ID_VIEWOPT_ZOOMOUT_4: HandleViewOpt(hDlg, GET_WM_COMMAND_ID(wParam, lParam)); return FALSE; break; case ID_VIEWOPT_ANIMATION: hDC = GetWindowDC(GetDlgItem(hDlg, IDC_IMAGEBTN)); PlayAnimation(hDC); ReleaseDC(GetDlgItem(hDlg, IDC_IMAGEBTN), hDC); return FALSE; break; case ID_VIEWOPT_ANIMATIONLOOP: Data.bAnimationLoop = !Data.bAnimationLoop; UpdateMenuStatus(hDlg); return FALSE; break; case ID_VIEWOPT_FIRSTFRAME: Data.BitmapListIndex = 0; UpdateMenuStatus(hDlg); InvalidateRect(GetDlgItem(hDlg, IDC_IMAGEBTN), NULL, TRUE); UpdateWindow(GetDlgItem(hDlg, IDC_IMAGEBTN)); return FALSE; break; case ID_VIEWOPT_NEXTFRAME: Data.BitmapListIndex++; UpdateMenuStatus(hDlg); InvalidateRect(GetDlgItem(hDlg, IDC_IMAGEBTN), NULL, TRUE); UpdateWindow(GetDlgItem(hDlg, IDC_IMAGEBTN)); return FALSE; break; case ID_VIEWOPT_PREVFRAME: Data.BitmapListIndex--; UpdateMenuStatus(hDlg); InvalidateRect(GetDlgItem(hDlg, IDC_IMAGEBTN), NULL, TRUE); UpdateWindow(GetDlgItem(hDlg, IDC_IMAGEBTN)); return FALSE; break; case ID_VIEWOPT_LASTFRAME: Data.BitmapListIndex = Data.BitmapListCount-1; UpdateMenuStatus(hDlg); InvalidateRect(GetDlgItem(hDlg, IDC_IMAGEBTN), NULL, TRUE); UpdateWindow(GetDlgItem(hDlg, IDC_IMAGEBTN)); return FALSE; break; case ID_VIEWOPT_IMAGEINFO: ShowInformation(hDlg); return FALSE; break; case ID_TABLES_VALUEREPRESENTATIONVR: { int iRet; iRet = DialogBoxParam(Data.hInst, MAKEINTRESOURCE (IDD_DICOMVRTABLE), hDlg, VRTableDlgProc, 0); } break; case ID_TABLES_UNIQUEIDENTIFIERUID: { int iRet; iRet = DialogBoxParam(Data.hInst, MAKEINTRESOURCE (IDD_DICOMUIDTABLE), hDlg, UITableDlgProc, 0); } break; case ID_TABLES_ELEMENTTAG: { int iRet; iRet = DialogBoxParam(Data.hInst, MAKEINTRESOURCE (IDD_DICOMTAGTABLE), hDlg, TagTableDlgProc, 0); } break; case ID_TABLES_INFORMATIONOBJECTDEFINITIONIOD: { int iRet; iRet = DialogBoxParam(Data.hInst, MAKEINTRESOURCE (IDD_DICOMIODTABLE), hDlg, IODTableDlgProc, 0); } break; } return FALSE; break; default: return FALSE; } return TRUE; } L_VOID LoadDS(HWND hDlg) { L_UINT16 uRet; HCURSOR hOld=NULL; L_CHAR szCaption[L_MAXPATH+80]; L_BOOL bRet = TRUE; DICOMIMAGE Info; bRet = GetFilename(hDlg, ID_FILE_LOAD); if(bRet) { if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); L_GetBitmapListCount(Data.hBitmapList, &Data.BitmapListCount); if(Data.BitmapListCount > 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); ListBox_ResetContent(GetDlgItem(hDlg, IDC_LIST1)); InvalidateRect(GetDlgItem(hDlg, IDC_IMAGEBTN), NULL, TRUE); UpdateWindow(GetDlgItem(hDlg, IDC_IMAGEBTN)); L_DicomResetDS(Data.hDicomDS); lstrcpy(szCaption, DLGCAPTION); SetWindowText(hDlg, szCaption); Data.bLoaded = FALSE; hOld = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); uRet = L_DicomLoadDS(Data.hDicomDS, Data.szFilename, Data.LoadFlags); SetCursor(hOld); if(uRet != DICOM_SUCCESS) { MessageBox(hDlg, "Error Loading DataSet!\nNot a DICOM File!", "Error", MB_OK); return; } Data.pCurrentElement = L_DicomGetFirstElement(Data.hDicomDS, NULL, FALSE, FALSE); bRet = L_DicomGetInfoImage(Data.hDicomDS, Data.pCurrentElement, &Info, 0); Data.nSaveCompression = Info.nCompression; Data.nSavePhotometric = Info.nPhotometric; Data.nSaveBitsPerPixel = Info.nBitsPerPixel; Data.nSaveQFactor = 2; lstrcat(szCaption, " - "); lstrcat(szCaption, Data.szFilename); SetWindowText(hDlg, szCaption); FillTreeHighLevel(hDlg); Data.bLoaded = TRUE; Data.pCurrentElement = L_DicomGetFirstElement(Data.hDicomDS, NULL, FALSE, FALSE); UpdateMenuStatus(hDlg); } return; } L_VOID SaveDS(HWND hDlg) { L_UINT16 uRet; HCURSOR hOld=NULL; L_BOOL bRet = TRUE; bRet = GetFilename(hDlg, ID_FILE_SAVE); if (bRet != SUCCESS) return; hOld = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); uRet = L_DicomSaveDS(Data.hDicomDS, Data.szFilename, Data.SaveFlags); SetCursor(hOld); if(uRet != DICOM_SUCCESS) { MessageBox(hDlg, "Error Saving DataSet!", "Error", MB_OK); return; } return; } L_BOOL GetFilename(HWND hDlg, L_INT nID) { OPENFILENAME ofn; ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hDlg; ofn.lpstrFilter = TEXT("DICOM Files (*.dic;*.dcm)\0*.dic;*.dcm\0All files (*.*)\0*.*\0"); ofn.nFilterIndex = 1; ofn.lpstrFile = Data.szFilename; ofn.nMaxFile = sizeof(Data.szFilename) / sizeof(TCHAR); ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | ((nID == ID_FILE_LOAD) ? OFN_FILEMUSTEXIST : OFN_OVERWRITEPROMPT); return ((nID == ID_FILE_LOAD) ? GetOpenFileName(&ofn) : GetSaveFileName(&ofn)); } L_VOID FillTreeLowLevel(HWND hDlg) { Data.bLoaded = FALSE; TreeView_DeleteAllItems(GetDlgItem(hDlg, IDC_TREE1)); Data.pCurrentElement=NULL; /* move to root of tree */ Data.pCurrentElement = L_DicomGetFirstElement(Data.hDicomDS, NULL, FALSE, FALSE); /* move to first Element in Data Set */ Data.pCurrentElement = L_DicomGetRootElement(Data.hDicomDS, Data.pCurrentElement); /* get the root of this element */ if(!Data.pCurrentElement) { MessageBox(hDlg, "Error Reading Data Set!", "Error", MB_OK); return; } /* now, add the Elements */ while(Data.pCurrentElement) { FillSubTreeLowLevel(hDlg, Data.pCurrentElement, NULL); Data.pCurrentElement = L_DicomGetNextElement(Data.hDicomDS, Data.pCurrentElement, TRUE, FALSE); } Data.bLoaded = TRUE; Data.bHighLevel = FALSE; return; } L_VOID FillSubTreeLowLevel(HWND hDlg, pDICOMELEMENT pCurrentElement, HTREEITEM hParent) { HTREEITEM hItem=NULL; L_CHAR L_FAR* pszText=NULL; L_CHAR szItem[] = "Item"; pDICOMELEMENT pChild=NULL; pDICOMTAG pTag=NULL; TV_INSERTSTRUCT tvis; /* add the node to the tree */ pTag = L_DicomFindTag(pCurrentElement->nTag); if(pTag) pszText = pTag->pszName; else pszText = szItem; pChild = L_DicomGetChildElement(Data.hDicomDS, pCurrentElement, FALSE); /* does this node have a child? */ tvis.hParent = hParent; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE; tvis.item.lParam = (LPARAM)pCurrentElement; tvis.item.pszText = pszText; if(pChild) tvis.item.iImage = IMAGE_FOLDER_CLOSED; else tvis.item.iImage = IMAGE_ITEM; tvis.item.iSelectedImage = tvis.item.iImage; hItem = TreeView_InsertItem(GetDlgItem(hDlg, IDC_TREE1), &tvis); if(!hItem) { MessageBox(hDlg, "Error", "Error", MB_OK); return; } if(pChild) { FillSubTreeLowLevel(hDlg, pChild, hItem); } if(L_DicomGetLevelElement(Data.hDicomDS, pCurrentElement)) { /* move to next node in same level (if one) */ pCurrentElement = L_DicomGetNextElement(Data.hDicomDS, pCurrentElement, TRUE, FALSE); if(pCurrentElement) FillSubTreeLowLevel(hDlg, pCurrentElement, hParent); } return; } L_VOID HandleNotify(HWND hDlg, WPARAM idCtl, LPNMHDR pNMHDR) { TV_ITEM item; L_CHAR szText[200]; NM_TREEVIEW* pNMTreeView=NULL; if(idCtl == IDC_TREE1) { pNMTreeView = (NM_TREEVIEW*) pNMHDR; switch(pNMHDR->code) { case TVN_SELCHANGED: SetWindowText(GetDlgItem(hDlg, IDC_TEXT1), ""); SetWindowText(GetDlgItem(hDlg, IDC_TEXT2), ""); SetWindowText(GetDlgItem(hDlg, IDC_TEXT3), ""); SetWindowText(GetDlgItem(hDlg, IDC_TEXT4), ""); ListBox_ResetContent(GetDlgItem(hDlg, IDC_LIST1)); if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); L_GetBitmapListCount(Data.hBitmapList, &Data.BitmapListCount); if(Data.BitmapListCount > 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); if(!Data.bLoaded) return; Data.nCurrentModule = (L_UINT32)-1; item.mask = TVIF_TEXT|TVIF_HANDLE|TVIF_PARAM; item.cchTextMax = sizeof(szText); item.hItem = pNMTreeView->itemNew.hItem; item.pszText = szText; TreeView_GetItem(GetDlgItem(hDlg, IDC_TREE1), &item); if(Data.bHighLevel) { /* if the item has a parent, it cannot be in the root, therefore it is not a module */ if(TreeView_GetParent(GetDlgItem(hDlg, IDC_TREE1), pNMTreeView->itemNew.hItem)) Data.pCurrentElement = (pDICOMELEMENT)item.lParam; else { Data.nCurrentModule = (L_UINT32)(item.lParam); UpdateMenuStatus(hDlg); return; } } else Data.pCurrentElement = (pDICOMELEMENT)(pNMTreeView->itemNew.lParam); if(!L_DicomExistsElement(Data.hDicomDS, Data.pCurrentElement)) { Data.pCurrentElement = NULL; return; } UpdateMenuStatus(hDlg); if(Data.pCurrentElement) DisplayElement(hDlg, Data.pCurrentElement, szText); break; case TVN_ITEMEXPANDED: item.hItem = pNMTreeView->itemNew.hItem; item.mask = TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE; if((pNMTreeView->itemNew.state & TVIS_EXPANDED)==TVIS_EXPANDED) item.iImage = IMAGE_FOLDER_OPEN; else item.iImage = IMAGE_FOLDER_CLOSED; item.iSelectedImage = item.iImage; TreeView_SetItem(GetDlgItem(hDlg, IDC_TREE1), &item); break; case NM_DBLCLK: // On a module? if (Data.nCurrentModule != (L_UINT32) -1) return; EditValue(hDlg); break; } } } L_VOID DisplayElement(HWND hDlg, pDICOMELEMENT pElement, L_CHAR L_FAR* pszNodeText) { HCURSOR hOldCursor=NULL; L_CHAR szTag[40]; L_CHAR szDisplay[200]; L_CHAR szVR[180]; L_CHAR szVRString[180]; pDICOMVR pVR=NULL; L_UINT32 lCount; if(!L_DicomExistsElement(Data.hDicomDS, pElement)) { Data.pCurrentElement = NULL; return; } wsprintf(szTag, "%04X:%04X", GETGROUP(pElement->nTag), GETELEMENT(pElement->nTag)); /* display info */ lstrcpy(szDisplay, szTag); lstrcat(szDisplay, " - "); lstrcat(szDisplay, pszNodeText); SetWindowText(GetDlgItem(hDlg, IDC_TEXT1), szDisplay); pVR = L_DicomFindVR(pElement->nVR); if(pVR) lstrcpy(szVR, pVR->pszName); else lstrcpy(szVR, "Unknown"); switch(pVR->nCode) { case VR_AE: wsprintf(szVRString, "AE - %s", szVR); break; case VR_AS: wsprintf(szVRString, "AS - %s", szVR); break; case VR_AT: wsprintf(szVRString, "AT - %s", szVR); break; case VR_CS: wsprintf(szVRString, "CS - %s", szVR); break; case VR_DA: wsprintf(szVRString, "DA - %s", szVR); break; case VR_DS: wsprintf(szVRString, "DS - %s", szVR); break; case VR_DT: wsprintf(szVRString, "DT - %s", szVR); break; case VR_FD: wsprintf(szVRString, "FD - %s", szVR); break; case VR_FL: wsprintf(szVRString, "FL - %s", szVR); break; case VR_IS: wsprintf(szVRString, "IS - %s", szVR); break; case VR_LO: wsprintf(szVRString, "LO - %s", szVR); break; case VR_LT: wsprintf(szVRString, "LT - %s", szVR); break; case VR_OB: wsprintf(szVRString, "OB - %s", szVR); break; case VR_OW: wsprintf(szVRString, "OW - %s", szVR); break; case VR_PN: wsprintf(szVRString, "PN - %s", szVR); break; case VR_SH: wsprintf(szVRString, "SH - %s", szVR); break; case VR_SL: wsprintf(szVRString, "SL - %s", szVR); break; case VR_SQ: wsprintf(szVRString, "SQ - %s", szVR); break; case VR_SS: wsprintf(szVRString, "SS - %s", szVR); break; case VR_ST: wsprintf(szVRString, "ST - %s", szVR); break; case VR_TM: wsprintf(szVRString, "TM - %s", szVR); break; case VR_UI: wsprintf(szVRString, "UI - %s", szVR); break; case VR_UL: wsprintf(szVRString, "UL - %s", szVR); break; case VR_UN: wsprintf(szVRString, "UN - %s", szVR); break; case VR_US: wsprintf(szVRString, "US - %s", szVR); break; case VR_UT: wsprintf(szVRString, "UT - %s", szVR); break; default: wsprintf(szVRString, "US - %s", szVR); break; } SetWindowText(GetDlgItem(hDlg, IDC_TEXT2), szVRString); wsprintf(szDisplay, "%ld", pElement->nLength); SetWindowText(GetDlgItem(hDlg, IDC_TEXT3), szDisplay); hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); lCount = L_DicomGetCountValue(Data.hDicomDS, pElement); SetCursor(hOldCursor); wsprintf(szDisplay, "%ld", lCount); SetWindowText(GetDlgItem(hDlg, IDC_TEXT4), szDisplay); switch(pElement->nVR) { case VR_OB: case VR_SQ: case VR_UN: lCount = L_DicomGetCountImage(Data.hDicomDS, pElement); if(lCount == 1) DisplayBitmap(hDlg, pElement); else if(lCount > 1) DisplayBitmapList(hDlg, pElement); else DisplayChar(hDlg, pElement); break; case VR_OW: case VR_SS: case VR_US: lCount = L_DicomGetCountImage(Data.hDicomDS, pElement); if(lCount == 1) DisplayBitmap(hDlg, pElement); else if(lCount > 1) DisplayBitmapList(hDlg, pElement); else DisplayValues(hDlg, pElement); /* DisplayShort(hDlg, pElement);*/ break; case VR_AT: case VR_IS: case VR_SL: case VR_UL: DisplayValues(hDlg, pElement); /* DisplayLong(hDlg, pElement);*/ break; case VR_FL: DisplayValues(hDlg, pElement); /* DisplayFloat(hDlg, pElement);*/ break; case VR_DS: case VR_FD: DisplayValues(hDlg, pElement); /* DisplayDouble(hDlg, pElement);*/ break; case VR_AE: case VR_CS: case VR_LO: case VR_LT: case VR_SH: case VR_ST: case VR_UI: case VR_UT: case VR_PN: DisplayValues(hDlg, pElement); /* DisplayString(hDlg, pElement);*/ break; case VR_AS: DisplayValues(hDlg, pElement); /* DisplayAge(hDlg, pElement);*/ break; case VR_DA: DisplayValues(hDlg, pElement); /* DisplayDate(hDlg, pElement);*/ break; case VR_TM: DisplayValues(hDlg, pElement); /* DisplayTime(hDlg, pElement);*/ break; case VR_DT: DisplayValues(hDlg, pElement); /* DisplayDateTime(hDlg, pElement);*/ break; default: lCount = L_DicomGetCountImage(Data.hDicomDS, pElement); if(lCount == 1) DisplayBitmap(hDlg, pElement); else if(lCount > 1) DisplayBitmapList(hDlg, pElement); else DisplayBinary(hDlg, pElement); break; } UpdateMenuStatus(hDlg); return; } L_VOID MatchAspectRatio (LPRECT pRect, L_INT nWidth, L_INT nHeight) { L_INT cxRect, cyRect; cyRect = RECTHEIGHT (pRect); cxRect = MulDiv (cyRect, nWidth, nHeight); if (cxRect > RECTWIDTH (pRect)) { cxRect = RECTWIDTH (pRect); cyRect = MulDiv (cxRect, nHeight, nWidth); } pRect->bottom = pRect->top + cyRect; pRect->right = pRect->left + cxRect; return; } L_VOID DisplayValues(HWND hDlg, pDICOMELEMENT pElement) { L_INT nLen; L_UINT32 lCount; L_UINT32 lSize; L_UINT32 x; L_CHAR L_FAR* pText=NULL; L_CHAR L_FAR* pTemp=NULL; L_CHAR L_FAR* pFind=NULL; L_CHAR L_FAR* pItem=NULL; HCURSOR hOldCursor=NULL; hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_IMAGEBTN), SW_HIDE); ListBox_ResetContent(GetDlgItem(hDlg, IDC_LIST1)); Data.bImage = FALSE; if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); L_GetBitmapListCount(Data.hBitmapList, &Data.BitmapListCount); if(Data.BitmapListCount > 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the values and display them */ lCount = L_DicomGetCountValue(Data.hDicomDS, Data.pCurrentElement); lSize = L_DicomGetConvertValue(Data.hDicomDS, Data.pCurrentElement, NULL); pText = (L_CHAR L_FAR*)GlobalAllocPtr(GMEM_MOVEABLE, lSize * sizeof(L_CHAR)); pTemp = pText; if(!pText) return; lSize = L_DicomGetConvertValue(Data.hDicomDS, Data.pCurrentElement, pText); if(lCount > 1) { for(x=0; x 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value */ GetWindowText(hDlg, szCaption, sizeof(szCaption)); nRet = L_DicomGetImage( Data.hDicomDS, pElement, &Data.Bitmap, sizeof(BITMAPHANDLE), 0, 0, ORDER_BGR, DICOM_GETIMAGE_AUTO_APPLY_MODALITY_LUT | DICOM_GETIMAGE_AUTO_APPLY_VOI_LUT | DICOM_GETIMAGE_ALLOW_RANGE_EXPANSION, LoadCallback, (L_VOID L_FAR*)hDlg); SetWindowText(hDlg, szCaption); if(nRet == DICOM_SUCCESS) { L_DicomFreeValue(Data.hDicomDS, Data.pCurrentElement); /* display the value */ SetRect(&Data.rcDst, 0, 0, Data.Bitmap.Width, Data.Bitmap.Height); Data.Width = Data.Bitmap.Width; Data.Height = Data.Bitmap.Height; Data.bFit = FALSE; Data.Zoom = 100; UpdateScrollBars(hDlg); Data.bImage = TRUE; UpdateMenuStatus(hDlg); InvalidateRect(GetDlgItem(hDlg, IDC_IMAGEBTN), NULL, TRUE); UpdateWindow(GetDlgItem(hDlg, IDC_IMAGEBTN)); } else MessageBox(hDlg, "Error reading bitmap!", "Error", MB_OK); SetCursor(hOldCursor); } L_INT L_FAR L_EXPORT LoadCallback(pFILEINFO pFileInfo, pBITMAPHANDLE pBitmap, L_UCHAR L_FAR *pBuffer, L_UINT uFlags, L_INT nRow, L_INT nLines, L_VOID L_FAR* pUserData) { L_CHAR szStatus[200]; L_INT nPercent; HWND hDlg = (HWND)pUserData; nPercent = MulDiv(nRow+nLines, 100, pBitmap->Height); wsprintf(szStatus, "Loading...%d%", nPercent); SetWindowText(hDlg, szStatus); return SUCCESS; } L_VOID DisplayBitmapList(HWND hDlg, pDICOMELEMENT pElement) { HCURSOR hOldCursor=NULL; L_UINT16 nRet; BITMAPHANDLE TmpBitmap; L_UINT32 uCount; L_UINT32 x; L_CHAR szCaption[L_MAXPATH+50]; Data.bImage = FALSE; hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_IMAGEBTN), SW_SHOW); ListBox_ResetContent(GetDlgItem(hDlg, IDC_LIST1)); if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); L_GetBitmapListCount(Data.hBitmapList, &Data.BitmapListCount); if(Data.BitmapListCount > 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value */ uCount = L_DicomGetCountImage(Data.hDicomDS, pElement); GetWindowText(hDlg, szCaption, sizeof(szCaption)); for(x=0; x 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value count */ lCount = L_DicomGetCountValue(Data.hDicomDS, Data.pCurrentElement); if(lCount > 0) { /* get the values */ pszDisplay = L_DicomGetCharValue(Data.hDicomDS, Data.pCurrentElement, 0, lCount); if(pszDisplay) { for(x=0; xnVR == VR_OB) { /* display each value on a separate line */ wsprintf(buf, "%02X", pszDisplay+x); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); } else { /* display each value on a separate line */ wsprintf(buf, "%d", pszDisplay+x); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); } } } L_DicomFreeValue(Data.hDicomDS, Data.pCurrentElement); } } L_VOID DisplayShort(HWND hDlg, pDICOMELEMENT pElement) { L_UINT32 lCount; L_UINT32 x; L_INT16 L_FAR * pValues=NULL; L_CHAR buf[180]; ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_IMAGEBTN), SW_HIDE); ListBox_ResetContent(GetDlgItem(hDlg, IDC_LIST1)); if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); L_GetBitmapListCount(Data.hBitmapList, &Data.BitmapListCount); if(Data.BitmapListCount > 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value count */ lCount = L_DicomGetCountValue(Data.hDicomDS, Data.pCurrentElement); if(lCount > 0) { /* get the values */ pValues = L_DicomGetShortValue(Data.hDicomDS, Data.pCurrentElement, 0, lCount); if(pValues) { for(x=0; x 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value count */ lCount = L_DicomGetCountValue(Data.hDicomDS, Data.pCurrentElement); if(lCount > 0) { /* get the values */ pValues = L_DicomGetLongValue(Data.hDicomDS, Data.pCurrentElement, 0, lCount); if(pValues) { for(x=0; x 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value count */ lCount = L_DicomGetCountValue(Data.hDicomDS, Data.pCurrentElement); if(lCount > 0) { /* get the values */ pValues = L_DicomGetFloatValue(Data.hDicomDS, Data.pCurrentElement, 0, lCount); if(pValues) { for(x=0; x 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value count */ lCount = L_DicomGetCountValue(Data.hDicomDS, Data.pCurrentElement); if(lCount > 0) { /* get the values */ pValues = L_DicomGetDoubleValue(Data.hDicomDS, Data.pCurrentElement, 0, lCount); if(pValues) { for(x=0; x 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value count */ lCount = L_DicomGetCountValue(Data.hDicomDS, Data.pCurrentElement); if(lCount > 0) { /* get the values */ pValues = L_DicomGetStringValue(Data.hDicomDS, Data.pCurrentElement, 0, lCount); if(pValues) { for(x=0; x 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value */ pValue = L_DicomGetAgeValue(Data.hDicomDS, Data.pCurrentElement, 0, 1); if(pValue) { /* display the value */ wsprintf(buf, "Number: %d", pValue->nNumber); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Reference: %d", pValue->nReference); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); } } L_VOID DisplayTime(HWND hDlg, pDICOMELEMENT pElement) { pVALUETIME pValue=NULL; L_CHAR buf[180]; ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_IMAGEBTN), SW_HIDE); ListBox_ResetContent(GetDlgItem(hDlg, IDC_LIST1)); if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); L_GetBitmapListCount(Data.hBitmapList, &Data.BitmapListCount); if(Data.BitmapListCount > 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value */ pValue = L_DicomGetTimeValue(Data.hDicomDS, Data.pCurrentElement, 0, 1); if(pValue) { /* display the value */ wsprintf(buf, "Hours: %d", pValue->nHours); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Minutes: %d", pValue->nMinutes); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Seconds: %d", pValue->nSeconds); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Fractions: %ld", pValue->nFractions); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); } } L_VOID DisplayDate(HWND hDlg, pDICOMELEMENT pElement) { pVALUEDATE pValue=NULL; L_CHAR buf[180]; ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_IMAGEBTN), SW_HIDE); ListBox_ResetContent(GetDlgItem(hDlg, IDC_LIST1)); if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); L_GetBitmapListCount(Data.hBitmapList, &Data.BitmapListCount); if(Data.BitmapListCount > 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value */ pValue = L_DicomGetDateValue(Data.hDicomDS, Data.pCurrentElement, 0, 1); if(pValue) { /* display the value */ wsprintf(buf, "Year: %d", pValue->nYear); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Month: %d", pValue->nMonth); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Day: %d", pValue->nDay); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); } } L_VOID DisplayDateTime(HWND hDlg, pDICOMELEMENT pElement) { pVALUEDATETIME pValue=NULL; L_CHAR buf[180]; ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_IMAGEBTN), SW_HIDE); ListBox_ResetContent(GetDlgItem(hDlg, IDC_LIST1)); if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); L_GetBitmapListCount(Data.hBitmapList, &Data.BitmapListCount); if(Data.BitmapListCount > 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); /* get the value */ pValue = L_DicomGetDateTimeValue(Data.hDicomDS, Data.pCurrentElement, 0, 1); if(pValue) { /* display the value */ wsprintf(buf, "Year: %d", pValue->nYear); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Month: %d", pValue->nMonth); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Day: %d", pValue->nDay); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Year: %d", pValue->nYear); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Month: %d", pValue->nMonth); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); wsprintf(buf, "Day: %d", pValue->nDay); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); } } L_VOID DisplayBinary(HWND hDlg, pDICOMELEMENT pElement) { L_UINT32 x; BYTE L_FAR * pValues=NULL; L_CHAR buf[180]; ShowWindow(GetDlgItem(hDlg, IDC_LIST1), SW_SHOW); ShowWindow(GetDlgItem(hDlg, IDC_IMAGEBTN), SW_HIDE); ListBox_ResetContent(GetDlgItem(hDlg, IDC_LIST1)); if(Data.Bitmap.Flags.Allocated) L_FreeBitmap(&Data.Bitmap); L_GetBitmapListCount(Data.hBitmapList, &Data.BitmapListCount); if(Data.BitmapListCount > 0) L_DeleteBitmapListItems(Data.hBitmapList, 0, Data.BitmapListCount); if(Data.pCurrentElement && (Data.pCurrentElement->nLength > 0)) { /* get the values */ if(L_DicomGetBinaryValue(Data.hDicomDS, Data.pCurrentElement, (L_VOID L_FAR*)pValues, Data.pCurrentElement->nLength)) { for(x=0; xnLength; x++) { /* display each value on a separate line */ wsprintf(buf, "%02X", *(pValues+x)); ListBox_AddString(GetDlgItem(hDlg, IDC_LIST1), buf); } } L_DicomFreeValue(Data.hDicomDS, Data.pCurrentElement); } } L_VOID DrawImageBtn(HWND hDlg, LPDRAWITEMSTRUCT pds) { BITMAPHANDLE TmpBitmap; if(Data.BitmapListCount > 0) { /* Get a copy of the image's bitmap handle */ L_GetBitmapListItem(Data.hBitmapList, Data.BitmapListIndex, &TmpBitmap,sizeof(BITMAPHANDLE)); PaintBitmap(pds->hDC, &Data.rcDst, &TmpBitmap); return; } if(Data.Bitmap.Flags.Allocated) { PaintBitmap(pds->hDC, &Data.rcDst, &Data.Bitmap); return; } return; } L_VOID PaintBitmap(HDC hDC, LPRECT pDest, pBITMAPHANDLE pBitmap) { HPALETTE hPaintPal, hOldPal; HBRUSH hBrush, hOldBrush; HPEN hPen, hOldPen; RECT rcDest; hBrush = GetStockObject(GRAY_BRUSH); hPen = GetStockObject(BLACK_PEN); hOldBrush = SelectObject(hDC, hBrush); hOldPen = SelectObject(hDC, hPen); CopyRect(&rcDest, pDest); hPaintPal = L_CreatePaintPalette(hDC, pBitmap); if(hPaintPal) { hOldPal = SelectPalette(hDC, hPaintPal, FALSE); RealizePalette(hDC); } L_PaintDC(hDC, pBitmap, NULL, NULL, &rcDest, NULL, SRCCOPY); if(hPaintPal) { SelectPalette(hDC, hOldPal, FALSE); DeleteObject(hPaintPal); } SelectObject(hDC, hOldBrush); SelectObject(hDC, hOldPen); return; } L_VOID PaintBox(HDC hDC, RECT L_FAR* pRect, COLORREF crColor) { HPEN hPenOld; HBRUSH hBrushOld, hBrush; LOGBRUSH lgbrush; RECT rcBox; lgbrush.lbStyle = BS_SOLID; lgbrush.lbColor = crColor; CopyRect(&rcBox, pRect); rcBox.right+=1; rcBox.bottom+=1; hBrush = CreateBrushIndirect(&lgbrush); hPenOld = SelectObject(hDC, GetStockObject(NULL_PEN)); hBrushOld = SelectObject(hDC, hBrush); Rectangle(hDC, rcBox.left, rcBox.top, rcBox.right, rcBox.bottom); SelectObject(hDC, hPenOld); SelectObject(hDC, hBrushOld); DeleteObject(hBrush); return; } L_VOID PlayAnimation(HDC hDC) { L_UINT32 uItem; BITMAPHANDLE TmpBitmap; HPALETTE hPaintPal; HPALETTE hOldPal=NULL; MSG msg; do { Data.bAnimationPlay = TRUE; for(uItem=0; uItem0))?MF_BYPOSITION|MF_ENABLED:MF_BYPOSITION|MF_DISABLED|MF_GRAYED); EnableMenuItem(hMenu, PROCESS_MENU_POS, (Data.Bitmap.Flags.Allocated|(Data.BitmapListCount>0))?MF_BYPOSITION|MF_ENABLED:MF_BYPOSITION|MF_DISABLED|MF_GRAYED); EnableMenuItem(hMenu, ID_DATASET_EDITVALUE, (Data.nCurrentModule == (L_UINT32) -1) ? MF_BYCOMMAND | MF_ENABLED : MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); EnableMenuItem(hMenu, ID_DATASET_DELMODULE, (Data.nCurrentModule!=(L_UINT32)-1)?MF_BYCOMMAND|MF_ENABLED:MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); EnableMenuItem(hMenu, ID_DATASET_INSMODULE, Data.bHighLevel?MF_BYCOMMAND|MF_ENABLED:MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); CheckMenuItem(hMenu, ID_VIEW_LOWLEVELTREE, Data.bHighLevel?MF_BYCOMMAND|MF_UNCHECKED:MF_BYCOMMAND|MF_CHECKED); CheckMenuItem(hMenu, ID_VIEW_HIGHLEVEL, Data.bHighLevel?MF_BYCOMMAND|MF_CHECKED:MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(hMenu, ID_VIEWOPT_ANIMATIONLOOP, Data.bAnimationLoop?MF_BYCOMMAND|MF_CHECKED:MF_BYCOMMAND|MF_UNCHECKED); if(Data.bFit) { CheckMenuItem(hMenu, ID_VIEWOPT_FIT, MF_BYCOMMAND|MF_CHECKED); CheckMenuItem(hMenu, ID_VIEWOPT_NORMAL, MF_BYCOMMAND|MF_UNCHECKED); } else if(Data.Zoom==100) { CheckMenuItem(hMenu, ID_VIEWOPT_NORMAL, MF_BYCOMMAND|MF_CHECKED); CheckMenuItem(hMenu, ID_VIEWOPT_FIT, MF_BYCOMMAND|MF_UNCHECKED); } else { CheckMenuItem(hMenu, ID_VIEWOPT_NORMAL, MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(hMenu, ID_VIEWOPT_FIT, MF_BYCOMMAND|MF_UNCHECKED); } EnableMenuItem(hMenu, ID_WINDOWLEVEL,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); if(Data.Bitmap.Flags.Allocated) { if(Data.Bitmap.BitsPerPixel==12 || Data.Bitmap.BitsPerPixel==16) EnableMenuItem(hMenu, ID_WINDOWLEVEL, L_IsGrayScaleBitmap(&Data.Bitmap)?MF_BYCOMMAND|MF_ENABLED:MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); } if(Data.BitmapListCount > 0) { L_GetBitmapListItem(Data.hBitmapList, Data.BitmapListIndex, &TmpBitmap,sizeof(BITMAPHANDLE)); if(TmpBitmap.BitsPerPixel==12 || TmpBitmap.BitsPerPixel==16) EnableMenuItem(hMenu, ID_WINDOWLEVEL, L_IsGrayScaleBitmap(&TmpBitmap)?MF_BYCOMMAND|MF_ENABLED:MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); EnableMenuItem(hMenu, ID_VIEWOPT_ANIMATION, MF_BYCOMMAND|MF_ENABLED); EnableMenuItem(hMenu, ID_VIEWOPT_FIRSTFRAME, (Data.BitmapListIndex>0) ?MF_BYCOMMAND|MF_ENABLED:MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); EnableMenuItem(hMenu, ID_VIEWOPT_PREVFRAME, (Data.BitmapListIndex>0) ?MF_BYCOMMAND|MF_ENABLED:MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); EnableMenuItem(hMenu, ID_VIEWOPT_NEXTFRAME, (Data.BitmapListIndex1)?MF_BYCOMMAND|MF_DISABLED|MF_GRAYED:MF_BYCOMMAND|MF_ENABLED); // EnableMenuItem(hMenu, ID_ROTATE, (lCount>1)?MF_BYCOMMAND|MF_DISABLED|MF_GRAYED:MF_BYCOMMAND|MF_ENABLED); DrawMenuBar(hDlg); } L_VOID HandleViewOpt(HWND hDlg, L_INT nID) { switch(nID) { case ID_VIEWOPT_NORMAL: Data.bFit = FALSE; Data.Zoom = 100; UpdateScrollBars(hDlg); break; case ID_VIEWOPT_FIT: Data.bFit = TRUE; Data.Zoom = 100; UpdateScrollBars(hDlg); break; case ID_VIEWOPT_ZOOMIN_2: Data.bFit = FALSE; Data.Zoom = 200; UpdateScrollBars(hDlg); break; case ID_VIEWOPT_ZOOMIN_4: Data.bFit = FALSE; Data.Zoom = 400; UpdateScrollBars(hDlg); break; case ID_VIEWOPT_ZOOMOUT_2: Data.bFit = FALSE; Data.Zoom = 50; UpdateScrollBars(hDlg); break; case ID_VIEWOPT_ZOOMOUT_4: Data.bFit = FALSE; Data.Zoom = 25; UpdateScrollBars(hDlg); break; } UpdateMenuStatus(hDlg); InvalidateRect(GetDlgItem(hDlg, IDC_IMAGEBTN), NULL, TRUE); UpdateWindow(GetDlgItem(hDlg, IDC_IMAGEBTN)); return; } L_BOOL L_FAR L_EXPORT ConformanceCallback(pDICOMELEMENT pElement, L_UINT16 nFlags, L_VOID *pUserData) { L_CHAR szMsg[200]; L_CHAR szTag[50]; L_INT nRet; /* display info about non-standard element */ switch(nFlags) { case CALLBACK_ERROR_UNKNOWN_CLASS: lstrcpy(szMsg, "Unknown Class"); break; case CALLBACK_ERROR_UNKNOWN_TAG: lstrcpy(szMsg, "Unknown Tag"); break; case CALLBACK_ERROR_UNKNOWN_VR: lstrcpy(szMsg, "Unknown VR"); break; case CALLBACK_ERROR_WRONG_VR: lstrcpy(szMsg, "Error in VR"); break; case CALLBACK_ERROR_MIN_VM: lstrcpy(szMsg, "Error in MinVM"); break; case CALLBACK_ERROR_MAX_VM: lstrcpy(szMsg, "Error in MaxVM"); break; case CALLBACK_ERROR_DIVIDE_VM: lstrcpy(szMsg, "Error in DivideVM"); break; case CALLBACK_ERROR_IMAGE: lstrcpy(szMsg, "Error in Image"); break; default: return FALSE; } wsprintf(szTag, " Tag: %04X:%04X", GETGROUP(pElement->nTag), GETELEMENT(pElement->nTag)); lstrcat(szMsg, szTag); nRet = MessageBox((HWND)pUserData, szMsg, "Non-Standard Element", MB_OKCANCEL); if(nRet == IDCANCEL) return FALSE; return TRUE; } L_VOID FillTreeHighLevel(HWND hDlg) { L_UINT32 x; L_UINT32 y; L_UINT32 lCount=0; HTREEITEM hItem=NULL; L_UINT32 nClass; L_UINT16 nFlags; pDICOMMODULE pModule=NULL; pDICOMIOD pIOD=NULL; TV_INSERTSTRUCT tvis; Data.bLoaded = FALSE; TreeView_DeleteAllItems(GetDlgItem(hDlg, IDC_TREE1)); Data.pCurrentElement=NULL; Data.nCurrentModule =(L_UINT32)-1; /* get the module count */ lCount = L_DicomGetCountModule(Data.hDicomDS); L_DicomGetInfoDS(Data.hDicomDS, &nClass, &nFlags); if(lCount > 0) { for(x=0; xnModule); tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE; tvis.item.lParam = (LPARAM)pModule->nModule; tvis.item.pszText = pIOD->pszName; tvis.item.iImage = IMAGE_FOLDER_CLOSED; tvis.item.iSelectedImage = tvis.item.iImage; hItem = TreeView_InsertItem(GetDlgItem(hDlg, IDC_TREE1), &tvis); /* insert each element */ for(y=0; ynCount; y++) FillSubTreeHighLevel(hDlg, hItem, pModule->pElement[y], FALSE); } } else { MessageBox(hDlg, "Error - No Modules in this Data Set!", "Error", MB_OK); FillTreeLowLevel(hDlg); return; } Data.bLoaded = TRUE; Data.bHighLevel = TRUE; return; } L_VOID FillSubTreeHighLevel(HWND hDlg, HTREEITEM hParent, pDICOMELEMENT pElement, BOOL bRecurse) { HTREEITEM hItem=NULL; L_CHAR szText[200]; pDICOMTAG pTag=NULL; pDICOMELEMENT pChild=NULL; pDICOMELEMENT pNext=NULL; TV_INSERTSTRUCT tvis; /* add the node to the tree */ pTag = L_DicomFindTag(pElement->nTag); if(pTag) lstrcpy(szText, pTag->pszName); else lstrcpy(szText, "Item"); pChild = L_DicomGetChildElement(Data.hDicomDS, pElement, FALSE); /* does this node have a child? */ tvis.hParent = hParent; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE; tvis.item.lParam = (LPARAM)pElement; tvis.item.pszText = szText; if(pChild) tvis.item.iImage = IMAGE_FOLDER_CLOSED; else tvis.item.iImage = IMAGE_ITEM; tvis.item.iSelectedImage = tvis.item.iImage; hItem = TreeView_InsertItem(GetDlgItem(hDlg, IDC_TREE1), &tvis); if(!hItem) { MessageBox(hDlg, "Error", "Error", MB_OK); return; } if(pChild) FillSubTreeHighLevel(hDlg, hItem, pChild, TRUE); if(bRecurse) { /* move to next node in same level (if one) */ pNext = L_DicomGetNextElement(Data.hDicomDS, pElement, TRUE, FALSE); if(pNext) FillSubTreeHighLevel(hDlg, hParent, pNext, TRUE); } return; } BOOL CALLBACK LoadOptDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static L_UINT16 nMeta; static L_UINT16 nTransfer; static L_UINT16 nVR; switch(uMsg) { case WM_INITDIALOG: nMeta = 0; nTransfer = 0; nVR = 0; if((Data.LoadFlags&DS_METAHEADER_PRESENT)==DS_METAHEADER_PRESENT) { CheckDlgButton(hDlg, IDC_RADIO1, TRUE); nMeta = DS_METAHEADER_PRESENT; } else if((Data.LoadFlags&DS_METAHEADER_ABSENT)==DS_METAHEADER_ABSENT) { CheckDlgButton(hDlg, IDC_RADIO2, TRUE); nMeta = DS_METAHEADER_ABSENT; } else CheckDlgButton(hDlg, IDC_RADIO3, TRUE); if((Data.LoadFlags&DS_LITTLE_ENDIAN)==DS_LITTLE_ENDIAN) { CheckDlgButton(hDlg, IDC_RADIO4, TRUE); nTransfer = DS_LITTLE_ENDIAN; } else if((Data.LoadFlags&DS_BIG_ENDIAN)==DS_BIG_ENDIAN) { CheckDlgButton(hDlg, IDC_RADIO5, TRUE); nTransfer = DS_BIG_ENDIAN; } else CheckDlgButton(hDlg, IDC_RADIO6, TRUE); if((Data.LoadFlags&DS_EXPLICIT_VR)==DS_EXPLICIT_VR) { CheckDlgButton(hDlg, IDC_RADIO7, TRUE); nVR = DS_EXPLICIT_VR; } else if((Data.LoadFlags&DS_IMPLICIT_VR)==DS_IMPLICIT_VR) { CheckDlgButton(hDlg, IDC_RADIO8, TRUE); nVR = DS_IMPLICIT_VR; } else CheckDlgButton(hDlg, IDC_RADIO9, TRUE); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: case IDABORT: EndDialog(hDlg, FALSE); break; case IDC_RADIO1: nMeta = DS_METAHEADER_PRESENT; break; case IDC_RADIO2: nMeta = DS_METAHEADER_ABSENT; break; case IDC_RADIO3: nMeta = 0; break; case IDC_RADIO4: nTransfer = DS_LITTLE_ENDIAN; break; case IDC_RADIO5: nTransfer = DS_BIG_ENDIAN; break; case IDC_RADIO6: nTransfer = 0; break; case IDC_RADIO7: nVR = DS_EXPLICIT_VR; break; case IDC_RADIO8: nVR = DS_IMPLICIT_VR; break; case IDC_RADIO9: nVR = 0; break; case IDOK: Data.LoadFlags = nMeta | nTransfer | nVR; EndDialog(hDlg, TRUE); break; } break; default: return FALSE; } return TRUE; } BOOL CALLBACK SaveOptDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static L_UINT16 nMeta; static L_UINT16 nTransfer; static L_UINT16 nVR; static L_UINT16 nGroupLen; static L_UINT16 nLenEncoding; static L_INT32 nCompression; static L_INT32 nPhotometric; static L_INT32 nBitsPerPixel; static L_INT32 nQFactor; switch(uMsg) { case WM_INITDIALOG: nMeta = 0; nTransfer = 0; nVR = 0; nGroupLen = 0; nLenEncoding = 0; nCompression = Data.nSaveCompression; nPhotometric = Data.nSavePhotometric; nBitsPerPixel = Data.nSaveBitsPerPixel; nQFactor = Data.nSaveQFactor; if((Data.SaveFlags&DS_METAHEADER_PRESENT)==DS_METAHEADER_PRESENT) { CheckDlgButton(hDlg, IDC_RADIO1, TRUE); nMeta = DS_METAHEADER_PRESENT; } else if((Data.SaveFlags&DS_METAHEADER_ABSENT)==DS_METAHEADER_ABSENT) { CheckDlgButton(hDlg, IDC_RADIO2, TRUE); nMeta = DS_METAHEADER_ABSENT; } else CheckDlgButton(hDlg, IDC_RADIO3, TRUE); if((Data.SaveFlags&DS_LITTLE_ENDIAN)==DS_LITTLE_ENDIAN) { CheckDlgButton(hDlg, IDC_RADIO4, TRUE); nTransfer = DS_LITTLE_ENDIAN; } else if((Data.SaveFlags&DS_BIG_ENDIAN)==DS_BIG_ENDIAN) { CheckDlgButton(hDlg, IDC_RADIO5, TRUE); nTransfer = DS_BIG_ENDIAN; } else CheckDlgButton(hDlg, IDC_RADIO6, TRUE); if((Data.SaveFlags&DS_EXPLICIT_VR)==DS_EXPLICIT_VR) { CheckDlgButton(hDlg, IDC_RADIO7, TRUE); nVR = DS_EXPLICIT_VR; } else if((Data.SaveFlags&DS_IMPLICIT_VR)==DS_IMPLICIT_VR) { CheckDlgButton(hDlg, IDC_RADIO8, TRUE); nVR = DS_IMPLICIT_VR; } else CheckDlgButton(hDlg, IDC_RADIO9, TRUE); if((Data.SaveFlags&DS_GROUP_LENGTHS)==DS_GROUP_LENGTHS) { CheckDlgButton(hDlg, IDC_RADIO10, TRUE); nGroupLen=DS_GROUP_LENGTHS; } else { CheckDlgButton(hDlg, IDC_RADIO11, TRUE); nGroupLen = 0; } if((Data.SaveFlags&DS_LENGTH_EXPLICIT)==DS_LENGTH_EXPLICIT) { CheckDlgButton(hDlg, IDC_RADIO13, TRUE); nLenEncoding=DS_LENGTH_EXPLICIT; } else { CheckDlgButton(hDlg, IDC_RADIO12, TRUE); nLenEncoding = 0; } switch (Data.nSaveCompression) { case IMAGE_COMPRESSION_NONE: CheckDlgButton(hDlg, IDC_RADIO14, TRUE); EnableWindow(GetDlgItem(hDlg, IDC_QFACTOR), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_J2KOPTIONS), FALSE); break; case IMAGE_COMPRESSION_RLE: CheckDlgButton(hDlg, IDC_RADIO15, TRUE); EnableWindow(GetDlgItem(hDlg, IDC_QFACTOR), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_J2KOPTIONS), FALSE); break; case IMAGE_COMPRESSION_JPEG_LOSSY: CheckDlgButton(hDlg, IDC_RADIO16, TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO19), FALSE);//photometric palette EnableWindow(GetDlgItem(hDlg, IDC_RADIO22), FALSE);//16 BPP EnableWindow(GetDlgItem(hDlg, IDC_QFACTOR), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_J2KOPTIONS), FALSE); break; case IMAGE_COMPRESSION_J2K_LOSSY: CheckDlgButton(hDlg, IDC_RADIO_J2KLOSSY, TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO19), FALSE);//photometric palette EnableWindow(GetDlgItem(hDlg, IDC_RADIO22), FALSE);//16 BPP EnableWindow(GetDlgItem(hDlg, IDC_QFACTOR), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_J2KOPTIONS), TRUE); break; case IMAGE_COMPRESSION_JPEG_LOSSLESS: CheckDlgButton(hDlg, IDC_RADIO17, TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO19), FALSE);//photometric palette EnableWindow(GetDlgItem(hDlg, IDC_RADIO21), FALSE);//8 BPP EnableWindow(GetDlgItem(hDlg, IDC_QFACTOR), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_J2KOPTIONS), FALSE); break; case IMAGE_COMPRESSION_J2K_LOSSLESS: CheckDlgButton(hDlg, IDC_RADIO_J2KLOSSLESS, TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO19), FALSE);//photometric palette EnableWindow(GetDlgItem(hDlg, IDC_RADIO21), FALSE);//8 BPP EnableWindow(GetDlgItem(hDlg, IDC_QFACTOR), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_J2KOPTIONS), TRUE); break; } switch (Data.nSavePhotometric) { case IMAGE_PHOTOMETRIC_MONOCHROME2: CheckDlgButton(hDlg, IDC_RADIO18, TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO23), FALSE);//24 BPP break; case IMAGE_PHOTOMETRIC_PALETTE_COLOR: CheckDlgButton(hDlg, IDC_RADIO19, TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO22), FALSE);//16 BPP EnableWindow(GetDlgItem(hDlg, IDC_RADIO23), FALSE);//24 BPP break; case IMAGE_PHOTOMETRIC_RGB: CheckDlgButton(hDlg, IDC_RADIO20, TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO21), FALSE);//8 BPP EnableWindow(GetDlgItem(hDlg, IDC_RADIO22), FALSE);//16 BPP break; } switch (Data.nSaveBitsPerPixel) { case 8: CheckDlgButton(hDlg, IDC_RADIO21, TRUE); break; case 16: CheckDlgButton(hDlg, IDC_RADIO22, TRUE); break; case 24: CheckDlgButton(hDlg, IDC_RADIO23, TRUE); break; } SetDlgItemInt(hDlg, IDC_QFACTOR, Data.nSaveQFactor, FALSE); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: case IDABORT: EndDialog(hDlg, FALSE); break; case IDC_RADIO1: nMeta = DS_METAHEADER_PRESENT; break; case IDC_RADIO2: nMeta = DS_METAHEADER_ABSENT; break; case IDC_RADIO3: nMeta = 0; break; case IDC_RADIO4: nTransfer = DS_LITTLE_ENDIAN; EnableWindow(GetDlgItem(hDlg, IDC_RADIO7), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO5), TRUE); if(IsDlgButtonChecked(hDlg, IDC_RADIO8) == 0) { EnableWindow(GetDlgItem(hDlg, IDC_RADIO15), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO16), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSY), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO17), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSLESS), TRUE); } break; case IDC_RADIO5: nTransfer = DS_BIG_ENDIAN; EnableWindow(GetDlgItem(hDlg, IDC_RADIO8), FALSE); OnRadio14(hDlg); EnableWindow(GetDlgItem(hDlg, IDC_RADIO15), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO16), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSY), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO17), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSLESS), FALSE); break; case IDC_RADIO6: nTransfer = 0; EnableWindow(GetDlgItem(hDlg, IDC_RADIO8), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO5), TRUE); if(IsDlgButtonChecked(hDlg, IDC_RADIO8) == 0) { EnableWindow(GetDlgItem(hDlg, IDC_RADIO15), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO16), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSY), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO17), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSLESS), TRUE); } break; case IDC_RADIO7: nVR = DS_EXPLICIT_VR; EnableWindow(GetDlgItem(hDlg, IDC_RADIO8), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO5), TRUE); if(IsDlgButtonChecked(hDlg, IDC_RADIO5) == 0) { EnableWindow(GetDlgItem(hDlg, IDC_RADIO15), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO16), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSY), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO17), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSLESS), TRUE); } break; case IDC_RADIO8: nVR = DS_IMPLICIT_VR; EnableWindow(GetDlgItem(hDlg, IDC_RADIO5), FALSE); OnRadio14(hDlg); EnableWindow(GetDlgItem(hDlg, IDC_RADIO15), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO16), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSY), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO17), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSLESS), FALSE); break; case IDC_RADIO9: nVR = 0; EnableWindow(GetDlgItem(hDlg, IDC_RADIO8), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO5), TRUE); if(IsDlgButtonChecked(hDlg, IDC_RADIO5) == 0) { EnableWindow(GetDlgItem(hDlg, IDC_RADIO15), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO16), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSY), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO17), TRUE); EnableWindow(GetDlgItem(hDlg, IDC_RADIO_J2KLOSSLESS), TRUE); } break; case IDC_RADIO10: nGroupLen = DS_GROUP_LENGTHS; break; case IDC_RADIO11: nGroupLen = 0; break; case IDC_RADIO12: nLenEncoding = 0; break; case IDC_RADIO13: nLenEncoding = DS_LENGTH_EXPLICIT; break; case IDC_RADIO14: OnRadio14(hDlg); break; case IDC_RADIO15: OnRadio15(hDlg); break; case IDC_RADIO_J2KLOSSY: OnRadioJ2KLossy(hDlg); break; case IDC_RADIO16: OnRadio16(hDlg); break; case IDC_RADIO_J2KLOSSLESS: OnRadioJ2KLossLess(hDlg); break; case IDC_RADIO17: OnRadio17(hDlg); break; case IDC_RADIO18: OnRadio18(hDlg); break; case IDC_RADIO19: OnRadio19(hDlg); break; case IDC_RADIO20: OnRadio20(hDlg); break; case IDC_RADIO21: OnRadio21(hDlg); break; case IDC_RADIO22: OnRadio22(hDlg); break; case IDC_RADIO23: OnRadio23(hDlg); break; case IDC_J2KOPTIONS: Data.nTempQFactor= GetDlgItemInt(hDlg, IDC_QFACTOR, NULL, TRUE); OnJ2KOptions(hDlg); break; case IDOK: Data.SaveFlags = nMeta | nTransfer | nVR | nGroupLen |nLenEncoding; if(IsDlgButtonChecked(hDlg, IDC_RADIO14) == 1) Data.nSaveCompression = IMAGE_COMPRESSION_NONE; else if(IsDlgButtonChecked(hDlg, IDC_RADIO15) == 1) Data.nSaveCompression = IMAGE_COMPRESSION_RLE; else if(IsDlgButtonChecked(hDlg, IDC_RADIO16) == 1) Data.nSaveCompression = IMAGE_COMPRESSION_JPEG_LOSSY; else if(IsDlgButtonChecked(hDlg, IDC_RADIO17) == 1) Data.nSaveCompression = IMAGE_COMPRESSION_JPEG_LOSSLESS; else if(IsDlgButtonChecked(hDlg, IDC_RADIO_J2KLOSSY) == 1) Data.nSaveCompression = IMAGE_COMPRESSION_J2K_LOSSY; else if(IsDlgButtonChecked(hDlg, IDC_RADIO_J2KLOSSLESS) == 1) Data.nSaveCompression = IMAGE_COMPRESSION_J2K_LOSSLESS; if(IsDlgButtonChecked(hDlg, IDC_RADIO18) == 1) Data.nSavePhotometric = IMAGE_PHOTOMETRIC_MONOCHROME2; else if(IsDlgButtonChecked(hDlg, IDC_RADIO19) == 1) Data.nSavePhotometric = IMAGE_PHOTOMETRIC_PALETTE_COLOR; else if(IsDlgButtonChecked(hDlg, IDC_RADIO20) == 1) Data.nSavePhotometric = IMAGE_PHOTOMETRIC_RGB; if(IsDlgButtonChecked(hDlg, IDC_RADIO21) == 1) Data.nSaveBitsPerPixel = 8; else if(IsDlgButtonChecked(hDlg, IDC_RADIO22) == 1) Data.nSaveBitsPerPixel = 16; else if(IsDlgButtonChecked(hDlg, IDC_RADIO23) == 1) Data.nSaveBitsPerPixel = 24; Data.nSaveQFactor = GetDlgItemInt(hDlg, IDC_QFACTOR, NULL, TRUE); EndDialog(hDlg, TRUE); break; } break; default: return FALSE; } return TRUE; } L_VOID ShowInformation(HWND hDlg) { L_CHAR szMsg[2000]; L_CHAR szTmp[200]; DICOMIMAGE Info; if(L_DicomGetInfoImage(Data.hDicomDS, Data.pCurrentElement, &Info, (Data.BitmapListCount>0)?Data.BitmapListIndex:0)==DICOM_SUCCESS) { lstrcpy(szMsg, ""); wsprintf(szTmp, "Compression: %ld\n", Info.nCompression); lstrcat(szMsg, szTmp); wsprintf(szTmp, "Photometric: %ld - %s\n", Info.nPhotometric, Info.szPhotometric); lstrcat(szMsg, szTmp); wsprintf(szTmp, "Rows x Columns: %ld x %ld\n", Info.nRows, Info.nColumns); lstrcat(szMsg, szTmp); wsprintf(szTmp, "Bits Allocated: %ld\n", Info.nBitsAllocated); lstrcat(szMsg, szTmp); wsprintf(szTmp, "Bits Stored: %ld\n", Info.nBitsStored); lstrcat(szMsg, szTmp); wsprintf(szTmp, "High Bit: %ld\n", Info.nHighBit); lstrcat(szMsg, szTmp); wsprintf(szTmp, "Pixel Representation: %ld\n", Info.nPixelRepresentation); lstrcat(szMsg, szTmp); wsprintf(szTmp, "Planar Configuration: %ld\n", Info.nPlanarConfiguration); lstrcat(szMsg, szTmp); wsprintf(szTmp, "ResolutionX: %ld\n", Info.nResolutionX); lstrcat(szMsg, szTmp); wsprintf(szTmp, "ResolutionY: %ld\n", Info.nResolutionY); lstrcat(szMsg, szTmp); wsprintf(szTmp, "SmallestImagePixelValue: %ld\n", Info.nSmallestImagePixelValue); lstrcat(szMsg, szTmp); wsprintf(szTmp, "SmallestImagePixelValueFlag: %ld\n", Info.bSmallestImagePixelValue); lstrcat(szMsg, szTmp); wsprintf(szTmp, "LargestImagePixelValue: %ld\n", Info.nLargestImagePixelValue); lstrcat(szMsg, szTmp); wsprintf(szTmp, "LargestImagePixelValueFlag: %ld\n", Info.bLargestImagePixelValue); lstrcat(szMsg, szTmp); wsprintf(szTmp, "RedEntries: %ld\n", Info.nRedEntries); lstrcat(szMsg, szTmp); wsprintf(szTmp, "RedFirst: %ld\n", Info.nRedFirst); lstrcat(szMsg, szTmp); wsprintf(szTmp, "RedBits: %ld\n", Info.nRedBits); lstrcat(szMsg, szTmp); wsprintf(szTmp, "GreenEntries: %ld\n", Info.nGreenEntries); lstrcat(szMsg, szTmp); wsprintf(szTmp, "GreenFirst: %ld\n", Info.nGreenFirst); lstrcat(szMsg, szTmp); wsprintf(szTmp, "GreenBits: %ld\n", Info.nGreenBits); lstrcat(szMsg, szTmp); wsprintf(szTmp, "BlueEntries: %ld\n", Info.nBlueEntries); lstrcat(szMsg, szTmp); wsprintf(szTmp, "BlueFirst: %ld\n", Info.nBlueFirst); lstrcat(szMsg, szTmp); wsprintf(szTmp, "BlueBits: %ld\n", Info.nBlueBits); lstrcat(szMsg, szTmp); wsprintf(szTmp, "PaletteEntries: %ld\n", Info.nPaletteEntries); lstrcat(szMsg, szTmp); wsprintf(szTmp, "PaletteFirst: %ld\n", Info.nPaletteFirst); lstrcat(szMsg, szTmp); wsprintf(szTmp, "BitsPerPixel: %ld\n", Info.nBitsPerPixel); lstrcat(szMsg, szTmp); wsprintf(szTmp, "Gray: %ld\n", Info.bGray); lstrcat(szMsg, szTmp); wsprintf(szTmp, "Frames: %ld\n", Info.nFrames); lstrcat(szMsg, szTmp); MessageBox(hDlg, szMsg, "Image Information", MB_OK); } else { MessageBox(hDlg, "Error", "Error", MB_OK); } } L_VOID ShowDSInfo(HWND hDlg) { L_UINT32 nClass; L_UINT16 nFlags; L_CHAR szClass[200]; L_CHAR szOut[400]; pDICOMIOD pIOD=NULL; L_DicomGetInfoDS(Data.hDicomDS, &nClass, &nFlags); pIOD = L_DicomFindClassIOD(nClass); if(!pIOD) { MessageBox(hDlg, "Error", "Error", MB_OK); return; } lstrcpy(szClass, pIOD->pszName); wsprintf(szOut, "Class: %s\nFlags: %4X", szClass, nFlags); MessageBox(hDlg, szOut, "DataSet Info", MB_OK); } L_VOID DeleteDSElement(HWND hDlg) { HTREEITEM hItem=NULL; TV_ITEM item; hItem = TreeView_GetSelectedItem(GetDlgItem(hDlg, IDC_TREE1)); if(hItem) { pDICOMELEMENT pOldCurrentElement = Data.pCurrentElement; item.mask = TVIF_HANDLE | TVIF_PARAM; item.hItem = hItem; TreeView_GetItem(GetDlgItem(hDlg, IDC_TREE1), &item); Data.pCurrentElement = (pDICOMELEMENT)item.lParam; if(!Data.pCurrentElement) { MessageBox(hDlg, "Error Deleting Element!", "Error", MB_OK); return; } if(L_DicomExistsElement(Data.hDicomDS,Data.pCurrentElement)) { Data.pCurrentElement = L_DicomDeleteElement(Data.hDicomDS, Data.pCurrentElement); /* remove item from treeview */ TreeView_DeleteItem(GetDlgItem(hDlg, IDC_TREE1), hItem); } else { Data.pCurrentElement = pOldCurrentElement; } } } L_VOID OnJ2KOptions(HWND hDlg) { HCURSOR hOldCursor=NULL; hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); if(DialogBox(Data.hInst, MAKEINTRESOURCE(IDD_J2KOPTDLG), hDlg, SetJ2KOptionsDlgProc)) { } SetCursor(hOldCursor); } L_VOID InsertDSElement(HWND hDlg) { HCURSOR hOldCursor=NULL; pDICOMTAG pTag=NULL; pDICOMELEMENT pNewElement=NULL; TV_INSERTSTRUCT tvis; HTREEITEM hItem=NULL; hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); if(DialogBox(Data.hInst, MAKEINTRESOURCE(IDD_INSERTELEMENT), NULL, InsElementDlgProc)) { /* insert the new element */ pTag = L_DicomFindTag(Data.lTagCode); if(!pTag) { MessageBox(hDlg, "Error", "Error", MB_OK); return; } pNewElement = L_DicomInsertElement(Data.hDicomDS, Data.pCurrentElement, Data.bChild, Data.lTagCode, pTag->nVR, Data.bSequence, ELEMENT_INDEX_MAX); if(!pNewElement) { MessageBox(hDlg, "Error", "Error", MB_OK); return; } else { /* update the tree view */ hItem = TreeView_GetSelectedItem(GetDlgItem(hDlg, IDC_TREE1)); tvis.hParent = TreeView_GetParent(GetDlgItem(hDlg, IDC_TREE1), hItem); tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE; tvis.item.lParam = (LPARAM)pNewElement; tvis.item.pszText = pTag->pszName; if(Data.bChild) { tvis.item.iImage = IMAGE_FOLDER_CLOSED; tvis.hParent = hItem; } else tvis.item.iImage = IMAGE_ITEM; tvis.item.iSelectedImage = tvis.item.iImage; hItem = TreeView_InsertItem(GetDlgItem(hDlg, IDC_TREE1), &tvis); } } SetCursor(hOldCursor); } L_VOID DeleteDSModule(HWND hDlg) { HTREEITEM hItem=NULL; hItem = TreeView_GetSelectedItem(GetDlgItem(hDlg, IDC_TREE1)); if(!Data.nCurrentModule == (L_UINT32)-1) { MessageBox(hDlg, "Error Deleting Module!", "Error", MB_OK); return; } L_DicomDeleteModule(Data.hDicomDS, Data.nCurrentModule); Data.nCurrentModule = (L_UINT32)-1; /* remove item from treeview */ TreeView_DeleteItem(GetDlgItem(hDlg, IDC_TREE1), hItem); } L_VOID InsertDSModule(HWND hDlg) { HCURSOR hOldCursor=NULL; pDICOMMODULE pNewModule=NULL; pDICOMIOD pIOD=NULL; TV_INSERTSTRUCT tvis; HTREEITEM hItem=NULL; L_UINT32 nClass; L_UINT16 nFlags; L_UINT32 y; hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); if(DialogBox(Data.hInst, MAKEINTRESOURCE(IDD_INSERTMODULE), NULL, InsModuleDlgProc)) { /* insert the new Module */ pNewModule = L_DicomFindModule(Data.hDicomDS, Data.lModuleCode); if(pNewModule) { MessageBox(hDlg, "Module Already Exists", "Error", MB_OK); return; } pNewModule = L_DicomInsertModule(Data.hDicomDS, Data.lModuleCode, TRUE); if(!pNewModule) { MessageBox(hDlg, "Error Inserting Module", "Error", MB_OK); return; } else { L_DicomGetInfoDS(Data.hDicomDS, &nClass, &nFlags); pIOD = L_DicomFindModuleIOD(nClass, Data.lModuleCode); if(!pIOD) { MessageBox(hDlg, "Error Inserting Module", "Error", MB_OK); return; } /* update the tree view */ hItem = TreeView_GetSelectedItem(GetDlgItem(hDlg, IDC_TREE1)); tvis.hParent = NULL; tvis.hInsertAfter = TVI_LAST; tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_TEXT | TVIF_SELECTEDIMAGE; tvis.item.lParam = (LPARAM)pNewModule->nModule; tvis.item.pszText = pIOD->pszName; tvis.item.iImage = IMAGE_FOLDER_CLOSED; tvis.item.iSelectedImage = tvis.item.iImage; hItem = TreeView_InsertItem(GetDlgItem(hDlg, IDC_TREE1), &tvis); /* insert each element */ for(y=0; ynCount; y++) FillSubTreeHighLevel(hDlg, hItem, pNewModule->pElement[y], FALSE); } } SetCursor(hOldCursor); } BOOL CALLBACK InsElementDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { L_UINT32 lCount; pDICOMTAG pTag = NULL; L_CHAR szDisplay[200]; L_INT nIdx; static lTagCode=0; L_UINT32 x; switch(uMsg) { case WM_INITDIALOG: CheckDlgButton(hDlg, IDC_CHECK1, Data.bChild ?TRUE:FALSE); CheckDlgButton(hDlg, IDC_CHECK2, Data.bSequence?TRUE:FALSE); /* init list box */ lCount = L_DicomGetCountTag(); for(x=0; xnCode), GETELEMENT(pTag->nCode), pTag->pszName); nIdx = ComboBox_AddString(GetDlgItem(hDlg, IDC_COMBO1), szDisplay); ComboBox_SetItemData(GetDlgItem(hDlg, IDC_COMBO1), nIdx, pTag->nCode); } } ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_COMBO1), 0); lTagCode = (L_UINT32)ComboBox_GetItemData(GetDlgItem(hDlg, IDC_COMBO1), 0); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: case IDABORT: EndDialog(hDlg, FALSE); break; case IDC_CHECK1: Data.bChild = IsDlgButtonChecked(hDlg, IDC_CHECK1); break; case IDC_CHECK2: Data.bSequence = IsDlgButtonChecked(hDlg, IDC_CHECK2); break; case IDC_COMBO1: lTagCode = (L_UINT32)ComboBox_GetItemData(GetDlgItem(hDlg, IDC_COMBO1), ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_COMBO1))); break; case IDOK: Data.lTagCode = lTagCode; EndDialog(hDlg, TRUE); break; } break; default: return FALSE; } return TRUE; } L_BOOL GetEditInt ( HWND hDlg,L_INT nID, L_INT L_FAR* pVal, L_INT nMinVal, L_INT nMaxVal ) { L_BOOL bTranslated = 0; *pVal = GetDlgItemInt(hDlg,nID, ( int *) &bTranslated, FALSE); if(!bTranslated || *pVal < nMinVal || *pVal > nMaxVal) { SelectTextAndBeep(hDlg,nID); return FALSE; } return TRUE; } L_VOID SelectTextAndBeep ( HWND hDlg,L_INT nID ) { Edit_SetSel(GetDlgItem(hDlg,nID), 0, -1); SetFocus(GetDlgItem(hDlg,nID)); MessageBeep(0); } L_BOOL FileSaveGetJ2KOptionsAdvanced ( HWND hDlg,pFILEJ2KOPTIONS pJ2KOptions ) { FILEJ2KOPTIONS J2KOptions; L_INT xcb, ycb; L_INT width; L_INT height; char szNum[32]; J2KOptions = *pJ2KOptions; if(!GetEditInt( hDlg,LT_DLG_J2KOPTIONS_IDEDT_XOSIZ, (int *) &J2KOptions.uXOsiz, 0, 0x3FFFFFFF)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_YOSIZ, (int *) &J2KOptions.uYOsiz, 0, 0x3FFFFFFF)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_XTSIZ, (int *) &J2KOptions.uXTsiz, 0, 0x3FFFFFFF)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_YTSIZ, (int *) &J2KOptions.uYTsiz, 0, 0x3FFFFFFF)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_XTOSIZ, (int *) &J2KOptions.uXTOsiz, 0, 0x3FFFFFFF)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_YTOSIZ, (int *)&J2KOptions.uYTOsiz, 0, 0x3FFFFFFF)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_DECOMPLEVEL, (int *) &J2KOptions.uDecompLevel, 0, 32)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_GUARDBITS, (int *) &J2KOptions.uGuardBits, 0, 7)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_MANTISSA, &J2KOptions.nDerivedBaseMantissa, 0, 2047)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_EXPONENT, &J2KOptions.nDerivedBaseExponent, 0, 16)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_CODEBLOCKWIDTH, &J2KOptions.nCodBlockWidth, 2, 64)) return FALSE; if(!GetEditInt(hDlg,LT_DLG_J2KOPTIONS_IDEDT_CODEBLOCKHEIGHT, &J2KOptions.nCodBlockHeight, 2, 64)) return FALSE; for (xcb=0, width = J2KOptions.nCodBlockWidth; width > (1< (1< 12)) { SelectTextAndBeep(hDlg,LT_DLG_J2KOPTIONS_IDEDT_CODEBLOCKHEIGHT); return FALSE; } if ( J2KOptions.uXTOsiz > J2KOptions.uXOsiz ) { SelectTextAndBeep(hDlg,LT_DLG_J2KOPTIONS_IDEDT_XTOSIZ); return FALSE; } if ( J2KOptions.uYTOsiz > J2KOptions.uYOsiz ) { SelectTextAndBeep(hDlg,LT_DLG_J2KOPTIONS_IDEDT_YTOSIZ); return FALSE; } if(J2KOptions.uXOsiz > J2KOptions.uXTOsiz + J2KOptions.uXTsiz) { SelectTextAndBeep(hDlg,LT_DLG_J2KOPTIONS_IDEDT_XOSIZ); return FALSE; } if(J2KOptions.uYOsiz > J2KOptions.uYTOsiz + J2KOptions.uYTsiz) { SelectTextAndBeep(hDlg,LT_DLG_J2KOPTIONS_IDEDT_YOSIZ); return FALSE; } if(J2KOptions.uXTsiz < (L_UINT)(2 << J2KOptions.uDecompLevel) || J2KOptions.uYTsiz < (L_UINT)(2 << J2KOptions.uDecompLevel)) { SelectTextAndBeep(hDlg,LT_DLG_J2KOPTIONS_IDEDT_DECOMPLEVEL); return FALSE; } J2KOptions.bUseColorTransform = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_COLORTRANSFORM)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.bDerivedQuantization = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_DERIVEDQUANTIZATION)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.bUseSOPMarker = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_USESOPMARKER)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.bUseEPHMarker = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_USEEPHMARKER)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.CodBlockStyleFlags.bSelectiveACBypass = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_SELECTIVEACBYPASS)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.CodBlockStyleFlags.bResetContextOnBoundaries = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_RESETCONTEXT)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.CodBlockStyleFlags.bTerminationOnEachPass = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_TERMINATION)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.CodBlockStyleFlags.bVerticallyCausalContext = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_VERTICALLYCAUSAL)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.CodBlockStyleFlags.bPredictableTermination = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_PREDICTABLETERMINATION)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.CodBlockStyleFlags.bErrorResilienceSymbol = (( Button_GetCheck(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_ERRORRESILIENCE)) == BST_CHECKED ) ? TRUE : FALSE ) ; J2KOptions.uCompressionControl = (J2KCOMPRESSIONCONTROL)(ComboBox_GetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KCOMPRESSIONCONTROL))+1); J2KOptions.uProgressOrder = (ComboBox_GetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KPROGRESSIONORDER))); if(!GetEditInt( hDlg,LT_DLG_SAVE_IDEDT_J2KTARGETSIZE, (int *) &J2KOptions.uTargetFileSize, 100, 0x3FFFFFFF)) return FALSE; memset(szNum,0,32); GetWindowText(GetDlgItem(hDlg, LT_DLG_SAVE_IDEDT_J2KCOMPRESSIONRATIO), szNum, 32); if(lstrlen(szNum)) { J2KOptions.fCompressionRatio = (L_FLOAT )atof(((char *)(LPCSTR)szNum)); if(J2KOptions.fCompressionRatio < 1.0) { J2KOptions.fCompressionRatio = 15.0f; } } else { J2KOptions.fCompressionRatio = 15.0f; } *pJ2KOptions = J2KOptions; return TRUE; } L_VOID FileSaveFillJ2KOptionsAdvanced( HWND hDlg , pFILEJ2KOPTIONS pJ2KOptions) { L_CHAR szNo[16]; Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_SELECTIVEACBYPASS), (pJ2KOptions->CodBlockStyleFlags.bSelectiveACBypass? BST_CHECKED : BST_UNCHECKED ) ); Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_RESETCONTEXT), (pJ2KOptions->CodBlockStyleFlags.bResetContextOnBoundaries? BST_CHECKED : BST_UNCHECKED ) ); Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_TERMINATION), (pJ2KOptions->CodBlockStyleFlags.bTerminationOnEachPass? BST_CHECKED : BST_UNCHECKED ) ); Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_VERTICALLYCAUSAL), (pJ2KOptions->CodBlockStyleFlags.bVerticallyCausalContext? BST_CHECKED : BST_UNCHECKED ) ); Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_PREDICTABLETERMINATION), (pJ2KOptions->CodBlockStyleFlags.bPredictableTermination? BST_CHECKED : BST_UNCHECKED ) ); Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_ERRORRESILIENCE), (pJ2KOptions->CodBlockStyleFlags.bErrorResilienceSymbol? BST_CHECKED : BST_UNCHECKED ) ); Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_COLORTRANSFORM), (pJ2KOptions->bUseColorTransform? BST_CHECKED : BST_UNCHECKED ) ); Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_DERIVEDQUANTIZATION), (pJ2KOptions->bDerivedQuantization? BST_CHECKED : BST_UNCHECKED ) ); Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_USESOPMARKER), (pJ2KOptions->bUseSOPMarker? BST_CHECKED : BST_UNCHECKED ) ); Button_SetCheck( GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDCHK_USEEPHMARKER), (pJ2KOptions->bUseEPHMarker? BST_CHECKED : BST_UNCHECKED ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_XOSIZ),_itoa( pJ2KOptions->uXOsiz, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_YOSIZ),_itoa( pJ2KOptions->uYOsiz, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_XTSIZ),_itoa( pJ2KOptions->uXTsiz, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_YTSIZ),_itoa( pJ2KOptions->uYTsiz, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_XTOSIZ),_itoa( pJ2KOptions->uXTOsiz, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_YTOSIZ),_itoa( pJ2KOptions->uYTOsiz, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_DECOMPLEVEL),_itoa( pJ2KOptions->uDecompLevel, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_GUARDBITS),_itoa( pJ2KOptions->uGuardBits, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_MANTISSA),_itoa( pJ2KOptions->nDerivedBaseMantissa, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_EXPONENT),_itoa( pJ2KOptions->nDerivedBaseExponent, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_CODEBLOCKWIDTH),_itoa( pJ2KOptions->nCodBlockWidth, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_J2KOPTIONS_IDEDT_CODEBLOCKHEIGHT),itoa( pJ2KOptions->nCodBlockHeight, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_SAVE_IDEDT_J2KTARGETSIZE),itoa( pJ2KOptions->uTargetFileSize, szNo , 10 ) ); SetWindowText(GetDlgItem (hDlg,LT_DLG_SAVE_IDEDT_QFACTOR),itoa( Data.nTempQFactor, szNo , 10 ) ); sprintf(szNo,"%f",pJ2KOptions->fCompressionRatio); SetWindowText(GetDlgItem (hDlg,LT_DLG_SAVE_IDEDT_J2KCOMPRESSIONRATIO ),szNo); switch(pJ2KOptions->uCompressionControl) { case J2K_COMPRESSION_RATIO: ComboBox_SetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KCOMPRESSIONCONTROL),0); ShowHideCompressionFields(hDlg,0); break; case J2K_COMPRESSION_TARGETSIZE: ComboBox_SetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KCOMPRESSIONCONTROL),1); ShowHideCompressionFields(hDlg,1); break; case J2K_COMPRESSION_QFACTOR : ComboBox_SetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KCOMPRESSIONCONTROL),2); ShowHideCompressionFields(hDlg,2); break; } switch(pJ2KOptions->uProgressOrder) { case J2K_LAYER_RESOLUTION_COMPONENT_POSITION : ComboBox_SetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KPROGRESSIONORDER),0); break; case J2K_RESOLUTION_LAYER_COMPONENT_POSITION : ComboBox_SetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KPROGRESSIONORDER),1); break; case J2K_RESOLUTION_POSITION_COMPONENT_LAYER : ComboBox_SetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KPROGRESSIONORDER),2); break; case J2K_POSITION_COMPONENT_RESOLUTION_LAYER : ComboBox_SetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KPROGRESSIONORDER),3); break; case J2K_COMPONENT_POSITION_RESOLUTION_LAYER : ComboBox_SetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KPROGRESSIONORDER),4); break; } } L_VOID ShowHideCompressionFields(HWND hDlg , L_INT nIndex) { switch(nIndex) { //Compression Ratio case 0: ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDEDT_J2KTARGETSIZE),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDSTC_J2KTARGETSIZE),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDSTC_J2KCOMPRESSIONRATIO),SW_SHOW); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDEDT_J2KCOMPRESSIONRATIO),SW_SHOW); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDEDT_QFACTOR),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDSTC_QFACTOR),SW_HIDE); break; //Target File Size case 1: ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDEDT_J2KTARGETSIZE),SW_SHOW); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDSTC_J2KTARGETSIZE),SW_SHOW); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDSTC_J2KCOMPRESSIONRATIO),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDEDT_J2KCOMPRESSIONRATIO),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDEDT_QFACTOR),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDSTC_QFACTOR),SW_HIDE); break; //Use QFactor case 2: ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDEDT_J2KTARGETSIZE),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDSTC_J2KTARGETSIZE),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDSTC_J2KCOMPRESSIONRATIO),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDEDT_J2KCOMPRESSIONRATIO),SW_HIDE); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDEDT_QFACTOR),SW_SHOW); ShowWindow(GetDlgItem(hDlg,LT_DLG_SAVE_IDSTC_QFACTOR),SW_SHOW); break; } } BOOL CALLBACK SetJ2KOptionsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { int i; switch(uMsg) { case WM_INITDIALOG: for(i = 0 ; i < SIZE_OF_ARRAY(J2KCompressionStrings);i++) { ComboBox_AddString(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KCOMPRESSIONCONTROL), J2KCompressionStrings[i]); } for(i = 0 ; i < SIZE_OF_ARRAY(J2KProgressingOrders);i++) { ComboBox_AddString(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KPROGRESSIONORDER), J2KProgressingOrders[i]); } FileSaveFillJ2KOptionsAdvanced ( hDlg,&Data.J2KOptions) ; break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: EndDialog(hDlg, FALSE); break; case IDOK: if(FileSaveGetJ2KOptionsAdvanced(hDlg,&Data.J2KOptions)) { L_DicomSetJ2KOptions(Data.hDicomDS,&Data.J2KOptions); EndDialog(hDlg, TRUE); } break; case LT_DLG_J2KOPTIONS_IDBTN_DEFAULT: { FILEJ2KOPTIONS J2K_Options ; L_DicomGetDefaultJ2KOptions(Data.hDicomDS,&J2K_Options,sizeof(FILEJ2KOPTIONS)); FileSaveFillJ2KOptionsAdvanced (hDlg, &J2K_Options ) ; } break; case LT_DLG_SAVE_IDCMB_J2KCOMPRESSIONCONTROL: if(HIWORD(wParam) == CBN_SELCHANGE) { int nCursel = (ComboBox_GetCurSel(GetDlgItem (hDlg,LT_DLG_SAVE_IDCMB_J2KCOMPRESSIONCONTROL))); if(nCursel != CB_ERR ) { ShowHideCompressionFields(hDlg,nCursel); } } break; } break; default: return FALSE; } return TRUE; } BOOL CALLBACK InsModuleDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { pDICOMIOD pIOD=NULL; static L_UINT32 nClass; static L_UINT16 nFlags; L_INT nIdx; switch(uMsg) { case WM_INITDIALOG: L_DicomGetInfoDS(Data.hDicomDS, &nClass, &nFlags); pIOD = L_DicomFindClassIOD(nClass); if(!pIOD) { EndDialog(hDlg, FALSE); return FALSE; } pIOD = L_DicomGetChildIOD(pIOD); while(pIOD) { if(pIOD->nType == IOD_TYPE_MODULE) { nIdx = ComboBox_AddString(GetDlgItem(hDlg, IDC_COMBO1), pIOD->pszName); ComboBox_SetItemData(GetDlgItem(hDlg, IDC_COMBO1), nIdx, pIOD->nCode); } pIOD = L_DicomGetNextIOD(pIOD, TRUE); } ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_COMBO1), 0); break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: case IDABORT: EndDialog(hDlg, FALSE); break; case IDOK: Data.lModuleCode = (L_UINT32)ComboBox_GetItemData(GetDlgItem(hDlg, IDC_COMBO1), ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_COMBO1))); EndDialog(hDlg, TRUE); break; } break; default: return FALSE; } return TRUE; } L_VOID ProcessImage(HWND hDlg, L_INT nID) { pBITMAPHANDLE pBitmap = NULL; BITMAPHANDLE TmpBitmap; static L_INT32 nAngle = 90; static L_INT bFlag = TRUE; static COLORREF crBack = RGB(0,0,0); static L_INT nBits=8; static L_UINT32 uColorResFlags=CRF_FIXEDPALETTE|CRF_JARVISDITHERING; static L_UINT32 uProcess=1; RGBQUAD L_HUGE* pLUT=NULL; L_INT nRet=0; L_UINT16 uRet; DICOMIMAGE Info; HCURSOR hOldCursor = NULL; /* which image do we process? */ L_DicomGetInfoImage(Data.hDicomDS, Data.pCurrentElement, &Info, (Data.BitmapListCount>0)?Data.BitmapListIndex:0); if(Data.Bitmap.Flags.Allocated) pBitmap = &Data.Bitmap; else if(Data.BitmapListCount > 0) { L_GetBitmapListItem(Data.hBitmapList, Data.BitmapListIndex, &TmpBitmap,sizeof(BITMAPHANDLE)); pBitmap = &TmpBitmap; } if(!pBitmap) return; if(!pBitmap->Flags.Allocated) return; hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); /* process the image */ /* which process? */ switch(nID) { case ID_FLIP: nRet = L_FlipBitmap(pBitmap); break; case ID_REVERSE: nRet = L_ReverseBitmap(pBitmap); break; case ID_ROTATE: { ROTATEDLGPARAMS DlgParams; memset(&DlgParams, 0, sizeof(ROTATEDLGPARAMS)); DlgParams.uStructSize = sizeof(ROTATEDLGPARAMS); DlgParams.nAngle = nAngle; DlgParams.bResize = bFlag; DlgParams.crBack = crBack; DlgParams.uRotateFlags= DLG_ROTATE_SHOW_RESIZE; DlgParams.pBitmap = pBitmap; DlgParams.uDlgFlags = DLG_ROTATE_AUTOPROCESS | DLG_ROTATE_SHOW_PREVIEW | DLG_ROTATE_SHOW_BACKCOLOR; nRet = L_DlgRotate(hDlg,&DlgParams); nAngle = DlgParams.nAngle; bFlag = DlgParams.bResize; crBack = DlgParams.crBack; break; } case ID_RESIZE: { if(Data.BitmapListCount>0) { MessageBox(hDlg, "This DICOM image contains multiple frames and you cannot resize only one frame. This option is disabled for this image", "Resize", MB_ICONINFORMATION | MB_OK); nRet = SUCCESS_DLG_CANCEL; } else { RESIZEDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(RESIZEDLGPARAMS)); DlgParams.uStructSize = sizeof(RESIZEDLGPARAMS); DlgParams.pBitmap = pBitmap; DlgParams.uOriginalWidth = BITMAPWIDTH(pBitmap); DlgParams.uOriginalHeight = BITMAPHEIGHT(pBitmap); DlgParams.uOriginalBitsPerPixel = pBitmap->BitsPerPixel; DlgParams.uOriginalResolutionX = pBitmap->XResolution; DlgParams.uOriginalResolutionY = pBitmap->YResolution; DlgParams.uNewWidth = BITMAPWIDTH(pBitmap); DlgParams.uNewHeight = BITMAPHEIGHT(pBitmap); DlgParams.uNewResolutionX = pBitmap->XResolution; DlgParams.uNewResolutionY = pBitmap->YResolution; DlgParams.uResize = SIZE_NORMAL ; DlgParams.uDlgFlags = DLG_RESIZE_AUTOPROCESS | DLG_RESIZE_SHOW_PERCENTAGE | DLG_RESIZE_SHOW_IDENTICALVALUE | DLG_RESIZE_SHOW_MAINTAINASPECT | DLG_RESIZE_SHOW_RESOLUTIONGRP; nRet = L_DlgResize ( hDlg, &DlgParams ) ; } break; } case ID_POSTERIZE: { POSTERIZEDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(RESIZEDLGPARAMS)); DlgParams.uStructSize = sizeof(POSTERIZEDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nLevels = 2; DlgParams.uDlgFlags = DLG_POSTERIZE_AUTOPROCESS | DLG_POSTERIZE_SHOW_PREVIEW| DLG_POSTERIZE_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgPosterize ( hDlg, &DlgParams ) ; break; } case ID_MOSAIC: { MOSAICDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(MOSAICDLGPARAMS)); DlgParams.uStructSize = sizeof(MOSAICDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.uDim = 3; DlgParams.uDlgFlags = DLG_MOSAIC_AUTOPROCESS | DLG_MOSAIC_SHOW_PREVIEW| DLG_MOSAIC_SHOW_TOOL_ZOOMLEVEL; nRet = L_DlgMosaic ( hDlg, &DlgParams ) ; break; } case ID_AVERAGE: { AVERAGEDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(AVERAGEDLGPARAMS)); DlgParams.uStructSize = sizeof(AVERAGEDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.uDim = 3 ; DlgParams.uDlgFlags = DLG_AVERAGE_AUTOPROCESS | DLG_AVERAGE_SHOW_PREVIEW| DLG_AVERAGE_SHOW_TOOL_ZOOMLEVEL; nRet = L_DlgAverage ( hDlg, &DlgParams ) ; break; } case ID_MEDIAN: { MEDIANDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(MEDIANDLGPARAMS)); DlgParams.uStructSize = sizeof(MEDIANDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.uDim = 3 ; DlgParams.uDlgFlags = DLG_MEDIAN_AUTOPROCESS | DLG_MEDIAN_SHOW_PREVIEW| DLG_MEDIAN_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgMedian ( hDlg, &DlgParams ) ; break; } case ID_SHARPEN: { SHARPENDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(SHARPENDLGPARAMS)); DlgParams.uStructSize = sizeof(SHARPENDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nSharpness = 0; DlgParams.uDlgFlags = DLG_SHARPEN_AUTOPROCESS | DLG_SHARPEN_SHOW_PREVIEW| DLG_SHARPEN_SHOW_TOOL_ZOOMLEVEL; nRet = L_DlgSharpen( hDlg, &DlgParams ) ; break; } case ID_OILIFY: { OILIFYDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(OILIFYDLGPARAMS)); DlgParams.uStructSize = sizeof(OILIFYDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.uDim = 3; DlgParams.uDlgFlags = DLG_OILIFY_AUTOPROCESS | DLG_OILIFY_SHOW_PREVIEW| DLG_OILIFY_SHOW_TOOL_ZOOMLEVEL; nRet = L_DlgOilify ( hDlg, &DlgParams ) ; break; } case ID_MIN: { MINFILTERDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(MINFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(MINFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap; DlgParams.uDim = 3; DlgParams.uDlgFlags = DLG_MINFILTER_AUTOPROCESS | DLG_MINFILTER_SHOW_PREVIEW| DLG_MINFILTER_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgMinFilter ( hDlg, &DlgParams ) ; break; } case ID_MAX: { MAXFILTERDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(MAXFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(MAXFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.uDim = 3 ; DlgParams.uDlgFlags = DLG_MAXFILTER_AUTOPROCESS | DLG_MAXFILTER_SHOW_PREVIEW| DLG_MAXFILTER_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgMaxFilter ( hDlg, &DlgParams ); break; } case ID_SOLARIZE: { SOLARIZEDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(SOLARIZEDLGPARAMS)); DlgParams.uStructSize = sizeof(SOLARIZEDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nThreshold = 0 ; DlgParams.uDlgFlags = DLG_SOLARIZE_AUTOPROCESS | DLG_SOLARIZE_SHOW_PREVIEW| DLG_SOLARIZE_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgSolarize ( hDlg, &DlgParams ) ; break; } case ID_GRADIENT: { GRADIENTFILTERDLGPARAMS DlgParams; memset (&DlgParams,0,sizeof(GRADIENTFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(GRADIENTFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.pFilter = FLT_GRADIENT_N ; DlgParams.uDlgFlags = DLG_GRADIENTFILTER_AUTOPROCESS | DLG_GRADIENTFILTER_SHOW_PREVIEW| DLG_GRADIENTFILTER_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgGradientFilter( hDlg, &DlgParams ) ; break; } case ID_LAPLACE: { LAPLACIANFILTERDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(LAPLACIANFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(LAPLACIANFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.pFilter = FLT_LAPLACE_1 ; DlgParams.uDlgFlags = DLG_LAPLACIANFILTER_AUTOPROCESS | DLG_LAPLACIANFILTER_SHOW_PREVIEW| DLG_LAPLACIANFILTER_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgLaplacianFilter ( hDlg, &DlgParams ) ; break; } case ID_SOBEL: { SOBELFILTERDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(SOBELFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(SOBELFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.pFilter = FLT_SOBEL_HORZ ; DlgParams.uDlgFlags = DLG_SOBELFILTER_AUTOPROCESS | DLG_SOBELFILTER_SHOW_PREVIEW| DLG_SOBELFILTER_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgSobelFilter ( hDlg, &DlgParams ) ; break; } case ID_PREWITT: { PREWITTFILTERDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(PREWITTFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(PREWITTFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.pFilter = FLT_PREWITT_HORZ ; DlgParams.uDlgFlags = DLG_PREWITTFILTER_AUTOPROCESS | DLG_PREWITTFILTER_SHOW_PREVIEW| DLG_PREWITTFILTER_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgPrewittFilter ( hDlg, &DlgParams ) ; break; } case ID_SHIFTDIFF: { SHIFTDIFFERENCEFILTERDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(SHIFTDIFFERENCEFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(SHIFTDIFFERENCEFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.pFilter = FLT_SHIFTDIFF_DIAG ; DlgParams.uDlgFlags = DLG_SHIFTDIFFERENCEFILTER_AUTOPROCESS | DLG_SHIFTDIFFERENCEFILTER_SHOW_PREVIEW| DLG_SHIFTDIFFERENCEFILTER_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgShiftDifferenceFilter ( hDlg, &DlgParams ) ; break; } case ID_LINESEG: { LINESEGMENTFILTERDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(LINESEGMENTFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(LINESEGMENTFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.pFilter = FLT_LINESEG_HORZ ; DlgParams.uDlgFlags = DLG_LINESEGMENTFILTER_AUTOPROCESS | DLG_LINESEGMENTFILTER_SHOW_PREVIEW| DLG_LINESEGMENTFILTER_SHOW_TOOL_ZOOMLEVEL; nRet = L_DlgLineSegmentFilter ( hDlg, &DlgParams ) ; break; } case ID_EROSION: { EROSIONFILTERDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(EROSIONFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(EROSIONFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.pFilter = BFLT_EROSION_OMNI ; DlgParams.uDlgFlags = DLG_EROSIONFILTER_AUTOPROCESS | DLG_EROSIONFILTER_SHOW_PREVIEW| DLG_EROSIONFILTER_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgErosionFilter ( hDlg, &DlgParams ) ; break; } case ID_DILATION: { DILATIONFILTERDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(DILATIONFILTERDLGPARAMS)); DlgParams.uStructSize = sizeof(DILATIONFILTERDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.pFilter = BFLT_DILATION_OMNI ; DlgParams.uDlgFlags = DLG_DILATIONFILTER_AUTOPROCESS | DLG_DILATIONFILTER_SHOW_PREVIEW| DLG_DILATIONFILTER_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgDilationFilter ( hDlg, &DlgParams ) ; break; } case ID_HALFTONE: { L_INT nRet = SUCCESS_DLG_OK ; GETDIRECTORYDLGPARAMS DirectoryDlgParams ; ZeroMemory ( &DirectoryDlgParams, sizeof (GETDIRECTORYDLGPARAMS)) ; DirectoryDlgParams.uStructSize = sizeof (GETDIRECTORYDLGPARAMS); DirectoryDlgParams.pszDirectory = malloc ( _MAX_PATH * 2 ) ; DirectoryDlgParams.pszTitle = "Select Border Images Folder" ; DirectoryDlgParams.nBuffSize = _MAX_PATH ; DirectoryDlgParams.pszFilter = NULL ; DirectoryDlgParams.nFilterIndex = 1 ; nRet = L_DlgGetDirectory ( hDlg, &DirectoryDlgParams ) ; // Get the Border directory if ( nRet == SUCCESS_DLG_OK ) { HALFTONEDLGPARAMS DlgParams; DLGBITMAPLIST BitmapList ; L_INT i = 0 ; BitmapList.pBitmapList = malloc ( sizeof ( DLGBITMAPLISTITEM ) * nImageListCount ) ; if ( NULL == BitmapList.pBitmapList ) { nRet = ERROR_NO_MEMORY ; } else { for ( i = 0 ; i < nImageListCount ; i++ ) { BitmapList.pBitmapList [ i ].pBitmap = malloc ( sizeof ( BITMAPHANDLE ) ) ; BitmapList.pBitmapList [ i ].pszFileName = NULL ; BitmapList.pBitmapList [ i ].pszDescription = malloc ( sizeof ( L_TCHAR ) * L_MAXPATH ) ; } } GenerateBitampList ( DirectoryDlgParams.pszDirectory, &BitmapList, FALSE ) ; memset(&DlgParams,0,sizeof(HALFTONEDLGPARAMS)); DlgParams.uStructSize = sizeof(HALFTONEDLGPARAMS); DlgParams.pBitmapList = &BitmapList; DlgParams.pBitmap = pBitmap ; DlgParams.nAngle = 0 ; DlgParams.uType = HT_PRINT ; DlgParams.uDlgFlags = DLG_HALFTONE_AUTOPROCESS| DLG_HALFTONE_SHOW_PREVIEW| DLG_HALFTONE_SHOW_TOOL_ZOOMLEVEL ; L_CreateBitmapList ( &DlgParams.hList ) ; nRet = L_DlgHalftone ( hDlg, &DlgParams ) ; // clean up if ( NULL != DlgParams.hList ) { L_UINT uCount ; L_GetBitmapListCount ( DlgParams.hList, &uCount ) ; for ( i = 0 ; i < ( L_INT ) uCount ; i++ ) { L_RemoveBitmapListItem ( DlgParams.hList, ( i - ( uCount - 1 ) ), NULL ) ; } L_DestroyBitmapList ( DlgParams.hList ) ; } // clean up for ( i = 0 ; i < nImageListCount; i++ ) { if ( NULL != BitmapList.pBitmapList [ i ].pBitmap ) { if ( BitmapList.pBitmapList [ i ].pBitmap->Flags.Allocated ) { L_FreeBitmap ( BitmapList.pBitmapList [ i ].pBitmap ) ; } free ( BitmapList.pBitmapList [ i ].pBitmap ) ; } if ( NULL != BitmapList.pBitmapList [ i ].pszDescription ) { free ( BitmapList.pBitmapList [ i ].pszDescription ) ; } } if ( NULL != BitmapList.pBitmapList ) { free ( BitmapList.pBitmapList ) ; } } break; } case ID_GRAYSCALE8: nRet = L_GrayScaleBitmap(pBitmap, 8); break; case ID_GRAYSCALE12: nRet = L_GrayScaleBitmap(pBitmap, 12); break; case ID_GRAYSCALE16: nRet = L_GrayScaleBitmap(pBitmap, 16); break; case ID_COLORRES: { COLORRESDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(COLORRESDLGPARAMS)); DlgParams.uStructSize = sizeof(COLORRESDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nBitsPerPixel = pBitmap->BitsPerPixel ; DlgParams.uColorResFlags = CRF_SLOWMATCH; DlgParams.nBitsPerPixel = nBits ; DlgParams.uColorResFlags = uColorResFlags; DlgParams.uDlgFlags = DLG_COLORRES_SHOW_PREVIEW | DLG_COLORRES_SHOW_ORDER | DLG_COLORRES_SHOW_TOOL_ZOOMLEVEL | DLG_COLORRES_SHOW_OPENPALFILE ; DlgParams.uDlgFlagsEx = DLG_COLORRES_SHOW_BITALL | DLG_COLORRES_SHOW_DITHER_ALL | DLG_COLORRES_SHOW_PAL_ALL ; nBits = DlgParams.nBitsPerPixel; uColorResFlags = DlgParams.uColorResFlags; if(L_DlgColorRes(hDlg,&DlgParams) == SUCCESS_DLG_OK) { L_INT nValue=0; nRet = L_ColorResBitmap ( pBitmap, pBitmap, sizeof(BITMAPHANDLE), DlgParams.nBitsPerPixel, DlgParams.uColorResFlags, NULL, DlgParams.hpalCustom, 0, NULL, NULL); } break; } case ID_WINDOWLEVEL: { WINDOWLEVELDLGPARAMS DlgParams; L_INT nLowBit = 0 ; L_INT nHighBit = 0 ; L_INT nSize = 0 ; L_INT nLow = 0 ; L_INT nHigh = 0 ; L_DOUBLE fWindowCenter =0.0; L_DOUBLE fWindowWidth =0.0; // get min/max bits L_GetMinMaxBits ( pBitmap, &nLowBit, &nHighBit ) ; // get min/max values L_GetMinMaxVal ( pBitmap, &nLow, &nHigh ) ; pBitmap->MinVal = nLow ; pBitmap->MaxVal = nHigh ; nSize = ( L_UINT32 ) ( 1L<< ( nHighBit - nLowBit + 1 ) ) ; memset( &DlgParams, 0, sizeof(WINDOWLEVELDLGPARAMS)); DlgParams.uStructSize = sizeof ( WINDOWLEVELDLGPARAMS ) ; DlgParams.pBitmap = pBitmap ; DlgParams.pLUT = ( RGBQUAD L_HUGE* ) malloc ( ( nSize * sizeof ( RGBQUAD ) ) ) ; DlgParams.uLUTLength = ( L_UINT32 ) nSize ; DlgParams.uLowBit = nLowBit ; DlgParams.uHighBit = nHighBit ; DlgParams.nLow = nLow ; DlgParams.nHigh = nHigh ; switch ( L_IsGrayScaleBitmap ( pBitmap ) ) { case GRAY_ORDEREDNORMAL: { DlgParams.crStart = RGB ( 0, 0, 0 ) ; DlgParams.crEnd = RGB ( 255, 255, 255 ) ; if(L_GetLinearVOILUT(pBitmap, &fWindowCenter, &fWindowWidth,0)==SUCCESS) { DlgParams.nLow = (L_INT)(fWindowCenter - (fWindowWidth)/2); DlgParams.nHigh = (L_INT)(fWindowCenter + (fWindowWidth)/2); } break ; } case GRAY_ORDEREDINVERSE: { DlgParams.crStart = RGB ( 255, 255, 255 ) ; DlgParams.crEnd = RGB ( 0, 0, 0 ) ; if(L_GetLinearVOILUT(pBitmap, &fWindowCenter, &fWindowWidth,0)==SUCCESS) { DlgParams.nLow = (L_INT)(fWindowCenter - (fWindowWidth)/2); DlgParams.nHigh = (L_INT)(fWindowCenter + (fWindowWidth)/2); } break ; } case GRAY_NOTORDERED: { DlgParams.crStart = RGB ( 0, 0, 0 ) ; DlgParams.crEnd = RGB ( 255, 255, 255 ) ; break ; } default: { MessageBox ( hDlg, TEXT ( "Window Level is not supported for this bitmap order" ), TEXT ( "Window Level Error" ), MB_OK ) ; return ; } } DlgParams.uWindowLevelFlags = FILLLUT_OUTSIDE | FILLLUT_LINEAR ; DlgParams.uDlgFlags = DLG_WINDOWLEVEL_AUTOPROCESS | DLG_WINDOWLEVEL_SHOW_PREVIEW ; nRet = L_DlgWindowLevel(hDlg, &DlgParams ); free(DlgParams.pLUT); break; } case ID_INVERT: nRet = L_InvertBitmap(pBitmap); break; case ID_BRIGHTNESS: { BRIGHTNESSDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(BRIGHTNESSDLGPARAMS)); DlgParams.uStructSize = sizeof(BRIGHTNESSDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nChange = 0 ; DlgParams.uDlgFlags = DLG_BRIGHTNESS_AUTOPROCESS | DLG_BRIGHTNESS_SHOW_PREVIEW| DLG_BRIGHTNESS_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgBrightness ( hDlg, &DlgParams ) ; break; } case ID_CONTRAST: { CONTRASTDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(CONTRASTDLGPARAMS)); DlgParams.uStructSize = sizeof(CONTRASTDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nChange = 0; DlgParams.uDlgFlags = DLG_CONTRAST_AUTOPROCESS | DLG_CONTRAST_SHOW_PREVIEW| DLG_CONTRAST_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgContrast ( hDlg, &DlgParams ) ; break; } case ID_HUE: { HUEDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(HUEDLGPARAMS)); DlgParams.uStructSize = sizeof(HUEDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nAngle = 0 ; DlgParams.uDlgFlags = DLG_HUE_AUTOPROCESS | DLG_HUE_SHOW_PREVIEW| DLG_HUE_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgHue ( hDlg, &DlgParams ) ; break; } case ID_SATURATION: { SATURATIONDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(SATURATIONDLGPARAMS)); DlgParams.uStructSize = sizeof(SATURATIONDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nChange = 0 ; DlgParams.uDlgFlags = DLG_SATURATION_AUTOPROCESS | DLG_SATURATION_SHOW_PREVIEW| DLG_SATURATION_SHOW_TOOL_ZOOMLEVEL; nRet = L_DlgSaturation ( hDlg, &DlgParams ) ; break; } case ID_HISTOEQUALIZE: nRet = L_HistoEqualizeBitmap(pBitmap, GRAY_SPACE); break; case ID_STRETCHINTENSITY: nRet = L_StretchBitmapIntensity(pBitmap); break; case ID_GAMMA: { GAMMAADJUSTMENTDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(GAMMAADJUSTMENTDLGPARAMS)); DlgParams.uStructSize = sizeof(GAMMAADJUSTMENTDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nRedValue = 150 ; DlgParams.nGreenValue = 150 ; DlgParams.nBlueValue = 150 ; DlgParams.uDlgFlags = DLG_GAMMAADJUSTMENT_AUTOPROCESS | DLG_GAMMAADJUSTMENT_SHOW_PREVIEW| DLG_GAMMAADJUSTMENT_SHOW_TOOL_ZOOMLEVEL | DLG_GAMMAADJUSTMENT_FORCELINKCHANNELS; nRet = L_DlgGammaAdjustment ( hDlg, &DlgParams ) ; break; } case ID_DETECT: { INTENSITYDETECTDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(INTENSITYDETECTDLGPARAMS)); DlgParams.uStructSize = sizeof(INTENSITYDETECTDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.uHigh = 200; DlgParams.uLow = 100; DlgParams.crInColor = RGB ( 0, 0, 0 ) ; DlgParams.crOutColor = RGB ( 255, 255, 255 ) ; DlgParams.uChannel = IDB_CHANNEL_MASTER ; DlgParams.uDlgFlags = DLG_EDGEDETECTOR_AUTOPROCESS | DLG_EDGEDETECTOR_SHOW_PREVIEW| DLG_EDGEDETECTOR_SHOW_TOOL_ZOOMLEVEL; nRet = L_DlgIntensityDetect ( hDlg, &DlgParams ) ; break; } case ID_HISTOCONTRAST: { HISTOCONTRASTDLGPARAMS DlgParams; memset(&DlgParams,0,sizeof(HISTOCONTRASTDLGPARAMS)); DlgParams.uStructSize = sizeof(HISTOCONTRASTDLGPARAMS); DlgParams.pBitmap = pBitmap ; DlgParams.nChange = 0 ; DlgParams.uDlgFlags = DLG_HISTOCONTRAST_AUTOPROCESS | DLG_HISTOCONTRAST_SHOW_PREVIEW| DLG_HISTOCONTRAST_SHOW_TOOL_ZOOMLEVEL ; nRet = L_DlgHistoContrast ( hDlg, &DlgParams ) ; break; } } SetCursor(hOldCursor); /* now, update the DataSet */ if(nRet == SUCCESS_DLG_OK || nRet == SUCCESS) { if(Data.BitmapListCount>0) { hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); /* update the bitmap list */ L_SetBitmapListItem(Data.hBitmapList, Data.BitmapListIndex, &TmpBitmap); /* first remove existing image from Data Set*/ L_DicomDeleteImage(Data.hDicomDS, Data.pCurrentElement, Data.BitmapListIndex, 1); /* now insert the modified image into the Data Set*/ uRet = L_DicomInsertImage(Data.hDicomDS, Data.pCurrentElement, &TmpBitmap, Data.BitmapListIndex, Data.nSaveCompression, Data.nSavePhotometric, Data.nSaveBitsPerPixel, Data.nSaveQFactor, DICOM_SETIMAGE_AUTO_SET_VOI_LUT, NULL, NULL); SetCursor(hOldCursor); } else { hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); uRet = L_DicomSetImage(Data.hDicomDS, Data.pCurrentElement, pBitmap, Data.nSaveCompression, Data.nSavePhotometric, Data.nSaveBitsPerPixel, Data.nSaveQFactor, DICOM_SETIMAGE_AUTO_SET_VOI_LUT, NULL, NULL); SetCursor(hOldCursor); } if(uRet != DICOM_SUCCESS) MessageBox(hDlg, "Error Updating DataSet!", "Error", MB_OK); /* redraw the bitmap */ InvalidateRect(GetDlgItem(hDlg, IDC_IMAGEBTN), NULL, TRUE); UpdateWindow(GetDlgItem(hDlg, IDC_IMAGEBTN)); UpdateMenuStatus(hDlg); } return; } LRESULT CALLBACK ImageBtnWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { L_INT nScrollCode = (L_INT) LOWORD(wParam); /* scroll bar value */ L_INT16 nPos = (L_INT16) HIWORD(wParam);/* scroll box position */ L_INT nScrollInc; switch(uMsg) { case WM_VSCROLL: switch (nScrollCode) { case SB_BOTTOM: nScrollInc = Data.nVScrollMax - Data.nVScrollPos; break; case SB_TOP: nScrollInc = -Data.nVScrollPos; break; case SB_LINEDOWN: nScrollInc = Data.nVScrollStep; break; case SB_LINEUP: nScrollInc = -Data.nVScrollStep; break; case SB_PAGEDOWN: nScrollInc = max(Data.nVScrollStep, (Data.cyClient - Data.nVScrollStep)); break; case SB_PAGEUP: nScrollInc = -max(Data.nVScrollStep, (Data.cyClient - Data.nVScrollStep)); break; case SB_THUMBTRACK: case SB_THUMBPOSITION: nScrollInc = nPos - Data.nVScrollPos; break; default: nScrollInc = 0; break; } nScrollInc = max(-Data.nVScrollPos, min(nScrollInc, (Data.nVScrollMax - Data.nVScrollPos))); if(nScrollInc) { Data.nVScrollPos += nScrollInc; OffsetRect (&Data.rcDst, 0, -nScrollInc); InvalidateRect(hWnd, NULL, FALSE); SetScrollPos(hWnd, SB_VERT, Data.nVScrollPos, TRUE); UpdateWindow(hWnd); } return TRUE; break; case WM_HSCROLL: switch (nScrollCode) { case SB_LEFT: nScrollInc = -Data.nHScrollPos; break; case SB_RIGHT: nScrollInc = Data.nHScrollMax - Data.nHScrollPos; break; case SB_LINELEFT: nScrollInc = -Data.nHScrollStep; break; case SB_LINERIGHT: nScrollInc = Data.nHScrollStep; break; case SB_PAGELEFT: nScrollInc = -max(Data.nHScrollStep, (Data.cxClient - Data.nHScrollStep)); break; case SB_PAGERIGHT: nScrollInc = max(Data.nHScrollStep, (Data.cxClient - Data.nHScrollStep)); break; case SB_THUMBTRACK: case SB_THUMBPOSITION: nScrollInc = nPos - Data.nHScrollPos; break; default: nScrollInc = 0; break; } nScrollInc = max(-Data.nHScrollPos, min(nScrollInc, (Data.nHScrollMax - Data.nHScrollPos))); if(nScrollInc) { Data.nHScrollPos += nScrollInc; OffsetRect (&Data.rcDst, -nScrollInc, 0); InvalidateRect(hWnd, NULL, FALSE); SetScrollPos(hWnd, SB_HORZ, Data.nHScrollPos, TRUE); UpdateWindow(hWnd); } return TRUE; break; } return(CallWindowProc(Data.OldProc, hWnd, uMsg, wParam, lParam)); } L_VOID UpdateScrollBars(HWND hDlg) { L_INT nWidth, nHeight, nVScroll, nHScroll; DWORD dwStyle; RECT rcClient; GetClientRect(GetDlgItem(hDlg, IDC_IMAGEBTN), &rcClient); if(Data.bFit) { nWidth = 0; nHeight = 0; } else { nWidth = MulDiv (Data.Width, Data.Zoom, 100); nHeight = MulDiv (Data.Height, Data.Zoom, 100); } Data.cxClient = RECTWIDTH(&rcClient); Data.cyClient = RECTHEIGHT(&rcClient); dwStyle = GetWindowLong(GetDlgItem(hDlg, IDC_IMAGEBTN), GWL_STYLE); nVScroll = GetSystemMetrics (SM_CXVSCROLL) - GetSystemMetrics(SM_CXBORDER); nHScroll = GetSystemMetrics (SM_CYHSCROLL) - GetSystemMetrics(SM_CYBORDER); if (WS_VSCROLL & dwStyle) Data.cxClient += nVScroll; if (WS_HSCROLL & dwStyle) Data.cyClient += nHScroll; if (Data.cxClient < nWidth) { Data.cyClient -= nHScroll; if (Data.cyClient < nHeight) Data.cxClient -= nVScroll; } else if (Data.cyClient < nHeight) { Data.cxClient -= nVScroll; if (Data.cxClient < nWidth) Data.cyClient -= nHScroll; } Data.nHScrollStep = max (1, Data.cxClient / SCROLL_RATIO); Data.nVScrollStep = max (1, Data.cyClient / SCROLL_RATIO); Data.nVScrollMax = max (0, (nHeight - Data.cyClient)); Data.nVScrollPos = max (0, min (Data.nVScrollPos, Data.nVScrollMax)); Data.nHScrollMax = max (0, (nWidth - Data.cxClient)); Data.nHScrollPos = max (0, min (Data.nHScrollPos, Data.nHScrollMax)); if(Data.bFit) { SetRect(&Data.rcDst, 0, 0, Data.cxClient, Data.cyClient); MatchAspectRatio (&Data.rcDst, MulDiv(Data.Width, Data.Zoom, 100), MulDiv(Data.Height, Data.Zoom, 100)); } else { SetRect (&Data.rcDst, 0, 0, nWidth, nHeight); OffsetRect (&Data.rcDst, -Data.nHScrollPos, -Data.nVScrollPos); } SetScrollRange (GetDlgItem(hDlg, IDC_IMAGEBTN), SB_HORZ, 0, Data.nHScrollMax, FALSE); SetScrollPos (GetDlgItem(hDlg, IDC_IMAGEBTN), SB_HORZ, Data.nHScrollPos, TRUE); SetScrollRange (GetDlgItem(hDlg, IDC_IMAGEBTN), SB_VERT, 0, Data.nVScrollMax, FALSE); SetScrollPos (GetDlgItem(hDlg, IDC_IMAGEBTN), SB_VERT, Data.nVScrollPos, TRUE); } 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; } } L_VOID EditValue(HWND hDlg) { L_UINT uRet; L_INT nRet; HCURSOR hOldCursor=NULL; OPENFILENAME OpenFileName; OPENDLGPARAMS foParm; DICOMIMAGE Info; if(!Data.pCurrentElement) return; L_DicomGetInfoImage(Data.hDicomDS, Data.pCurrentElement, &Info, (Data.BitmapListCount>0)?Data.BitmapListIndex:0); _fmemset(&OpenFileName,0,sizeof(OPENFILENAME)); _fmemset(&foParm, 0, sizeof(OPENDLGPARAMS)); foParm.uStructSize = sizeof(OPENDLGPARAMS); OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.hwndOwner = hDlg; OpenFileName.lpstrFilter = NULL; OpenFileName.lpstrCustomFilter = NULL; OpenFileName.nMaxCustFilter = 0; OpenFileName.nFilterIndex = 0; OpenFileName.nMaxFileTitle = 0; OpenFileName.lpstrInitialDir = NULL; OpenFileName.lpstrFilter = NULL; OpenFileName.lpstrTitle = "Pick image to insert"; OpenFileName.nFileOffset = 0; OpenFileName.nFileExtension = 0; OpenFileName.lpstrDefExt = NULL; OpenFileName.lpfnHook = NULL; foParm.uDlgFlags = DLG_OPEN_SHOW_PREVIEW | DLG_OPEN_LOADBITMAP | DLG_OPEN_SHOW_MULTIPAGE | DLG_OPEN_SHOW_FILEINFO | DLG_OPEN_USEFILESTAMP; hOldCursor = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); if(Data.Bitmap.Flags.Allocated || (Data.BitmapListCount>0)) { /* update a bitmap or bitmap list item */ nRet = L_DlgOpen(hDlg, &OpenFileName, &foParm); if(nRet == SUCCESS_DLG_OK ) { if(foParm.pFileData[ 0 ].pBitmap!=NULL) { if(Data.BitmapListCount>0) { /* update the bitmap list */ L_SetBitmapListItem(Data.hBitmapList, Data.BitmapListIndex, foParm.pFileData[ 0 ].pBitmap); /* first remove existing image from Data Set*/ L_DicomDeleteImage(Data.hDicomDS, Data.pCurrentElement, Data.BitmapListIndex, 1); /* now insert the modified image into the Data Set*/ uRet = L_DicomInsertImage(Data.hDicomDS, Data.pCurrentElement, foParm.pFileData[ 0 ].pBitmap, Data.BitmapListIndex, Data.nSaveCompression, Data.nSavePhotometric, Data.nSaveBitsPerPixel, Data.nSaveQFactor, DICOM_SETIMAGE_AUTO_SET_VOI_LUT, NULL, NULL); DisplayBitmapList(hDlg, Data.pCurrentElement); } else { uRet = L_DicomSetImage(Data.hDicomDS, Data.pCurrentElement, foParm.pFileData[ 0 ].pBitmap, Data.nSaveCompression, Data.nSavePhotometric, Data.nSaveBitsPerPixel, Data.nSaveQFactor, DICOM_SETIMAGE_AUTO_SET_VOI_LUT, NULL, NULL); DisplayBitmap(hDlg, Data.pCurrentElement); } if(uRet != DICOM_SUCCESS) MessageBox(hDlg, "Error Updating DataSet!", "Error", MB_OK); } CleanOpenDlgParam(&foParm); } } else { if(DialogBox(Data.hInst, MAKEINTRESOURCE(IDD_EDITVALUE), hDlg, EditValDlgProc)) { if(Data.lItemCount > 0) { /* update the dataset with the new values */ if(!L_DicomSetConvertValue(Data.hDicomDS, Data.pCurrentElement, Data.pItems, Data.lItemCount)) MessageBox(hDlg, "Error Updating DataSet!", "Error", MB_OK); else { L_DicomFreeValue(Data.hDicomDS, Data.pCurrentElement); DisplayValues(hDlg, Data.pCurrentElement); } } else { L_DicomSetBinaryValue(Data.hDicomDS, Data.pCurrentElement, NULL, 0); DisplayValues(hDlg, Data.pCurrentElement); } if(Data.pItems) { GlobalFreePtr(Data.pItems); Data.pItems = NULL; } } } SetCursor(hOldCursor); } BOOL CALLBACK EditValDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static L_UINT32 lSize; static L_UINT32 lCount; static L_CHAR L_FAR* pText=NULL; L_CHAR L_FAR* pTemp=NULL; L_CHAR L_FAR* pItem=NULL; L_CHAR L_FAR* pFind=NULL; L_INT nLen; L_UINT32 x; L_CHAR szText[L_MAXPATH]; L_BOOL bMulti=FALSE; pDICOMVR pVR; L_UINT16 nVR; L_INT Index; switch(uMsg) { case WM_DESTROY: if(pText) GlobalFreePtr(pText); break; case WM_INITDIALOG: lCount = L_DicomGetCountValue(Data.hDicomDS, Data.pCurrentElement); lSize = L_DicomGetConvertValue(Data.hDicomDS, Data.pCurrentElement, NULL); pText = (L_CHAR L_FAR*)GlobalAllocPtr(GMEM_MOVEABLE, lSize * sizeof(L_CHAR)); pTemp = pText; if(pText) { lSize = L_DicomGetConvertValue(Data.hDicomDS, Data.pCurrentElement, pText); if(lCount > 1) { for(x=0; xnVR; pVR = L_DicomFindVR(nVR); if (pVR != NULL) { lstrcat(szText, pVR->pszName); if((pVR->nRestrict & VR_BINARY) || (pVR->nRestrict & VR_STRING)) bMulti = TRUE; } else { nVR = VR_UN; bMulti = TRUE; } SetDlgItemText(hDlg, IDC_LABEL1, szText); switch(nVR) { case VR_OB: case VR_UN: lstrcpy(szText, "Hexadecimal"); break; case VR_SS: case VR_US: case VR_OW: case VR_SL: case VR_IS: case VR_UL: lstrcpy(szText, "Integer"); break; case VR_AT: lstrcpy(szText, "Group:Element\r\n(Group and Element should be hexadecimal words)"); break; case VR_FD: case VR_FL: case VR_DS: lstrcpy(szText, "Float"); break; case VR_CS: case VR_SH: case VR_LO: case VR_AE: case VR_LT: case VR_ST: case VR_UI: case VR_UT: case VR_PN: if(bMulti != FALSE) lstrcpy(szText, "String"); else lstrcpy(szText, "Text"); break; case VR_AS: lstrcpy(szText, "Number Reference\r\n(Reference = 'days' or 'weeks' or 'months' or 'years')"); break; case VR_DA: lstrcpy(szText, "MM/DD/YYYY\r\n(MM=Month, DD=Day, YYYY=Year)"); break; case VR_DT: lstrcpy(szText, "MM/DD/YYYY HH:MM:SS.FFFFFF&OOOO\r\n(MM=Month, DD=Day, YYYY=Year)\r\n(HH=Hours, MM=Minutes, SS=Seconds, FFFFFF=Fractional Second, OOOO=Offset from Coordinated Universal Time)"); break; case VR_TM: lstrcpy(szText, "HH:MM:SS.FFFF\r\n(HH=Hours, MM=Minutes, SS=Seconds, FFFFFF=Fractional Second)"); break; default: lstrcpy(szText, ""); break; } SetDlgItemText(hDlg, IDC_LABEL2, szText); if (bMulti == FALSE) { EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_BUTTON2), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_BUTTON3), FALSE); } break; case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDCANCEL: case IDABORT: EndDialog(hDlg, FALSE); break; case IDC_BUTTON1: lstrcpy(szText, ""); GetWindowText(GetDlgItem(hDlg, IDC_EDIT1), szText, L_MAXPATH); if(lstrlen(szText)) { Index = ListBox_InsertString(GetDlgItem(hDlg, IDC_LIST1), ListBox_GetCurSel(GetDlgItem(hDlg, IDC_LIST1)), szText); ListBox_SetCurSel(GetDlgItem(hDlg, IDC_LIST1), Index); } break; case IDC_BUTTON2: if(ListBox_GetCount(GetDlgItem(hDlg, IDC_LIST1)) > 0) { Index = ListBox_GetCurSel(GetDlgItem(hDlg, IDC_LIST1)); ListBox_DeleteString(GetDlgItem(hDlg, IDC_LIST1), Index); if(Index > 0) ListBox_SetCurSel(GetDlgItem(hDlg, IDC_LIST1), Index-1); else ListBox_SetCurSel(GetDlgItem(hDlg, IDC_LIST1), 0); } break; case IDC_BUTTON3: lstrcpy(szText, ""); GetWindowText(GetDlgItem(hDlg, IDC_EDIT1), szText, L_MAXPATH); if(lstrlen(szText)) { Index = ListBox_InsertString(GetDlgItem(hDlg, IDC_LIST1), ListBox_GetCurSel(GetDlgItem(hDlg, IDC_LIST1))+1, szText); ListBox_SetCurSel(GetDlgItem(hDlg, IDC_LIST1), Index); } break; case IDC_BUTTON4: lstrcpy(szText, ""); GetWindowText(GetDlgItem(hDlg, IDC_EDIT1), szText, L_MAXPATH); if(lstrlen(szText)) { x = ListBox_GetCurSel(GetDlgItem(hDlg, IDC_LIST1)); if(x==LB_ERR) { ListBox_SetCurSel(GetDlgItem(hDlg, IDC_LIST1), 0); break; } ListBox_DeleteString(GetDlgItem(hDlg, IDC_LIST1), x); ListBox_InsertString(GetDlgItem(hDlg, IDC_LIST1), x, szText); ListBox_SetCurSel(GetDlgItem(hDlg, IDC_LIST1), x); } break; case IDC_LIST1: lstrcpy(szText, ""); ListBox_GetText(GetDlgItem(hDlg, IDC_LIST1), ListBox_GetCurSel(GetDlgItem(hDlg, IDC_LIST1)), szText); SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), szText); break; case IDOK: Data.lItemCount = ListBox_GetCount(GetDlgItem(hDlg, IDC_LIST1)); if(Data.lItemCount > 0) { nLen = 0; for(x=0;x1) { if(xnCount = nBitmapsCount + 1 ; } return SUCCESS ; } L_INT L_FAR L_EXPORT BrowseBitmapsCB ( pBITMAPHANDLE pBitmap, L_CHAR L_FAR *pszFile, pFILEINFO pInfo, L_INT nStatusCode, L_INT nPercent, L_VOID L_FAR *pUserData) { if ( nStatusCode == SUCCESS ) { LPDLGBITMAPLIST pBitmapList ; pBitmapList = ( LPDLGBITMAPLIST ) pUserData ; nBitmapsCount++ ; if ( nBitmapsCount >= nImageListCount) { nBitmapsCount-- ; return ERROR_USER_ABORT; } if ( ( pInfo->Width < BITMAPWIDTH ( pBitmap ) ) && ( pInfo->Height < BITMAPHEIGHT ( pBitmap ) ) ) { L_LoadBitmap ( pszFile, pBitmapList->pBitmapList[nBitmapsCount].pBitmap, sizeof(BITMAPHANDLE), 24, ORDER_BGR, NULL, NULL ) ; } else { L_CopyBitmap ( pBitmapList->pBitmapList [ nBitmapsCount ].pBitmap, pBitmap, sizeof(BITMAPHANDLE) ) ; } if ( NULL != pBitmapList->pBitmapList [ nBitmapsCount ].pszFileName ) { lstrcpy ( pBitmapList->pBitmapList [ nBitmapsCount ].pszFileName, pszFile ) ; } if ( NULL != pBitmapList->pBitmapList [ nBitmapsCount ].pszDescription ) { lstrcpy ( pBitmapList->pBitmapList [ nBitmapsCount ].pszDescription, pszFile ) ; } } return SUCCESS; }