// Page5.cpp : implementation file // #include "stdafx.h" #include "dicommwl.h" #include "Page5.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPage5 property page IMPLEMENT_DYNCREATE(CPage5, CPropertyPage) CPage5::CPage5() : CPropertyPage(CPage5::IDD, IDS_PAGE5) { //{{AFX_DATA_INIT(CPage5) m_strValue = _T(""); m_strSelectedWorklist = _T(""); m_strModality = _T(""); m_strStaticInstructions = _T(""); //}}AFX_DATA_INIT m_pOldWndTree = NULL; m_pSheet = NULL; NO_PAGE_HELP(); } CPage5::~CPage5() { } void CPage5::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPage5) DDX_Text(pDX, IDC_EDIT_VALUE, m_strValue); DDX_Text(pDX, IDC_EDIT_SELECTED_WORKLIST, m_strSelectedWorklist); DDX_Text(pDX, IDC_EDIT_MODALITY, m_strModality); DDX_Text(pDX, IDC_STATIC_INSTRUCTIONS, m_strStaticInstructions); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPage5, CPropertyPage) //{{AFX_MSG_MAP(CPage5) ON_BN_CLICKED(IDC_BUTTON_SELECT_IMAGE, OnButtonSelectImage) //}}AFX_MSG_MAP ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_RESULT, OnSelchanged) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPage5 message handlers //CTreeCtrl BOOL CPage5::OnSetActive() { m_strStaticInstructions.LoadString(IDS_PAGE5_INSTR); UpdateData(FALSE); m_pSheet = (CMyPropertySheet *)GetParent(); m_pSheet->SetWizardButtons(CGlobals::m_Bitmap.Flags.Allocated ? PSWIZB_BACK | PSWIZB_NEXT : PSWIZB_BACK); // IDC_TREE_PLACEHOLDER is just a dummy rect that indicates where the tree should be placed. RECT rcWin, rcTree; GetDlgItem(IDC_TREE_PLACEHOLDER)->GetWindowRect(&rcTree); GetWindowRect(&rcWin); GetDlgItem(IDC_TREE_PLACEHOLDER)->ShowWindow(SW_HIDE); // change parent and reposition and size m_pOldWndTree = CGlobals::m_TreeResult.SetParent(this); CGlobals::m_TreeResult.SetWindowPos( NULL, rcTree.left-rcWin.left, rcTree.top-rcWin.top, rcTree.right-rcTree.left, rcTree.bottom-rcTree.top, SWP_NOZORDER); CGlobals::m_TreeResult.ShowWindow(SW_SHOWNORMAL); HTREEITEM hItem = CGlobals::m_TreeResult.GetSelectedItem(); if (hItem) { UpdateEditBox(hItem); UpdateSelected(hItem); } return CPropertyPage::OnSetActive(); } LRESULT CPage5::OnWizardNext() { // TODO: Add your specialized code here and/or call the base class CString strMsg = ""; int nRet = CreateDataset(); switch (nRet) { case CREATEDS_SUCCESS: break; case CREATEDS_GENERAL: strMsg = "Could not create dataset"; MessageBox(strMsg, "Error", MB_OK | MB_ICONERROR); break; case CREATEDS_NO_ITEM_SELECTED: strMsg = "Please select a modality worklist item"; MessageBox(strMsg, "Warning", MB_OK | MB_ICONEXCLAMATION); break; case CREATEDS_MODALITY_NOT_FOUND: strMsg.Format("Modality not supported %s--creating dataset using modality SC", m_strModality); MessageBox(strMsg, "Warning", MB_OK | MB_ICONEXCLAMATION); break; } if ((nRet == CREATEDS_GENERAL) || (nRet == CREATEDS_NO_ITEM_SELECTED)) return -1; return CPropertyPage::OnWizardNext(); } BOOL CPage5::OnKillActive() { CGlobals::m_TreeResult.SetParent(m_pOldWndTree); CGlobals::m_TreeResult.ShowWindow(SW_HIDE); return CPropertyPage::OnKillActive(); } void CPage5::UpdateEditBox(HTREEITEM hItem) { CMyTreeData *pMyTreeData = (CMyTreeData *)CGlobals::m_TreeResult.GetItemData(hItem); if (pMyTreeData) m_strValue = pMyTreeData->m_strValue; else m_strValue = ""; UpdateData(FALSE); } void CPage5::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here if (pNMTreeView->itemNew.hItem != pNMTreeView->itemOld.hItem) { UpdateEditBox(pNMTreeView->itemNew.hItem); UpdateSelected(pNMTreeView->itemNew.hItem); } *pResult = 0; } int CPage5::OnButtonSelectImage() { L_INT nRet; static L_CHAR szFile[MAX_PATH] = "\0"; static L_CHAR szInitialDir[MAX_PATH] = "\0"; LDialogFile LeadDlg; OPENDLGPARAMS FOParm; OPENFILENAME OpenFileName; HWND hWndOwner = GetSafeHwnd(); 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_PROGRESSIVE | DLG_OPEN_SHOW_MULTIPAGE | DLG_OPEN_SHOW_LOADROTATED | DLG_OPEN_SHOW_LOADCOMPRESSED | DLG_OPEN_SHOW_FILEINFO ;//| // DLG_OPEN_SHOW_DELPAGE | // DLG_OPEN_SHOW_LOADOPTIONS | // DLG_OPEN_VIEWTOTALPAGES | // DLG_OPEN_GENERATETHUMBNAIL ; FOParm.bPreviewEnabled = TRUE; LeadDlg.SetOpenParams(&FOParm) ; LeadDlg.SetOpenFileName(&OpenFileName) ; LeadDlg.EnablePreview(TRUE); if(LeadDlg.DoModalOpen(hWndOwner) == SUCCESS_DLG_OK) { LeadDlg.GetFileName(szFile, sizeof(szFile)); nRet = LeadDlg.GetOpenParams(&FOParm, sizeof(FOParm)); if (nRet == SUCCESS) { LOADFILEOPTION LoadFileOption; L_GETDEFAULTLOADFILEOPTION(&LoadFileOption, sizeof(LOADFILEOPTION)); LoadFileOption.PageNumber = FOParm.pFileData[0].nPageNumber; L_LOADBITMAP( FOParm.pFileData[0].szFileName, &CGlobals::m_Bitmap, sizeof(BITMAPHANDLE), 0, ORDER_BGRORGRAY, &LoadFileOption, NULL); LEADBITMAPLOAD LoadStruct; /* Structure for the name of the DLL */ memset (&LoadStruct, 0, sizeof (LoadStruct)); LoadStruct.uStructSize = sizeof (LoadStruct); lstrcpy (LoadStruct.Name, FOParm.pFileData[0].szFileName); /* Get the name of the image file */ LoadStruct.pOptions = &LoadFileOption; ::SendMessage ( GetDlgItem(IDC_CUSTOM_IMAGE)->GetSafeHwnd(), L_BM_LOAD, /* Send the message to load the image */ TRUE, (LONG) (LPSTR) & LoadStruct); m_pSheet->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT); } } return(nRet); } void CPage5::UpdateSelected(HTREEITEM hItem) { HTREEITEM hParent = CGlobals::m_TreeResult.GetRootOfItem(hItem); if (hParent) { m_strSelectedWorklist = CGlobals::m_TreeResult.GetItemText(hParent); m_strModality = GetModality(hItem); UpdateData(FALSE); } } CString CPage5::GetModality(HTREEITEM hItem) { CString strModality = ""; HTREEITEM hParent = CGlobals::m_TreeResult.GetRootOfItem(hItem); if (hParent) { m_strSelectedWorklist = CGlobals::m_TreeResult.GetItemText(hParent); CMyTreeData *pMyTreeData = (CMyTreeData *)CGlobals::m_TreeResult.GetItemData(hParent); if (pMyTreeData) { LMyDicomDS *pDS = pMyTreeData->m_pDS; if (pDS) { strModality = pDS->GetModality(); } } } return strModality; } int CPage5::CreateDataset() { int nRet = CREATEDS_SUCCESS; HTREEITEM hItemSelected = NULL; HTREEITEM hItemRoot = NULL; hItemSelected = CGlobals::m_TreeResult.GetSelectedItem(); if (hItemSelected == NULL) return CREATEDS_NO_ITEM_SELECTED; hItemRoot = CGlobals::m_TreeResult.GetRootOfItem(hItemSelected); if (hItemRoot == NULL) return CREATEDS_GENERAL; CString strModality = GetModality(hItemRoot); L_UINT32 uClass = -1; for (int i=0; iInitDS(uClass, DS_LITTLE_ENDIAN | DS_IMPLICIT_VR); pDS->MapMWLtoDS(pDSModalityWorklist); pDS->SetTagSpecificCharacterSet(); pDS->SetTagInstanceNumber(1); // Set Pixel Data pDICOMELEMENT pElementPixelData = pDS->FindFirstElement(NULL, TAG_PIXEL_DATA, FALSE); if (pElementPixelData) { pDS->DeleteElement(pElementPixelData); pElementPixelData = pDS->InsertElement(NULL, FALSE, TAG_PIXEL_DATA, VR_OB, FALSE, 0); } L_INT32 nPhotometric; if (CGlobals::m_Bitmap.Flags.Allocated) { if (CGlobals::m_Bitmap.Order == ORDER_GRAY) nPhotometric = IMAGE_PHOTOMETRIC_MONOCHROME2; else if (CGlobals::m_Bitmap.BitsPerPixel <= 8) nPhotometric = IMAGE_PHOTOMETRIC_PALETTE_COLOR; else nPhotometric = IMAGE_PHOTOMETRIC_RGB; pDS->InsertImage(pElementPixelData, &CGlobals::m_Bitmap, 0, IMAGE_COMPRESSION_NONE, nPhotometric, 0,0,DICOM_SETIMAGE_AUTO_SET_VOI_LUT,NULL, NULL); } pDS->DeleteEmptyElementsType3(uClass); pDS->DeleteEmptyModulesOptional(uClass); if (nPhotometric != IMAGE_PHOTOMETRIC_PALETTE_COLOR) if (pDS->IsEmptyModule(MODULE_PALETTE_COLOR_LOOCKUP_TABLE)) pDS->DeleteModule(MODULE_PALETTE_COLOR_LOOCKUP_TABLE); // Generate new series instance UID and SOP Instance UID pDS->InsertUID(TAG_SERIES_INSTANCE_UID); pDS->InsertUID(TAG_SOP_INSTANCE_UID); // If the MWL already had a study instance UID, we use that // If not, generate a new UID pDS->GenerateStudyInstanceUID(); CGlobals::m_uClass = uClass; if (CGlobals::m_pDS) { delete CGlobals::m_pDS; CGlobals::m_pDS = NULL; } CGlobals::m_pDS = pDS; return nRet; }