// DicomDlg.cpp : implementation file // #include "stdafx.h" #include "DicomApp.h" #include "DicomDlg.h" #include "NewDlg.h" #include "LoadDlg.h" #include "SaveDlg.h" #include "InfoDlg.h" #include "VRDlg.h" #include "UIDDlg.h" #include "TagDlg.h" #include "IODDlg.h" #include "CGrpsDlg.h" #include "ConfoDlg.h" #include "About.h" #include "Module.h" #include "ImageDlg.h" #include "InsertDE.h" #include "ModifyDE.h" static UINT BITMAPLIST[] = { IDB_STORAGE_EXPANDED, IDB_STORAGE_COLLAPSED, IDB_STREAM, }; #define IDC_TIMER 800 #define IDC_PLAYTIMER 801 #define ID_ANIMATION 4 #define ID_PROCESSING 5 #define VIEW_WIDTH 0.2 enum { IMAGE_GET_CHANGE, IMAGE_GET_BRIGHTNESS, IMAGE_GET_CONTRAST, IMAGE_GET_HUE, IMAGE_GET_SATURATION, IMAGE_GET_HISTOCONTRAST, IMAGE_COLOR_RES, IMAGE_GRAYSCALE, IMAGE_COLOR_INVERT, IMAGE_HISTOGRAM_EQUALIZE, IMAGE_STRETCH_INTENSITY, IMAGE_GAMMA_CORRECT, IMAGE_INTENSITY_DETECT, IMAGE_WINDOW_LEVEL, IMAGE_DESPECKLE, IMAGE_ADD_NOISE, IMAGE_EMBOSS, IMAGE_GET_FILTER, IMAGE_GET_SIZE, IMAGE_FLIP, IMAGE_REVERSE, IMAGE_GET_ANGLE, IMAGE_VIEW, IMAGE_GET_HALFTONE }; enum { DLG_IMG_ROTATE, DLG_IMG_SHEAR, DLG_IMG_GRADIENT, DLG_IMG_EROSION, DLG_IMG_BRIGHTNESS, DLG_IMG_CONTRAST, DLG_IMG_HUE, DLG_IMG_SATURATION, DLG_IMG_HISTOCONTRAST }; ///////////////////////////////////////////////////////////////////////////// // CDicomDlg dialog CDicomDlg::CDicomDlg(CWnd* pParent /*=NULL*/) : CDialog(CDicomDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDicomDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CDicomDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDicomDlg) DDX_Control(pDX, IDC_LIST, m_List); DDX_Control(pDX, IDC_TREE, m_Tree); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDicomDlg, CDialog) //{{AFX_MSG_MAP(CDicomDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CLOSE() ON_NOTIFY(TVN_ITEMEXPANDED, IDC_TREE, OnItemexpandedTree) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnSelchangedTree) ON_WM_SIZE() ON_WM_TIMER() ON_COMMAND(ID_FILE_NEW, OnFileNew) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_COMMAND(ID_FILE_CLOSE, OnFileClose) ON_COMMAND(ID_FILE_SAVE, OnFileSave) ON_COMMAND(ID_FILE_CONFORMANCE, OnFileConformance) ON_COMMAND(ID_FILE_INFO, OnFileInfo) ON_COMMAND(ID_VIEW_LOWLEVEL, OnViewLowlevel) ON_COMMAND(ID_VIEW_HIGHLEVEL, OnViewHighlevel) ON_COMMAND(ID_VIEW_TAGS, OnViewTags) ON_COMMAND(ID_VIEW_VOLATILE, OnViewVolatile) ON_COMMAND(ID_VIEW_NORMAL, OnViewNormal) ON_COMMAND(ID_VIEW_FITIMAGETOWINDOW, OnViewFitimagetowindow) ON_COMMAND(ID_TABLES_VR, OnTablesVR) ON_COMMAND(ID_TABLES_UID, OnTablesUID) ON_COMMAND(ID_TABLES_TAG, OnTablesTag) ON_COMMAND(ID_TABLES_IOD, OnTablesIOD) ON_COMMAND(ID_DATASET_INSERT_ELEMENT, OnDatasetInsertElement) ON_COMMAND(ID_DATASET_DELETE_ELEMENT, OnDatasetDeleteElement) ON_COMMAND(ID_DATASET_MODIFY_VALUE, OnDatasetModifyValue) ON_COMMAND(ID_DATASET_INSERT_MODULE, OnDatasetInsertModule) ON_COMMAND(ID_DATASET_DELETE_MODULE, OnDatasetDeleteModule) ON_COMMAND(ID_ANIMATION_PLAY, OnAnimationPlay) ON_COMMAND(ID_ANIMATION_STOP, OnAnimationStop) ON_COMMAND(ID_ANIMATION_FIRST, OnAnimationFirst) ON_COMMAND(ID_ANIMATION_LAST, OnAnimationLast) ON_COMMAND(ID_ANIMATION_PREV, OnAnimationPrev) ON_COMMAND(ID_ANIMATION_NEXT, OnAnimationNext) ON_COMMAND(ID_ANIMATION_INFO, OnAnimationInfo) ON_COMMAND(ID_PROCESSING_FLIP, OnProcessingFlip) ON_COMMAND(ID_PROCESSING_REVERSE, OnProcessingReverse) ON_COMMAND(ID_PROCESSING_ROTATE, OnProcessingRotate) ON_COMMAND(ID_PROCESSING_SHEAR, OnProcessingShear) ON_COMMAND(ID_PROCESSING_RESIZE, OnProcessingResize) ON_COMMAND(ID_PROCESSING_GRADIENTFILTER, OnProcessingGradientfilter) ON_COMMAND(ID_PROCESSING_EROSIONFILTER, OnProcessingErosionfilter) ON_COMMAND(ID_PROCESSING_HALFTONE, OnProcessingHalftone) ON_COMMAND(ID_PROCESSING_GRAYSCALE, OnProcessingGrayscale) ON_COMMAND(ID_PROCESSING_GRAYSCALE12, OnProcessingGrayscale12) ON_COMMAND(ID_PROCESSING_GRAYSCALE16, OnProcessingGrayscale16) ON_COMMAND(ID_PROCESSING_COLORRESOLUTION, OnProcessingColorresolution) ON_COMMAND(ID_PROCESSING_WINDOWLEVEL, OnProcessingWindowlevel) ON_COMMAND(ID_PROCESSING_INVERT, OnProcessingInvert) ON_COMMAND(ID_PROCESSING_BRIGHTNESS, OnProcessingBrightness) ON_COMMAND(ID_PROCESSING_CONTRAST, OnProcessingContrast) ON_COMMAND(ID_PROCESSING_HUE, OnProcessingHue) ON_COMMAND(ID_PROCESSING_SATURATION, OnProcessingSaturation) ON_COMMAND(ID_PROCESSING_HISTOGRAMEQUALIZE, OnProcessingHistogramequalize) ON_COMMAND(ID_PROCESSING_HISTOCONTRAST, OnProcessingHistocontrast) ON_COMMAND(ID_PROCESSING_STRETCHINTENSITY, OnProcessingStretchintensity) ON_COMMAND(ID_PROCESSING_GAMMACORRECT, OnProcessingGammacorrect) ON_COMMAND(ID_PROCESSING_INTENSITYDETECT, OnProcessingIntensitydetect) ON_COMMAND(ID_PROCESSING_DESPECKLE, OnProcessingDespeckle) ON_COMMAND(ID_PROCESSING_ADDNOISE, OnProcessingAddnoise) ON_COMMAND(ID_PROCESSING_EMBOSS, OnProcessingEmboss) ON_COMMAND(ID_OPTIONS_LOAD, OnOptionsLoad) ON_COMMAND(ID_OPTIONS_SAVE, OnOptionsSave) ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout) ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList) ON_NOTIFY(NM_DBLCLK, IDC_TREE, OnDblclkTree) ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout) ON_COMMAND(ID_TABLES_CONTEXTGROUPS, OnTablesContextGroups) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDicomDlg message handlers BOOL CDicomDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon m_nIndex = 0; m_strPath = ""; m_bHighLevel = TRUE; m_bTag = FALSE; m_bVolatile = FALSE; m_bZoom = FALSE; m_bReset = FALSE; m_bCancel = FALSE; m_nLoadFlags = 0; m_nSaveFlags = 0; m_nSaveCompression = IMAGE_COMPRESSION_JPEG_LOSSY; m_nSavePhotometric = IMAGE_PHOTOMETRIC_RGB; m_nSaveBitsPerPixel = 24; m_nSaveQFactor = 25; m_hTimer = 0; m_pList = NULL; m_pImage = NULL; GetMenu()->EnableMenuItem(ID_FILE_CLOSE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_FILE_SAVE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_FILE_CONFORMANCE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_FILE_INFO, MF_GRAYED); GetMenu()->CheckMenuItem(ID_VIEW_HIGHLEVEL, MF_CHECKED); GetMenu()->EnableMenuItem(ID_ANIMATION_PLAY, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_STOP, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_FIRST, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_LAST, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_PREV, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_NEXT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_INFO, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION, MF_BYPOSITION|MF_GRAYED); GetMenu()->EnableMenuItem(ID_PROCESSING, MF_BYPOSITION|MF_GRAYED); GetMenu()->CheckMenuItem(ID_VIEW_NORMAL, MF_CHECKED); GetMenu()->CheckMenuItem(ID_VIEW_FITIMAGETOWINDOW, MF_UNCHECKED); DrawMenuBar(); LBase::LoadLibraries(LT_KRN); LBase::LoadLibraries(LT_DIS); LBase::LoadLibraries(LT_FIL); LBase::LoadLibraries(LT_IMG); LBase::LoadLibraries(LT_DLG); LBase::LoadLibraries(LT_DLGFILE); LDialogBase::Initialize(DLG_INIT_COLOR); WRPUNLOCKSUPPORT(); if(LSettings::IsSupportLocked(L_SUPPORT_MEDICAL)) { AfxMessageBox("Medical-Express support must be unlocked for this demo!"); EndDialog(-1); } int i; CBitmap Bitmap; CRect rcRect; m_Icon.Create(16, 16, ILC_MASK, 0, sizeof(BITMAPLIST) / sizeof(BITMAPLIST[0])); for (i = 0; i < sizeof(BITMAPLIST) / sizeof(BITMAPLIST[0]); i++) { Bitmap.LoadBitmap(BITMAPLIST[i]); m_Icon.Add(&Bitmap, (COLORREF)0xFFFFFF); Bitmap.DeleteObject(); } m_Tree.SetImageList(&m_Icon, TVSIL_NORMAL); if(!m_strFileName.IsEmpty()) { LoadFile(m_strFileName); m_hPlayTimer = SetTimer(IDC_PLAYTIMER, 1, NULL); } return TRUE; // return TRUE unless you set the focus to a control } void CDicomDlg::OnClose() { OnFileClose(); m_bReset = TRUE; m_Tree.DeleteAllItems(); m_Tree.RedrawWindow(); m_bReset = FALSE; m_bCancel = TRUE; CDialog::OnClose(); } void CDicomDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { HTREEITEM hItem; CRect rcRect, rcRect1, rcRect2; GetClientRect(rcRect); rcRect1.SetRect((L_UINT32)(rcRect.Width() * VIEW_WIDTH) + 2, 0, rcRect.Width(), rcRect.Height()); m_List.MoveWindow(rcRect1, TRUE); if (m_pImage != NULL) { m_List.GetClientRect(rcRect1); m_pImage->Move(rcRect1, TRUE); } rcRect2.SetRect(0, 0, (L_UINT32)(rcRect.Width() * VIEW_WIDTH), rcRect.Height()); m_Tree.MoveWindow(rcRect2, TRUE); hItem = m_Tree.GetSelectedItem(); if (hItem != NULL) { ShowValue(hItem); } CDialog::OnPaint(); } } HCURSOR CDicomDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CDicomDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); RedrawWindow(); } void CDicomDlg::OnFileNew() { CDicomNewDlg dlg; if (dlg.DoModal() != IDOK) { return; } OnFileClose(); m_DS.InitDS(dlg.m_nClass, dlg.m_nFlags); GetMenu()->EnableMenuItem(ID_FILE_CLOSE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_FILE_SAVE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_FILE_CONFORMANCE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_FILE_INFO, MF_ENABLED); DrawMenuBar(); FillTree(TVI_ROOT, NULL); m_Tree.SelectItem(m_Tree.GetFirstVisibleItem()); SetWindowText("DICOM Demo: New"); } void CDicomDlg::OnFileOpen() { CString strFileName; TCHAR szFilters[] =_T ("DICOM Files (*.dic)|*.dic|DCM Files (*.dcm)|*.dcm|All files (*.*)|*.*||"); CFileDialog dlg ( TRUE, _T ("dic"), _T ("*.dic"), OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters); if (dlg.DoModal () != IDOK) { return; } strFileName = dlg.GetPathName(); LoadFile(strFileName); } void CDicomDlg::SetLoadFile(LPTSTR pszFileName) { m_strFileName = pszFileName; } void CDicomDlg::LoadFile(CString &strName) { L_UINT16 nResult; OnFileClose(); CString strMsg; nResult = m_DS.LoadDS((L_CHAR *)(LPCTSTR)strName, m_nLoadFlags); if (nResult != DICOM_SUCCESS) { MessageBox("Not able to open the file", "DICOM ERROR", MB_ICONSTOP); return; } GetMenu()->EnableMenuItem(ID_FILE_CLOSE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_FILE_SAVE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_FILE_CONFORMANCE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_FILE_INFO, MF_ENABLED); DrawMenuBar(); FillTree(TVI_ROOT, NULL); m_Tree.SelectItem(m_Tree.GetFirstVisibleItem()); if ((m_Tree.GetCount() < 1) && (m_bHighLevel != FALSE)) { MessageBox("No Modules in this Data Set!", "Error", MB_ICONWARNING); OnViewLowlevel(); } strMsg.Format("DICOM Demo: %s",(LPCSTR)strName); SetWindowText(strMsg); } void CDicomDlg::OnFileClose() { m_bReset = TRUE; m_Tree.DeleteAllItems(); m_Tree.RedrawWindow(); m_bReset = FALSE; GetMenu()->EnableMenuItem(ID_FILE_CLOSE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_FILE_SAVE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_FILE_CONFORMANCE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_FILE_INFO, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION, MF_BYPOSITION|MF_GRAYED); GetMenu()->EnableMenuItem(ID_PROCESSING, MF_BYPOSITION|MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_PLAY, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_STOP, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_FIRST, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_LAST, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_PREV, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_NEXT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_INFO, MF_GRAYED); DrawMenuBar(); KillPlay(); m_List.DeleteAllItems(); m_List.RedrawWindow(); m_DS.ResetDS(); SetWindowText("DICOM Demo"); m_nImage = 0; } void CDicomDlg::OnFileSave() { L_UINT16 nResult; CString strName; TCHAR szFilters[] =_T ("DICOM Files (*.dic)|*.dic|All files (*.*)|*.*||"); CFileDialog dlg ( FALSE, _T ("dic"), _T ("*.dic"), OFN_OVERWRITEPROMPT, szFilters); // Get file name if (dlg.DoModal () != IDOK) { return; } nResult = m_DS.SaveDS((L_CHAR *)(LPCTSTR)dlg.GetPathName(), m_nSaveFlags); if (nResult != DICOM_SUCCESS) { MessageBox("Not able to save the file", "DICOM ERROR", MB_ICONSTOP); return; } } void CDicomDlg::OnFileConformance() { CDicomConformanceDlg dlg; dlg.m_pDS = &m_DS; dlg.DoModal(); } void CDicomDlg::OnFileInfo() { CDicomInfoDlg dlg; dlg.m_pDS = &m_DS; dlg.DoModal(); } void CDicomDlg::OnTablesVR() { CDicomVRDlg dlg; if (dlg.DoModal() != IDOK) { return; } } void CDicomDlg::OnTablesUID() { CDicomUIDDlg dlg; if (dlg.DoModal() != IDOK) { return; } } void CDicomDlg::OnTablesTag() { CDicomTagDlg dlg; if (dlg.DoModal() != IDOK) { return; } } void CDicomDlg::OnTablesIOD() { CDicomIODDlg dlg; if (dlg.DoModal() != IDOK) { return; } } void CDicomDlg::OnTablesContextGroups() { CContextGroupsDlg ContextGroupsDlg; ContextGroupsDlg.DoModal(); } void CDicomDlg::OnDatasetInsertElement() { pDICOMELEMENT pNeighbor=NULL; pDICOMELEMENT pElement; HTREEITEM hItem; HTREEITEM hNew; CDicomInsertElementDlg dlg; hItem = m_Tree.GetSelectedItem(); if (hItem != NULL) { pNeighbor = (pDICOMELEMENT)m_Tree.GetItemData(hItem); if ((m_DS.ExistsElement(pNeighbor) == FALSE) || (m_DS.IsVolatileElement(pNeighbor) != FALSE)) { return; } } KillPlay(); dlg.m_bChild = FALSE; if ((pNeighbor != NULL) && (pNeighbor->nLength == ELEMENT_LENGTH_MAX)) { dlg.m_bChild = TRUE; } if (dlg.DoModal() != IDOK) { return; } if (dlg.m_pTag == NULL) { return; } if ((hItem != NULL) && (dlg.m_bChild == FALSE)) { hItem = m_Tree.GetParentItem(hItem); } if (hItem == NULL) { hItem = TVI_ROOT; } pElement = m_DS.InsertElement(pNeighbor, dlg.m_bChild, dlg.m_pTag->nCode, dlg.m_pTag->nVR, dlg.m_bSequence, ELEMENT_INDEX_MAX); if (pElement != NULL) { hNew = InsertElement(hItem, pElement); m_Tree.SelectItem(hNew); } } void CDicomDlg::OnDatasetDeleteElement() { pDICOMELEMENT pElement; HTREEITEM hItem; hItem = m_Tree.GetSelectedItem(); if (hItem == NULL) { return; } pElement = (pDICOMELEMENT)m_Tree.GetItemData(hItem); if (pElement == NULL) { return; } if ((m_DS.ExistsElement(pElement) == FALSE) || (m_DS.IsVolatileElement(pElement) != FALSE)) { return; } m_DS.DeleteElement(pElement); m_Tree.DeleteItem(hItem); } L_BOOL CDicomDlg::CanInsertCompressedImage() { pDICOMELEMENT pElement =NULL; pElement = m_DS.FindFirstElement(NULL, TAG_TRANSFER_SYNTAX_UID, FALSE); if(pElement) { L_CHAR *pszText = NULL; L_UINT32 nLength; nLength = m_DS.GetConvertValue(pElement, NULL); pszText = (L_CHAR *)malloc(nLength); if(NULL != pszText) { m_DS.GetConvertValue(pElement, pszText); if((strcmp(pszText,UID_IMPLICIT_VR_LITTLE_ENDIAN) == 0)|| (strcmp(pszText,UID_EXPLICIT_VR_BIG_ENDIAN) == 0)) { free(pszText); return FALSE; } else { free(pszText); return TRUE; } free(pszText); } } return TRUE; } void CDicomDlg::OnDatasetModifyValue() { L_INT nResult; L_CHAR szName[_MAX_PATH]; L_UINT32 nCount; CString strText; pDICOMELEMENT pElement; HTREEITEM hItem; HTREEITEM hValue; LDialogFile dlg; LBitmapList List; OPENDLGPARAMS FOParm ; OPENFILENAME OpenFileName; hItem = m_Tree.GetSelectedItem(); if (hItem == NULL) { return; } pElement = (pDICOMELEMENT)m_Tree.GetItemData(hItem); if (pElement == NULL) { return; } if ((m_DS.ExistsElement(pElement) == FALSE) || (m_DS.IsVolatileElement(pElement) != FALSE)) { return; } if (pElement->nTag != TAG_PIXEL_DATA) { CDicomModifyElementDlg dlg; hValue = m_List.GetSelectedItem(); if (hValue == NULL) { hValue = m_List.GetFirstVisibleItem(); if (hValue != NULL) { m_List.SelectItem(hValue); } } if ((pElement->nVR == VR_SQ) || (pElement->nLength == ELEMENT_LENGTH_MAX)) { return; } dlg.m_nVR = pElement->nVR; dlg.m_nCount = m_List.GetCount(); dlg.m_strValue = m_List.GetItemText(hValue); if (dlg.DoModal() != IDOK) { return; } switch (dlg.m_nOperation) { case OPERATION_INSERT_AFTER: if (hValue == NULL) { hValue = TVI_LAST; } hValue = m_List.InsertItem(dlg.m_strValue, TVI_ROOT, hValue); break; case OPERATION_INSERT_BEFORE: if (hValue == NULL) { hValue = TVI_LAST; } else { hValue = m_List.GetPrevSiblingItem(hValue); if (hValue == NULL) { hValue = TVI_FIRST; } } hValue = m_List.InsertItem(dlg.m_strValue, TVI_ROOT, hValue); break; case OPERATION_DELETE: if (hValue != NULL) { m_List.DeleteItem(hValue); hValue = m_List.GetSelectedItem(); } break; case OPERATION_MODIFY: if (hValue == NULL) { hValue = m_List.InsertItem(dlg.m_strValue, TVI_ROOT); } else { m_List.SetItemText(hValue, dlg.m_strValue); } break; } m_List.RedrawWindow(); if (hValue != NULL) { m_List.SelectItem(hValue); } else { hValue = m_List.GetFirstVisibleItem(); m_List.SelectItem(hValue); } hValue = m_List.GetFirstVisibleItem(); if (hValue == NULL) { m_DS.SetBinaryValue(pElement, NULL, 0); return; } while (m_List.GetPrevSiblingItem(hValue) != NULL) { hValue = m_List.GetPrevSiblingItem(hValue); } nCount = 0; strText = ""; while (hValue != NULL) { if (nCount != 0) { strText += '\\'; } strText += m_List.GetItemText(hValue); nCount++; hValue = m_List.GetNextSiblingItem(hValue); } m_DS.SetConvertValue(pElement, (L_CHAR *)(LPCTSTR)strText, nCount); return; } if( (m_nSaveCompression !=IMAGE_COMPRESSION_NONE) && (CanInsertCompressedImage() == FALSE)) { AfxMessageBox("Current Data Set \"Transfer Syntax\" format doesn't allow inserting compressed images." "\nPlease set \"Image Compression\" to \"None\" in the \"Save Options\" dialog."); return ; } memset ( &FOParm, 0, sizeof(OPENDLGPARAMS)) ; memset ( &OpenFileName, 0, sizeof(OPENFILENAME)) ; OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.lpstrInitialDir = NULL; OpenFileName.Flags = OFN_EXPLORER; FOParm.uStructSize = sizeof(OPENDLGPARAMS); FOParm.uDlgFlags = DLG_OPEN_SHOW_FILEINFO | DLG_OPEN_SHOW_MULTIPAGE | DLG_OPEN_USEFILESTAMP; FOParm.bPreviewEnabled = TRUE; dlg.SetOpenParams(&FOParm) ; dlg.SetOpenFileName(&OpenFileName) ; dlg.EnablePreview(TRUE); nResult = dlg.DoModalOpen(m_hWnd); if (nResult != SUCCESS_DLG_OK) { return; } dlg.GetFileName(szName, sizeof(szName)); KillPlay(); nResult = List.Load(szName, 0, ORDER_BGRORGRAY); if (nResult != SUCCESS) { ShowValue(hItem); return; } m_DS.SetImageList( pElement, List.GetHandle(), m_nSaveCompression, m_nSavePhotometric, m_nSaveBitsPerPixel, m_nSaveQFactor, DICOM_SETIMAGE_AUTO_SET_VOI_LUT); ShowValue(hItem); } void CDicomDlg::OnDatasetInsertModule() { L_UINT32 nClass; L_UINT16 nFlags; L_BOOL b; L_UINT32 i; L_UINT32 j; DICOMMODULE ModuleOld; pDICOMMODULE pModule; pDICOMIOD pIOD; HTREEITEM hModule=NULL; HTREEITEM hItem; CString strName; CDicomModuleDlg dlg; dlg.m_pDS = &m_DS; if (dlg.DoModal() != IDOK) { return; } KillPlay(); pModule = m_DS.FindModule(dlg.m_nModule); if (pModule == NULL) { ModuleOld.nCount = 0; } else { memcpy(&ModuleOld, pModule, sizeof(DICOMMODULE)); } pModule = m_DS.InsertModule(dlg.m_nModule, dlg.m_bOptional); if (pModule == NULL) { return; } m_DS.GetInfoDS(&nClass, &nFlags); pIOD = LDicomIOD::FindModule(nClass, pModule->nModule); if (pIOD != NULL) { strName = pIOD->pszName; hModule = m_Tree.GetFirstVisibleItem(); if (hModule != NULL) { while (m_Tree.GetPrevSiblingItem(hModule) != NULL) { hModule = m_Tree.GetPrevSiblingItem(hModule); } while (hModule != NULL) { if (m_Tree.GetItemText(hModule) == pIOD->pszName) { break; } hModule = m_Tree.GetNextSiblingItem(hModule); } } } else { strName = "Unknown"; } if (hModule == NULL) { hModule = m_Tree.InsertItem(strName, GetImage(IDB_STORAGE_COLLAPSED), GetImage(IDB_STORAGE_COLLAPSED), TVI_ROOT, TVI_LAST); m_Tree.SetItemState(hModule, TVIS_BOLD, TVIS_BOLD); } for (j = 0; j < pModule->nCount; j++) { for (i = 0, b = FALSE; i < ModuleOld.nCount; i++) { if (ModuleOld.pElement[i] == pModule->pElement[j]) { b = TRUE; break; } } if (b == FALSE) { hItem = InsertElement(hModule, pModule->pElement[j]); if (m_DS.GetChildElement(pModule->pElement[j], m_bVolatile) != NULL) { FillTree(hItem, pModule->pElement[j]); } } } } void CDicomDlg::OnDatasetDeleteModule() { pDICOMIOD pIOD; HTREEITEM hItem; CString strText; L_UINT32 nClass; L_UINT16 nFlags; L_UINT32 nCount; L_UINT32 i; pDICOMMODULE pModule; hItem = m_Tree.GetSelectedItem(); if (hItem == NULL) { return; } pIOD = (pDICOMIOD)m_Tree.GetItemData(hItem); if (pIOD != NULL) { return; } m_DS.GetInfoDS(&nClass, &nFlags); strText = m_Tree.GetItemText(hItem); nCount = m_DS.GetCountModule(); for (i = 0; i < nCount; i++) { pModule = m_DS.FindIndexModule(i); if (pModule != NULL) { pIOD = LDicomIOD::FindModule(nClass, pModule->nModule); if ((pIOD != NULL) && (strText == pIOD->pszName)) { m_DS.DeleteModule(pModule->nModule); m_Tree.DeleteItem(hItem); break; } } } m_Tree.RedrawWindow(); VerifyTree(TVI_ROOT); } void CDicomDlg::OnViewLowlevel() { if (m_bHighLevel == FALSE) { return; } GetMenu()->CheckMenuItem(ID_VIEW_LOWLEVEL, MF_CHECKED); GetMenu()->CheckMenuItem(ID_VIEW_HIGHLEVEL, MF_UNCHECKED); GetMenu()->EnableMenuItem(ID_DATASET_INSERT_MODULE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_DATASET_DELETE_MODULE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION, MF_BYPOSITION|MF_GRAYED); GetMenu()->EnableMenuItem(ID_PROCESSING, MF_BYPOSITION|MF_GRAYED); DrawMenuBar(); m_bHighLevel = FALSE; m_bReset = TRUE; m_Tree.DeleteAllItems(); m_Tree.RedrawWindow(); m_bReset = FALSE; FillTree(TVI_ROOT, NULL); m_Tree.SelectItem(m_Tree.GetFirstVisibleItem()); } void CDicomDlg::OnViewHighlevel() { if (m_bHighLevel != FALSE) { return; } GetMenu()->CheckMenuItem(ID_VIEW_LOWLEVEL, MF_UNCHECKED); GetMenu()->CheckMenuItem(ID_VIEW_HIGHLEVEL, MF_CHECKED); GetMenu()->EnableMenuItem(ID_DATASET_INSERT_MODULE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_DATASET_DELETE_MODULE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_ANIMATION, MF_BYPOSITION|MF_GRAYED); GetMenu()->EnableMenuItem(ID_PROCESSING, MF_BYPOSITION|MF_GRAYED); DrawMenuBar(); m_bHighLevel = TRUE; m_bReset = TRUE; m_Tree.DeleteAllItems(); m_Tree.RedrawWindow(); m_bReset = FALSE; FillTree(TVI_ROOT, NULL); m_Tree.SelectItem(m_Tree.GetFirstVisibleItem()); } void CDicomDlg::OnViewTags() { if (m_bTag == FALSE) { GetMenu()->CheckMenuItem(ID_VIEW_TAGS, MF_CHECKED); m_bTag = TRUE; } else { GetMenu()->CheckMenuItem(ID_VIEW_TAGS, MF_UNCHECKED); m_bTag = FALSE; } GetMenu()->EnableMenuItem(ID_ANIMATION, MF_BYPOSITION|MF_GRAYED); GetMenu()->EnableMenuItem(ID_PROCESSING, MF_BYPOSITION|MF_GRAYED); DrawMenuBar(); m_bReset = TRUE; m_Tree.DeleteAllItems(); m_Tree.RedrawWindow(); m_bReset = FALSE; FillTree(TVI_ROOT, NULL); m_Tree.SelectItem(m_Tree.GetFirstVisibleItem()); } void CDicomDlg::OnViewVolatile() { if (m_bVolatile == FALSE) { GetMenu()->CheckMenuItem(ID_VIEW_VOLATILE, MF_CHECKED); m_bVolatile = TRUE; } else { GetMenu()->CheckMenuItem(ID_VIEW_VOLATILE, MF_UNCHECKED); m_bVolatile = FALSE; } GetMenu()->EnableMenuItem(ID_ANIMATION, MF_BYPOSITION|MF_GRAYED); GetMenu()->EnableMenuItem(ID_PROCESSING, MF_BYPOSITION|MF_GRAYED); DrawMenuBar(); m_bReset = TRUE; m_Tree.DeleteAllItems(); m_Tree.RedrawWindow(); m_bReset = FALSE; FillTree(TVI_ROOT, NULL); m_Tree.SelectItem(m_Tree.GetFirstVisibleItem()); } void CDicomDlg::OnViewNormal() { m_bZoom = FALSE; ShowBitmap(); GetMenu()->CheckMenuItem(ID_VIEW_NORMAL, MF_CHECKED); GetMenu()->CheckMenuItem(ID_VIEW_FITIMAGETOWINDOW, MF_UNCHECKED); DrawMenuBar(); } void CDicomDlg::OnViewFitimagetowindow() { m_bZoom = TRUE; ShowBitmap(); GetMenu()->CheckMenuItem(ID_VIEW_NORMAL, MF_UNCHECKED); GetMenu()->CheckMenuItem(ID_VIEW_FITIMAGETOWINDOW, MF_CHECKED); DrawMenuBar(); } void CDicomDlg::OnItemexpandedTree(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; UINT nBitmap; if ((pNMTreeView->itemNew.state & TVIS_EXPANDED) == TVIS_EXPANDED) { nBitmap = IDB_STORAGE_EXPANDED; } else { nBitmap = IDB_STORAGE_COLLAPSED; } m_Tree.SetItemImage(pNMTreeView->itemNew.hItem, GetImage(nBitmap), GetImage(nBitmap)); *pResult = 0; } void CDicomDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW *pNMTreeView = (NM_TREEVIEW*)pNMHDR; if (pNMTreeView->itemNew.hItem != pNMTreeView->itemOld.hItem) { if (m_bReset == FALSE) { KillPlay(); ShowValue(pNMTreeView->itemNew.hItem); } } *pResult = 0; } BOOL CDicomDlg::OpenDlg(CString strTitle, BOOL bLoad, CString &strName, CString &strPath, int *nIndex) { OPENDLGPARAMS FOParm ; OPENFILENAME OpenFileName; LDialogFile LeadDlg; int i, nRetCode; memset ( &FOParm, 0, sizeof(OPENDLGPARAMS)) ; memset ( &OpenFileName, 0, sizeof(OPENFILENAME)) ; OpenFileName.lStructSize = sizeof(OPENFILENAME); OpenFileName.Flags = OFN_EXPLORER; OpenFileName.lpstrFilter = "Dicom Files (*.dic)\0*.dic\0\0"; OpenFileName.nFilterIndex = 1; OpenFileName.lpstrTitle = (LPCTSTR)strTitle; OpenFileName.lpstrInitialDir = (LPCTSTR)strPath; FOParm.uStructSize = sizeof(OPENDLGPARAMS); FOParm.uDlgFlags = DLG_OPEN_ENABLESIZING | DLG_OPEN_SHOW_PROGRESSIVE | DLG_OPEN_SHOW_FILEINFO; FOParm.bPreviewEnabled = TRUE; LeadDlg.SetOpenParams(&FOParm) ; LeadDlg.SetOpenFileName(&OpenFileName) ; LeadDlg.EnablePreview(TRUE); if(bLoad) { nRetCode = LeadDlg.DoModalOpen(this->m_hWnd); } else { nRetCode = LeadDlg.DoModalSave(this->m_hWnd); } if(nRetCode!=SUCCESS_DLG_OK) return FALSE; LeadDlg.GetFileName (strName.GetBuffer (strName.GetLength()), L_MAXPATH); *nIndex = OpenFileName.nFilterIndex; strPath = OpenFileName.lpstrInitialDir; i = strPath.ReverseFind('\\'); if (i > 0) { strPath = strPath.Left(i-1); } return TRUE; } int CDicomDlg::GetImage(UINT nBitmap) { int nImage; for (nImage = 0; nImage < sizeof(BITMAPLIST) / sizeof(BITMAPLIST[0]); nImage++) { if (BITMAPLIST[nImage] == nBitmap) { break; } } return nImage; } void CDicomDlg::VerifyTree(HTREEITEM hItem) { HTREEITEM hNext; pDICOMELEMENT pElement; if (hItem == TVI_ROOT) { hItem = m_Tree.GetFirstVisibleItem(); } if (hItem != NULL) { while (m_Tree.GetPrevSiblingItem(hItem) != NULL) { hItem = m_Tree.GetPrevSiblingItem(hItem); } } while (hItem != NULL) { hNext = m_Tree.GetNextSiblingItem(hItem); pElement = (pDICOMELEMENT)m_Tree.GetItemData(hItem); if ((pElement != NULL) && (m_DS.ExistsElement(pElement) == FALSE)) { m_List.DeleteItem(hItem); } else { if (m_Tree.GetChildItem(hItem) != NULL) { VerifyTree(m_Tree.GetChildItem(hItem)); } } hItem = hNext; } } void CDicomDlg::FillTree(HTREEITEM hParentTree, pDICOMELEMENT pParentElement) { pDICOMELEMENT pElement; HTREEITEM hItem; CString strText; L_CHAR *pszText; L_UINT32 nClass; m_DS.GetInfoDS(&nClass, NULL); if ((m_bHighLevel == FALSE) || (nClass != CLASS_BASIC_DIRECTORY)) { FillTree1(hParentTree, pParentElement); return; } if (pParentElement == NULL) { pElement = m_DS.GetFirstKey(NULL, TRUE); } else { pElement = m_DS.GetChildKey(pParentElement); } while (pElement != NULL) { pszText = m_DS.GetValueKey(pElement); if (pszText != NULL) { strText = pszText; } else { strText = "UNKNOWN"; } hItem = m_Tree.InsertItem(strText, GetImage(IDB_STORAGE_COLLAPSED), GetImage(IDB_STORAGE_COLLAPSED), hParentTree, TVI_SORT); m_bHighLevel = FALSE; FillTree1(hItem, pElement); m_bHighLevel = TRUE; if ((pElement->nLength == ELEMENT_LENGTH_MAX) && (m_DS.GetChildKey(pElement) != NULL)) { if (m_DS.GetChildKey(pElement) != NULL) { FillTree(hItem, pElement); } } pElement = m_DS.GetNextKey(pElement, TRUE); } } void CDicomDlg::FillTree1(HTREEITEM hParentTree, pDICOMELEMENT pParentElement) { L_UINT32 i; L_UINT32 j; L_UINT32 nCount; L_UINT32 nClass; L_UINT16 nFlags; pDICOMMODULE pModule; pDICOMELEMENT pElement; pDICOMIOD pIOD; HTREEITEM hItem; CString strName; if (m_bHighLevel == FALSE) { if (pParentElement == NULL) { pElement = m_DS.GetFirstElement(NULL, TRUE, m_bVolatile); } else { pElement = m_DS.GetChildElement(pParentElement, m_bVolatile); } while (pElement != NULL) { hItem = InsertElement(hParentTree, pElement); if ((pElement->nLength == ELEMENT_LENGTH_MAX) && (m_DS.GetChildElement(pElement, m_bVolatile) != NULL)) { if (m_DS.GetChildElement(pElement, m_bVolatile) != NULL) { FillTree1(hItem, pElement); } } pElement = m_DS.GetNextElement(pElement, TRUE, m_bVolatile); } } else { if (pParentElement == NULL) { m_DS.GetInfoDS(&nClass, &nFlags); nCount = m_DS.GetCountModule(); for (i = 0; i < nCount; i++) { pModule = m_DS.FindIndexModule(i); if (pModule != NULL) { pIOD = LDicomIOD::FindModule(nClass, pModule->nModule); if (pIOD != NULL) { strName = pIOD->pszName; } else { strName = "Unknown"; } hParentTree = m_Tree.InsertItem(strName, GetImage(IDB_STORAGE_COLLAPSED), GetImage(IDB_STORAGE_COLLAPSED), TVI_ROOT, TVI_LAST); m_Tree.SetItemState(hParentTree, TVIS_BOLD, TVIS_BOLD); for (j = 0; j < pModule->nCount; j++) { hItem = InsertElement(hParentTree, pModule->pElement[j]); if (m_DS.GetChildElement(pModule->pElement[j], m_bVolatile) != NULL) { FillTree1(hItem, pModule->pElement[j]); } } } } } else { pElement = m_DS.GetChildElement(pParentElement, m_bVolatile); while (pElement != NULL) { hItem = InsertElement(hParentTree, pElement); if ((pElement->nLength == ELEMENT_LENGTH_MAX) && (m_DS.GetChildElement(pElement, m_bVolatile) != NULL)) { if (m_DS.GetChildElement(pElement, m_bVolatile) != NULL) { FillTree1(hItem, pElement); } } pElement = m_DS.GetNextElement(pElement, TRUE, m_bVolatile); } } } } HTREEITEM CDicomDlg::InsertElement(HTREEITEM hParentTree, pDICOMELEMENT pElement) { CString strName; pDICOMTAG pTag; HTREEITEM hItem; pTag = LDicomTag::Find(pElement->nTag); if (m_bTag == FALSE) { strName = (pTag != NULL) ? pTag->pszName : "Unknown"; } else { strName.Format("%04X:%04X - %s", GETGROUP(pElement->nTag), GETELEMENT(pElement->nTag), (pTag != NULL) ? pTag->pszName : "Unknown"); } if (pElement->nLength == ELEMENT_LENGTH_MAX) { hItem = m_Tree.InsertItem(strName, GetImage(IDB_STORAGE_COLLAPSED), GetImage(IDB_STORAGE_COLLAPSED), hParentTree, TVI_SORT); } else { hItem = m_Tree.InsertItem(strName, GetImage(IDB_STREAM), GetImage(IDB_STREAM), hParentTree, TVI_SORT); } if (hItem != NULL) { m_Tree.SetItemData(hItem, (DWORD)pElement); } return hItem; } void CDicomDlg::ShowValue(HTREEITEM hItem) { L_UINT32 i; L_UINT32 nCount=0; L_UINT32 nLength; L_UINT16 nResult; L_CHAR *pszValue; L_CHAR *p; L_CHAR *q; LBitmap Image; BITMAPHANDLE Bitmap; CRect rcRect; pDICOMELEMENT pElement; if (hItem != NULL) { pElement = (pDICOMELEMENT)m_Tree.GetItemData(hItem); if (pElement == NULL) { hItem = NULL; } } if ((hItem == NULL) || (m_DS.ExistsElement(pElement) == FALSE)) { m_List.DeleteAllItems(); m_List.RedrawWindow(); return; } if (m_DS.GetParentElement(pElement) != NULL) { if (m_DS.GetParentElement(pElement)->nTag == TAG_PIXEL_DATA) { m_List.DeleteAllItems(); m_List.RedrawWindow(); return; } } if (pElement->nTag == TAG_PIXEL_DATA) { nCount = m_DS.GetCountImage(pElement); if (nCount == 0) { return; } if (m_pList != NULL) { ShowBitmap(); } else { if (m_bVolatile == FALSE) { GetMenu()->EnableMenuItem(ID_ANIMATION, MF_BYPOSITION|MF_ENABLED); GetMenu()->EnableMenuItem(ID_PROCESSING, MF_BYPOSITION|MF_ENABLED); GetMenu()->EnableMenuItem(ID_ANIMATION_PLAY, (nCount > 1) ? MF_ENABLED : MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_STOP, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_FIRST, (nCount > 1) ? MF_ENABLED : MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_LAST, (nCount > 1) ? MF_ENABLED : MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_PREV, (nCount > 1) ? MF_ENABLED : MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_NEXT, (nCount > 1) ? MF_ENABLED : MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_INFO, MF_ENABLED); DrawMenuBar(); } m_List.GetClientRect(rcRect); m_pImage = new LBitmapWindow(); m_pImage->CreateWnd(m_List.m_hWnd, 901, WS_VISIBLE | L_BS_CENTER, rcRect.TopLeft().x, rcRect.TopLeft().y, rcRect.BottomRight().x, rcRect.BottomRight().y); m_pImage->SetPatternBackColor(0xFFFFFFFF); m_pList = new LBitmapList; m_pList->Create(); m_nImage = 0; for (i = 0; i < nCount; i++) { nResult = m_DS.GetImage(pElement, &Bitmap, sizeof(BITMAPHANDLE), i, 0, ORDER_RGB, DICOM_GETIMAGE_AUTO_APPLY_MODALITY_LUT | DICOM_GETIMAGE_AUTO_APPLY_VOI_LUT | DICOM_GETIMAGE_ALLOW_RANGE_EXPANSION, NULL, NULL); if (nResult == DICOM_SUCCESS) { Image.SetHandle(&Bitmap); m_pList->InsertItem(&Image, (L_UINT)-1); Image.SetHandle(NULL, FALSE); ShowBitmap(); m_nImage++; } } m_nImage = 0; ShowBitmap(); } return; } m_List.DeleteAllItems(); m_List.RedrawWindow(); GetMenu()->EnableMenuItem(ID_ANIMATION, MF_BYPOSITION|MF_GRAYED); GetMenu()->EnableMenuItem(ID_PROCESSING, MF_BYPOSITION|MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_PLAY, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_STOP, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_FIRST, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_LAST, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_PREV, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_NEXT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_INFO, MF_GRAYED); DrawMenuBar(); nCount = m_DS.GetCountValue(pElement); m_DS.FreeValue(pElement); if (nCount == 0) { return; } nLength = m_DS.GetConvertValue(pElement, NULL); pszValue = (L_CHAR *)malloc(nLength); if (pszValue == NULL) { return; } nLength = m_DS.GetConvertValue(pElement, pszValue); for (i = 0, p = pszValue; i < nCount; i++) { if (nCount > 1) { q = strchr(p, '\\'); if (q != NULL) { *q = 0; } } m_List.InsertItem(p); p += strlen(p) + 1; } free(pszValue); m_List.RedrawWindow(); m_List.SelectItem(m_List.GetFirstVisibleItem()); } void CDicomDlg::ShowBitmap() { if (m_pList != NULL) { LBitmap Bitmap; m_pList->GetItem(m_nImage, &Bitmap, sizeof (BITMAPHANDLE), TRUE); m_pImage->SetHandle(Bitmap.GetHandle(), FALSE); m_pImage->SetZoomMode((m_bZoom == 0) ? ZOOM_NORMAL : ZOOM_FIT); } } void CDicomDlg::OnTimer(UINT nIDEvent) { if (((nIDEvent == IDC_TIMER) && (GetTickCount() - m_nStart) > 30) && (m_pList != NULL)) { m_nStart = GetTickCount(); OnAnimationNext(); } if(nIDEvent == IDC_PLAYTIMER) { KillTimer(m_hPlayTimer); m_hPlayTimer = NULL; FindAndExpand(CString("Pixel Data")); } CDialog::OnTimer(nIDEvent); } void CDicomDlg::OnAnimationPlay() { if (m_hTimer != 0) { return; } if (m_pList == NULL) { return; } GetMenu()->EnableMenuItem(ID_ANIMATION_PLAY, MF_GRAYED); GetMenu()->EnableMenuItem(ID_ANIMATION_STOP, MF_ENABLED); DrawMenuBar(); m_nStart = 0; m_hTimer = SetTimer(IDC_TIMER, 1, NULL); } void CDicomDlg::OnAnimationStop() { if (m_hTimer == 0) { return; } KillTimer(m_hTimer); m_hTimer = 0; GetMenu()->EnableMenuItem(ID_ANIMATION_PLAY, MF_ENABLED); GetMenu()->EnableMenuItem(ID_ANIMATION_STOP, MF_GRAYED); DrawMenuBar(); } void CDicomDlg::KillPlay() { if (m_hTimer != 0) { KillTimer(m_hTimer); m_hTimer = 0; } if (m_pList != NULL) { m_pImage->SetHandle(NULL, FALSE); m_pImage->SetWndHandle(NULL); delete m_pImage; m_pImage = NULL; delete m_pList; m_pList = NULL; } GetMenu()->EnableMenuItem(ID_ANIMATION_PLAY, MF_ENABLED); GetMenu()->EnableMenuItem(ID_ANIMATION_STOP, MF_GRAYED); DrawMenuBar(); } void CDicomDlg::OnAnimationFirst() { if (m_pList == NULL) { return; } m_nImage = 0; ShowBitmap(); } void CDicomDlg::OnAnimationLast() { if (m_pList == NULL) { return; } m_nImage = m_pList->GetItemsCount() - 1; ShowBitmap(); } void CDicomDlg::OnAnimationNext() { L_UINT nCount; if (m_pList == NULL) { return; } nCount = m_pList->GetItemsCount(); m_nImage++; if (m_nImage >= nCount) { m_nImage = 0; } ShowBitmap(); } void CDicomDlg::OnAnimationPrev() { L_UINT nCount; if (m_pList == NULL) { return; } nCount = m_pList->GetItemsCount(); if (m_nImage == 0) { m_nImage = nCount-1; } else { m_nImage--; } ShowBitmap(); } void CDicomDlg::OnAnimationInfo() { HTREEITEM hItem; pDICOMELEMENT pElement; DICOMIMAGE Info; CDicomImageDlg dlg; hItem = m_Tree.GetSelectedItem(); if (hItem == NULL) { return; } pElement = (pDICOMELEMENT)m_Tree.GetItemData(hItem); if (pElement == NULL) { return; } m_DS.GetInfoImage(pElement, &Info, 0); dlg.m_pInfo = &Info; dlg.DoModal(); } void CDicomDlg::ImageProcessing(L_INT nType, L_INT nProcess) { L_INT nResult; L_INT32 nWidth; L_INT32 nHeight; pDICOMELEMENT pElement; HTREEITEM hItem; DICOMIMAGE Info; LBitmap Bitmap; LDialogColor DialogColor; LDialogImageEffect DialogImageEffect; LDialogImage DialogImage; L_INT nLowBit = 0 ; L_INT nHighBit = 0 ; L_INT nSize = 0 ; L_INT nLow = 0 ; L_INT nHigh = 0 ; if (m_pList == NULL) { return; } m_pList->GetItem(m_nImage, &Bitmap, sizeof (BITMAPHANDLE), TRUE); // get min/max bits Bitmap.GetMinMaxBits ( &nLowBit, &nHighBit ) ; // get min/max values Bitmap.GetMinMaxVal ( &nLow, &nHigh ) ; nWidth = Bitmap.GetWidth(); nHeight = Bitmap.GetHeight(); DialogColor.SetBitmap(&Bitmap); DialogColor.EnablePreview(TRUE); DialogColor.EnableAutoProcess(TRUE); DialogColor.EnableToolbar(TRUE); DialogImageEffect.SetBitmap(&Bitmap); DialogImageEffect.EnablePreview(TRUE); DialogImageEffect.EnableAutoProcess(TRUE); DialogImageEffect.EnableToolbar(TRUE); DialogImage.SetBitmap(&Bitmap); DialogImage.EnablePreview(TRUE); DialogImage.EnableAutoProcess(TRUE); DialogImage.EnableToolbar(TRUE); switch (nType) { case IMAGE_GET_CHANGE: switch (nProcess) { case DLG_IMG_BRIGHTNESS: nResult = DialogColor.DoModalBrightness(this->m_hWnd); break; case DLG_IMG_CONTRAST: nResult = DialogColor.DoModalContrast(this->m_hWnd); break; case DLG_IMG_HUE: nResult = DialogColor.DoModalHue(this->m_hWnd); break; case DLG_IMG_SATURATION: nResult = DialogColor.DoModalSaturation(this->m_hWnd); break; case DLG_IMG_HISTOCONTRAST: nResult = DialogColor.DoModalHistoContrast(this->m_hWnd); break; } break; case IMAGE_COLOR_RES: { COLORRESDLGPARAMS DlgParams; memset ( &DlgParams, 0, sizeof ( COLORRESDLGPARAMS ) ) ; DlgParams.uStructSize = sizeof ( COLORRESDLGPARAMS ) ; DlgParams.uDlgFlagsEx = DLG_COLORRES_SHOW_BITALL | DLG_COLORRES_SHOW_DITHER_ALL | DLG_COLORRES_SHOW_PAL_ALL ; DlgParams.uDlgFlags = DLG_COLORRES_SHOW_OPENPALFILE | DLG_COLORRES_SHOW_ORDER; Bitmap.DialogColor()->EnableCallBack(FALSE); Bitmap.DialogColor()->EnablePreview(TRUE); Bitmap.DialogColor()->EnableAutoProcess(TRUE); Bitmap.DialogColor()->EnableToolbar(FALSE); Bitmap.DialogColor()->SetColorResParams(&DlgParams) ; nResult =Bitmap.DialogColor()->DoModalColorRes(m_hWnd); } break; case IMAGE_GRAYSCALE: nResult = Bitmap.GrayScale(nProcess); break; case IMAGE_COLOR_INVERT: nResult = Bitmap.Invert(); break; case IMAGE_HISTOGRAM_EQUALIZE: nResult = Bitmap.HistoEqualize(YUV_SPACE); break; case IMAGE_STRETCH_INTENSITY: nResult = Bitmap.StretchIntensity(); break; case IMAGE_GAMMA_CORRECT: nResult = DialogColor.DoModalGammaAdjustment(this->m_hWnd); break; case IMAGE_INTENSITY_DETECT: nResult = DialogColor.DoModalIntensityDetect(this->m_hWnd); break; case IMAGE_WINDOW_LEVEL: { L_DOUBLE fWindowCenter =0.0; L_DOUBLE fWindowWidth =0.0; WINDOWLEVELDLGPARAMS DlgParams; memset ( &DlgParams, 0, sizeof ( WINDOWLEVELDLGPARAMS ) ) ; DlgParams.uStructSize = sizeof ( WINDOWLEVELDLGPARAMS ) ; Bitmap.GetHandle()->MinVal = nLow ; Bitmap.GetHandle()->MaxVal = nHigh ; nSize = ( L_UINT32 ) ( 1L<< ( nHighBit - nLowBit + 1 ) ) ; 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 ( DialogColor.GetBitmap()->IsGrayScale( ) ) { case GRAY_ORDEREDNORMAL: { DlgParams.crStart = RGB ( 0, 0, 0 ) ; DlgParams.crEnd = RGB ( 255, 255, 255 ) ; if(Bitmap.GetLinearVOILUT( &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(Bitmap.GetLinearVOILUT( &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 ( 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_SHOW_RANGE ; Bitmap.DialogColor()->EnableCallBack(FALSE); Bitmap.DialogColor()->EnablePreview(TRUE); Bitmap.DialogColor()->EnableAutoProcess(TRUE); Bitmap.DialogColor()->EnableToolbar(FALSE); Bitmap.DialogColor()->SetWindowLevelParams(&DlgParams) ; nResult = Bitmap.DialogColor()->DoModalWindowLevel(this->m_hWnd); Bitmap.DialogColor()->GetWindowLevelParams(&DlgParams, sizeof(DlgParams)) ; free(DlgParams.pLUT); } break; case IMAGE_DESPECKLE: nResult = Bitmap.Despeckle(); break; case IMAGE_ADD_NOISE: nResult = DialogImageEffect.DoModalAddNoise(this->m_hWnd); break; case IMAGE_EMBOSS: nResult = DialogImageEffect.DoModalEmboss(this->m_hWnd); break; case IMAGE_GET_FILTER: switch (nProcess) { case DLG_IMG_GRADIENT: nResult = DialogImageEffect.DoModalGradientFilter(this->m_hWnd); break; case DLG_IMG_EROSION: nResult = DialogImageEffect.DoModalErosionFilter(m_hWnd); break; } break; case IMAGE_GET_SIZE: { RESIZEDLGPARAMS DlgParams; memset ( &DlgParams, 0, sizeof ( RESIZEDLGPARAMS ) ) ; DlgParams.uStructSize = sizeof ( RESIZEDLGPARAMS ) ; DlgParams.uOriginalWidth = Bitmap.GetWidth(); DlgParams.uOriginalHeight = Bitmap.GetHeight(); DlgParams.uOriginalResolutionX = Bitmap.GetXResolution(); DlgParams.uOriginalResolutionY = Bitmap.GetYResolution(); DlgParams.uOriginalBitsPerPixel = Bitmap.GetBitsPerPixel(); DlgParams.uNewWidth = Bitmap.GetWidth(); DlgParams.uNewHeight = Bitmap.GetHeight(); DlgParams.uNewResolutionX = Bitmap.GetXResolution(); DlgParams.uNewResolutionY = Bitmap.GetYResolution(); DlgParams.uResize = SIZE_NORMAL ; DlgParams.uDlgFlags = DLG_RESIZE_SHOW_PERCENTAGE | DLG_RESIZE_SHOW_IDENTICALVALUE | DLG_RESIZE_SHOW_MAINTAINASPECT | DLG_RESIZE_SHOW_RESOLUTIONGRP; Bitmap.DialogImage()->EnableAutoProcess(TRUE); Bitmap.DialogImage()->EnableCallBack(FALSE); Bitmap.DialogImage()->SetResizeParams(&DlgParams) ; nResult = Bitmap.DialogImage()->DoModalResize(m_hWnd); } break; case IMAGE_FLIP: nResult = Bitmap.Flip(); break; case IMAGE_REVERSE: nResult = Bitmap.Reverse(); break; case IMAGE_GET_ANGLE: switch (nProcess) { case DLG_IMG_SHEAR: SHEARDLGPARAMS ShearDlgParams; memset ( &ShearDlgParams, 0, sizeof ( SHEARDLGPARAMS ) ) ; ShearDlgParams.uStructSize = sizeof ( SHEARDLGPARAMS ) ; ShearDlgParams.nAngle = 0 ; if (Bitmap.IsGrayScale() != FALSE) { L_INT nMinVal; L_INT nMaxVal; L_INT nGray; Bitmap.GetMinMaxVal(&nMinVal, &nMaxVal); if (nMinVal < nMaxVal) { nGray = ((nMaxVal - nMinVal - 1) * 255) / (nMaxVal - nMinVal); ShearDlgParams.crBack = RGB(nGray, nGray, nGray); } } else { ShearDlgParams.crBack = RGB(254,254,254); } ShearDlgParams.uDlgFlags = ( DLG_SHEAR_SHOW_BACKCOLOR ); DialogImage.SetShearParams(&ShearDlgParams) ; nResult = DialogImage.DoModalShear(this->m_hWnd); break; case DLG_IMG_ROTATE: ROTATEDLGPARAMS RotateDlgParams; memset ( &RotateDlgParams, 0, sizeof ( ROTATEDLGPARAMS ) ) ; RotateDlgParams.uStructSize = sizeof ( ROTATEDLGPARAMS ) ; RotateDlgParams.nAngle = 0 ; RotateDlgParams.bResize = TRUE ; if (Bitmap.IsGrayScale() != FALSE) { L_INT nMinVal; L_INT nMaxVal; L_INT nGray; Bitmap.GetMinMaxVal(&nMinVal, &nMaxVal); if (nMinVal < nMaxVal) { nGray = ((nMaxVal - nMinVal - 1) * 255) / (nMaxVal - nMinVal); RotateDlgParams.crBack = RGB(nGray, nGray, nGray); } } else { RotateDlgParams.crBack = RGB(254,254,254); } RotateDlgParams.uDlgFlags = ( DLG_ROTATE_SHOW_RESIZE | DLG_ROTATE_SHOW_BACKCOLOR ); DialogImage.SetRotateParams(&RotateDlgParams) ; nResult = DialogImage.DoModalRotate(this->m_hWnd); break; } break; case IMAGE_VIEW: nResult = SUCCESS; break; case IMAGE_GET_HALFTONE: HALFTONEDLGPARAMS HalftoneDlgParams; memset ( &HalftoneDlgParams, 0, sizeof ( HALFTONEDLGPARAMS ) ) ; HalftoneDlgParams.uStructSize = sizeof ( HALFTONEDLGPARAMS ); HalftoneDlgParams.pBitmapList = NULL; HalftoneDlgParams.hList = NULL; HalftoneDlgParams.nAngle = 0 ; HalftoneDlgParams.uType = HT_PRINT ; HalftoneDlgParams.uDlgFlags = DLG_HALFTONE_SHOW_TOOL_ZOOMLEVEL; DialogColor.SetHalfToneParams(&HalftoneDlgParams); nResult = DialogColor.DoModalHalfTone(this->m_hWnd); break; } if (nResult != SUCCESS && nResult != SUCCESS_DLG_OK) { return; } hItem = m_Tree.GetSelectedItem(); if (hItem == NULL) { return; } pElement = (pDICOMELEMENT)m_Tree.GetItemData(hItem); if (pElement == NULL) { return; } m_DS.GetInfoImage(pElement, &Info, m_nImage); if (Info.nFrames == 1) { m_DS.SetImage(pElement, Bitmap.GetHandle(), m_nSaveCompression, m_nSavePhotometric, m_nSaveBitsPerPixel, m_nSaveQFactor, DICOM_SETIMAGE_AUTO_SET_VOI_LUT, NULL, NULL); } else { if ((nWidth != Bitmap.GetWidth()) || (nHeight != Bitmap.GetHeight())) { Bitmap.Size(nWidth, nHeight, SIZE_NORMAL); } m_DS.DeleteImage(pElement, m_nImage, 1); m_DS.InsertImage(pElement, Bitmap.GetHandle(), m_nImage, Info.nCompression, Info.nPhotometric, 0, 0, DICOM_SETIMAGE_AUTO_SET_VOI_LUT, NULL, NULL); } m_pList->SetItem(m_nImage, &Bitmap); ShowBitmap(); } void CDicomDlg::OnProcessingFlip() { ImageProcessing(IMAGE_FLIP, 0); } void CDicomDlg::OnProcessingReverse() { ImageProcessing(IMAGE_REVERSE, 0); } void CDicomDlg::OnProcessingRotate() { ImageProcessing(IMAGE_GET_ANGLE, DLG_IMG_ROTATE); } void CDicomDlg::OnProcessingShear() { ImageProcessing(IMAGE_GET_ANGLE, DLG_IMG_SHEAR); } void CDicomDlg::OnProcessingResize() { ImageProcessing(IMAGE_GET_SIZE, 0); } void CDicomDlg::OnProcessingGradientfilter() { ImageProcessing(IMAGE_GET_FILTER, DLG_IMG_GRADIENT); } void CDicomDlg::OnProcessingErosionfilter() { ImageProcessing(IMAGE_GET_FILTER, DLG_IMG_EROSION); } void CDicomDlg::OnProcessingHalftone() { ImageProcessing(IMAGE_GET_HALFTONE, 0); } void CDicomDlg::OnProcessingGrayscale() { ImageProcessing(IMAGE_GRAYSCALE, 8); } void CDicomDlg::OnProcessingGrayscale12() { ImageProcessing(IMAGE_GRAYSCALE, 12); } void CDicomDlg::OnProcessingGrayscale16() { ImageProcessing(IMAGE_GRAYSCALE, 16); } void CDicomDlg::OnProcessingColorresolution() { ImageProcessing(IMAGE_COLOR_RES, 0); } void CDicomDlg::OnProcessingWindowlevel() { ImageProcessing(IMAGE_WINDOW_LEVEL, 0); } void CDicomDlg::OnProcessingInvert() { ImageProcessing(IMAGE_COLOR_INVERT, 0); } void CDicomDlg::OnProcessingBrightness() { ImageProcessing(IMAGE_GET_CHANGE, DLG_IMG_BRIGHTNESS); } void CDicomDlg::OnProcessingContrast() { ImageProcessing(IMAGE_GET_CHANGE, DLG_IMG_CONTRAST); } void CDicomDlg::OnProcessingHue() { ImageProcessing(IMAGE_GET_CHANGE, DLG_IMG_HUE); } void CDicomDlg::OnProcessingSaturation() { ImageProcessing(IMAGE_GET_CHANGE, DLG_IMG_SATURATION); } void CDicomDlg::OnProcessingHistogramequalize() { ImageProcessing(IMAGE_HISTOGRAM_EQUALIZE, 0); } void CDicomDlg::OnProcessingHistocontrast() { ImageProcessing(IMAGE_GET_CHANGE, DLG_IMG_HISTOCONTRAST); } void CDicomDlg::OnProcessingStretchintensity() { ImageProcessing(IMAGE_STRETCH_INTENSITY, 0); } void CDicomDlg::OnProcessingGammacorrect() { ImageProcessing(IMAGE_GAMMA_CORRECT, 0); } void CDicomDlg::OnProcessingIntensitydetect() { ImageProcessing(IMAGE_INTENSITY_DETECT, 0); } void CDicomDlg::OnProcessingDespeckle() { ImageProcessing(IMAGE_DESPECKLE, 0); } void CDicomDlg::OnProcessingAddnoise() { ImageProcessing(IMAGE_ADD_NOISE, 0); } void CDicomDlg::OnProcessingEmboss() { ImageProcessing(IMAGE_EMBOSS, 0); } void CDicomDlg::OnOptionsLoad() { CDicomLoadDlg dlg; dlg.m_nFlags = m_nLoadFlags; if (dlg.DoModal() != IDOK) { return; } m_nLoadFlags = dlg.m_nFlags; } void CDicomDlg::OnOptionsSave() { CDicomSaveDlg dlg; dlg.m_pDS = &m_DS; dlg.m_nFlags = m_nSaveFlags; dlg.m_nCompression = m_nSaveCompression; dlg.m_nPhotometric = m_nSavePhotometric; dlg.m_nBitsPerPixel = m_nSaveBitsPerPixel; dlg.m_nQFactor = m_nSaveQFactor; if (dlg.DoModal() != IDOK) { return; } m_nSaveFlags = dlg.m_nFlags; m_nSaveCompression = dlg.m_nCompression; m_nSavePhotometric = dlg.m_nPhotometric; m_nSaveBitsPerPixel = dlg.m_nBitsPerPixel; m_nSaveQFactor = dlg.m_nQFactor; } void CDicomDlg::OnHelpAbout() { CDicomAbout dlg; dlg.DoModal(); } void CDicomDlg::OnCancel() { if (m_bCancel != FALSE) { CDialog::OnCancel(); } } void CDicomDlg::OnOK() { //CDialog::OnOK(); } void CDicomDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) { OnDatasetModifyValue(); *pResult = 0; } void CDicomDlg::OnDblclkTree(NMHDR* pNMHDR, LRESULT* pResult) { OnDatasetModifyValue(); *pResult = 0; } void CDicomDlg::FindAndExpand(CString &TreeString) { // find pszTreeString in m_Tree and simulate that the item has been clicked HTREEITEM hItem = m_Tree.GetRootItem(); // enumerate all the tree items while(hItem) { CString str = m_Tree.GetItemText(hItem); if(str == TreeString) break; // go to next item if(m_Tree.ItemHasChildren(hItem)) hItem = m_Tree.GetChildItem(hItem); else hItem = m_Tree.GetNextItem(hItem, TVGN_NEXTVISIBLE); } if(hItem) { // if I select the item now, then I don't see the animation because the window // hasn't been created yet m_Tree.Select(hItem, TVGN_CARET); } }