📄 fmwndlocalizer.cpp
字号:
// FMWndLocalizer.cpp : implementation file//#include "stdafx.h"#include "fusion.h"#include "framemain.h"#include "FMWndVR.h"#include "dib.h"#include "FusionGlobal.h"#include "FusionDefine.h"#include "FusionEnum.h"#include "FMWndLocalizer.h"#include "Transform3DInfo.h"#include <math.h>// yeni#include "ipl.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif#define RGB_CROSS_HAIR RGB(0, 255, 0)#define COLOR_REF_NODULE RGB(255, 0, 0)#define COLOR_FLOAT_NODULE RGB(0, 0, 255)#define COLOR_MANUAL RGB(0, 255, 0)#define COLOR_CONTOUR_LINE RGB(255, 255, 255)#define COLOR_CONTOUR_POINT RGB(255, 255, 255)#define RADIUS 5CCriticalSection g_3DLocalizerAxialCS[3];CCriticalSection g_3DLocalizerCoronalCS[3];CCriticalSection g_3DLocalizerSagittalCS[3];int RxFMWndLocalizer::m_iZoomFactor = 100;int RxFMWndLocalizer::m_btnMode = BTN_NONE;int RxFMWndLocalizer::m_iInterleaving = 0;BOOL RxFMWndLocalizer::m_bAfterFusion = FALSE;extern void Zoom(BYTE *in_image, int in_width, int in_height, unsigned char *out_image, int out_width, int out_height, int color);/////////////////////////////////////////////////////////////////////////////// RxFMWndLocalizerRxFMWndLocalizer::RxFMWndLocalizer(UINT iRFCNum) : RxFMWnd(iRFCNum){ m_iRFCNum = iRFCNum; m_pnOriginalImage = NULL; m_ptImgPanOffset = CPoint(0, 0); m_pDib = NULL; m_pLocalizerManager = NULL; m_bUpdate = FALSE; m_iWindowingLevel = 90; m_iWindowingWidth = 190; m_bNoduleDisplay = FALSE; m_pMPRAgent = NULL; MakeColorTable(5, 30, 100, 230); m_nEdgeDilationFactor = 2;}RxFMWndLocalizer::~RxFMWndLocalizer(){ if(m_pDib) delete m_pDib; if(m_pnOriginalImage) delete [] m_pnOriginalImage;}BEGIN_MESSAGE_MAP(RxFMWndLocalizer, RxFMWnd) //{{AFX_MSG_MAP(RxFMWndLocalizer) ON_WM_CREATE() ON_WM_PAINT() ON_WM_SIZE() ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_WM_SETCURSOR() ON_WM_LBUTTONUP() ON_WM_RBUTTONDOWN() ON_WM_MOUSEWHEEL() ON_WM_RBUTTONUP() ON_COMMAND(IDTB_DISTANCE, OnNoduleDisplay) ON_UPDATE_COMMAND_UI(IDTB_DISTANCE, OnUpdateNoduleDisplay) ON_WM_KEYDOWN() //}}AFX_MSG_MAP ON_COMMAND(IDFM_NC_TAB_CHANGED, OnNcTabChanged) ON_COMMAND_RANGE(IDFM_LOCAL_BTN_PIXEL, IDFM_LOCAL_BTN_EDGE, OnLocalInterleaving) ON_COMMAND(IDFM_LOCAL_BTN_MIN, OnLocalMin) ON_COMMAND(IDFM_LOCAL_BTN_MAX, OnLocalMax) ON_COMMAND(IDFM_LOCAL_BTN_RESTORE, OnLocalRestore) ON_COMMAND(IDFM_NC_SLIDER_CHANGING, OnNcSliderChanging) ON_COMMAND(IDFM_NC_SLIDER_CHANGED, OnNcSliderChanged)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// RxFMWndLocalizer message handlersint RxFMWndLocalizer::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (RxFMWnd::OnCreate(lpCreateStruct) == -1) return -1; AddTab(_T("Axial")); AddTab(_T("Coronal")); AddTab(_T("Sagittal")); WORD wStyle = 0; switch (GetDlgCtrlID()) { case IDF_MAIN_WND_3DLOCALA_R: case IDF_MAIN_WND_3DLOCALA_F: SetCurTab(0, FALSE); break; case IDF_MAIN_WND_3DLOCALA_C: SetCurTab(0, FALSE); wStyle = RXCBS_VISIBLE; break; case IDF_MAIN_WND_3DLOCALC_R: case IDF_MAIN_WND_3DLOCALC_F: case IDF_MAIN_WND_3DLOCALC_C: SetCurTab(1, FALSE); break; case IDF_MAIN_WND_3DLOCALS_R: case IDF_MAIN_WND_3DLOCALS_F: case IDF_MAIN_WND_3DLOCALS_C: SetCurTab(2, FALSE); break; } AddButton(IDFM_LOCAL_BTN_FRAME, IDB_FMWND_BTN_FRAME, wStyle|RXCBS_CHECKBOX|RXCBS_CHECK); AddButton(IDFM_LOCAL_BTN_PIXEL, IDB_FMWND_BTN_PIXEL, wStyle|RXCBS_CHECKBOX|RXCBS_NORMAL); AddButton(IDFM_LOCAL_BTN_EDGE, IDB_FMWND_BTN_EDGE, wStyle|RXCBS_CHECKBOX|RXCBS_NORMAL); AddButton(IDFM_LOCAL_SPERATOR1, 0, wStyle|RXCBS_SEPARATOR); AddButton(IDFM_LOCAL_BTN_RESTORE, IDB_FMWND_BTN_RESTORE, RXCBS_NORMAL); AddButton(IDFM_LOCAL_BTN_MIN, IDB_FMWND_BTN_MIN, RXCBS_VISIBLE|RXCBS_NORMAL); AddButton(IDFM_LOCAL_BTN_MAX, IDB_FMWND_BTN_MAX, RXCBS_VISIBLE|RXCBS_NORMAL); return 0;}void RxFMWndLocalizer::OnSize(UINT nType, int cx, int cy) { // update size buttons at caption int nFrame3DFMatrix = RxGetFrameMain()->Frame3DF_GetMatrix(); if(nFrame3DFMatrix == FRAME_MATRIX_12) { SetTabVisible(TRUE, FALSE); SetBtnVisible(IDFM_LOCAL_BTN_RESTORE, FALSE, FALSE); SetBtnVisible(IDFM_LOCAL_BTN_MIN, TRUE, FALSE); SetBtnVisible(IDFM_LOCAL_BTN_MAX, FALSE, TRUE); m_bSliderVert = FALSE; } else if(nFrame3DFMatrix == FRAME_MATRIX_32) { SetTabVisible(FALSE, FALSE); if(cy < 50) { SetBtnVisible(IDFM_LOCAL_BTN_MIN, FALSE, FALSE); SetBtnVisible(IDFM_LOCAL_BTN_RESTORE, TRUE, FALSE); SetBtnVisible(IDFM_LOCAL_BTN_MAX, TRUE, TRUE); } else { SetBtnVisible(IDFM_LOCAL_BTN_MIN, TRUE, FALSE); SetBtnVisible(IDFM_LOCAL_BTN_RESTORE, FALSE, FALSE); SetBtnVisible(IDFM_LOCAL_BTN_MAX, TRUE, TRUE); } m_bSliderVert = TRUE; } m_iViewMode = GetDlgCtrlID(); switch (m_iViewMode) { case IDF_MAIN_WND_3DLOCALA_R: case IDF_MAIN_WND_3DLOCALA_F: RxGetFrameMain()->m_pLocalizerManager[REFERENCE_MODE]->m_szLocalizer[0] = CSize(cx, cy); break; case IDF_MAIN_WND_3DLOCALA_C: RxGetFrameMain()->m_pLocalizerManager[REFERENCE_MODE]->m_szLocalizerCombine[0] = CSize(cx, cy); break; case IDF_MAIN_WND_3DLOCALC_R: case IDF_MAIN_WND_3DLOCALC_F: RxGetFrameMain()->m_pLocalizerManager[REFERENCE_MODE]->m_szLocalizer[1] = CSize(cx, cy); break; case IDF_MAIN_WND_3DLOCALC_C: RxGetFrameMain()->m_pLocalizerManager[REFERENCE_MODE]->m_szLocalizerCombine[1] = CSize(cx, cy); break; case IDF_MAIN_WND_3DLOCALS_R: case IDF_MAIN_WND_3DLOCALS_F: RxGetFrameMain()->m_pLocalizerManager[REFERENCE_MODE]->m_szLocalizer[2] = CSize(cx, cy); break; case IDF_MAIN_WND_3DLOCALS_C: RxGetFrameMain()->m_pLocalizerManager[REFERENCE_MODE]->m_szLocalizerCombine[2] = CSize(cx, cy); break; } m_szWindow = CSize(cx, cy); m_iHIndex = cx >> 1; m_iVIndex = cy >> 1; m_ptImgCenter.x = cx >> 1; m_ptImgCenter.y = cy >> 1; RxFMWnd::OnSize(nType, cx, cy);}void RxFMWndLocalizer::OnActivateWnd(BOOL bActivate, CWnd *pCurWnd, CWnd *pOldWnd){ RxFMWnd::OnActivateWnd(bActivate, pCurWnd, pOldWnd); if(bActivate) { RxFrameBottom *pFrameBottom = RxGetFrameBottom(); if(m_iRFCNum != COMBINED_MODE) pFrameBottom->EnableWindowing(-1, TRUE); int nTBCurMode = RxGetFrameMain()->GetTBCurMode(); if(nTBCurMode == BTN_MEASURE_DISTANCE || nTBCurMode == BTN_MEASURE_AREA || nTBCurMode == BTN_MEASURE_VOLUME) RxGetFrameMain()->SetTBCurMode(BTN_ZOOM); }}void RxFMWndLocalizer::InitLocalizer(){ m_bAfterFusion = FALSE; m_iViewMode = GetDlgCtrlID(); switch(m_iRFCNum){ case REFERENCE_MODE: m_pLocalizerManager = RxGetFrameMain()->m_pLocalizerManager[REFERENCE_MODE]; break; case FLOAT_MODE: m_pLocalizerManager = RxGetFrameMain()->m_pLocalizerManager[FLOAT_MODE]; break; case COMBINED_MODE: m_pLocalizerManager = RxGetFrameMain()->m_pLocalizerManager[COMBINED_MODE]; g_arrRefNodule.AddNewNodule(127.0 + 2.0/3.0, 372.0 + 2.0/3.0, 286.0 + 1.0/3.0); g_arrFloatNodule.AddNewNodule(133.77777777778, 370.52991452991, 216.28571428571); } m_pMPRAgent = m_pLocalizerManager->GetMPRAgent(); switch (m_iViewMode) { case IDF_MAIN_WND_3DLOCALA_R: case IDF_MAIN_WND_3DLOCALA_F: case IDF_MAIN_WND_3DLOCALA_C: m_szRawImg = CSize(m_pMPRAgent->m_iVolX, m_pMPRAgent->m_iVolY); break; case IDF_MAIN_WND_3DLOCALC_R: case IDF_MAIN_WND_3DLOCALC_F: case IDF_MAIN_WND_3DLOCALC_C: m_szRawImg = CSize(m_pMPRAgent->m_iVolY, m_pMPRAgent->m_iVolZ); break; case IDF_MAIN_WND_3DLOCALS_R: case IDF_MAIN_WND_3DLOCALS_F: case IDF_MAIN_WND_3DLOCALS_C: m_szRawImg = CSize(m_pMPRAgent->m_iVolX, m_pMPRAgent->m_iVolZ); break; }}void RxFMWndLocalizer::ResampleBasicMPR(BOOL bRedraw){ if (m_pnOriginalImage) delete[] m_pnOriginalImage; CSingleLock lockDib(GetOwnCriticalSection()); lockDib.Lock(); switch (m_iViewMode) { case IDF_MAIN_WND_3DLOCALA_R: case IDF_MAIN_WND_3DLOCALA_F: case IDF_MAIN_WND_3DLOCALA_C: m_pnOriginalImage = m_pMPRAgent->GetAxialHighResImage(); break; case IDF_MAIN_WND_3DLOCALC_R: case IDF_MAIN_WND_3DLOCALC_F: case IDF_MAIN_WND_3DLOCALC_C: m_pnOriginalImage = m_pMPRAgent->GetCoronalHighResImage(); break; case IDF_MAIN_WND_3DLOCALS_R: case IDF_MAIN_WND_3DLOCALS_F: case IDF_MAIN_WND_3DLOCALS_C: m_pnOriginalImage = m_pMPRAgent->GetSagittalHighResImage(); break; } lockDib.Unlock(); if (bRedraw) Redraw();}void RxFMWndLocalizer::Redraw(BOOL bUpdate){ m_bUpdate = FALSE; if (m_szWindow.cx == 0 || m_szWindow.cy == 0) return; if (bUpdate && m_pnOriginalImage && (!m_bAfterFusion || (m_iRFCNum!=COMBINED_MODE))) { CSingleLock lockDib(GetOwnCriticalSection()); lockDib.Lock(); if (m_pDib) delete m_pDib; unsigned char *pWindowingTable; if (m_iRFCNum == COMBINED_MODE) pWindowingTable = RxGetFrameTuning()->GetWindowingTable(0); else pWindowingTable = RxGetFrameTuning()->GetWindowingTable(m_iRFCNum); //m_pDib = m_pLocalizerManager->GetColorImage(m_pnOriginalImage, m_szRawImg); m_pDib = (RxDib*)RxRawImgToDIB(m_pnOriginalImage, m_szRawImg, m_szDIB, m_iZoomFactor, pWindowingTable, TRUE);// TRACE(_T("\nWindowinglevel : %d, Windowingwidth : %d"), m_iWindowingLevel, m_iWindowingWidth); lockDib.Unlock(); m_bUpdate = TRUE; } else if (m_bAfterFusion){ switch (m_iViewMode) { case IDF_MAIN_WND_3DLOCALA_C: m_pLocalizerManager->ResampleAfterFusion(RxLocalizerManager::RX_AXIAL); break; case IDF_MAIN_WND_3DLOCALC_C: m_pLocalizerManager->ResampleAfterFusion(RxLocalizerManager::RX_CORONAL); break; case IDF_MAIN_WND_3DLOCALS_C: m_pLocalizerManager->ResampleAfterFusion(RxLocalizerManager::RX_SAGITTAL); break; } m_bUpdate = TRUE; } Invalidate(); UpdateWindow();}void RxFMWndLocalizer::OnNcTabChanged(){ RxGetFrameMain()->Frame3DF_Local_Exchange(GetMsgTab());}void RxFMWndLocalizer::OnLocalInterleaving(UINT nID){ switch(nID) { case IDFM_LOCAL_BTN_FRAME : if (m_iInterleaving == 0) return; break; case IDFM_LOCAL_BTN_PIXEL : if (m_iInterleaving == 1) return; break; case IDFM_LOCAL_BTN_EDGE : if (m_iInterleaving == 2) return; break; } if(m_iInterleaving == 0) SetBtnCheck(IDFM_LOCAL_BTN_FRAME, FALSE, TRUE); else if(m_iInterleaving == 1) SetBtnCheck(IDFM_LOCAL_BTN_PIXEL, FALSE, TRUE); else if(m_iInterleaving == 2) SetBtnCheck(IDFM_LOCAL_BTN_EDGE, FALSE, TRUE); switch(nID){ case IDFM_LOCAL_BTN_FRAME : SetBtnCheck(IDFM_LOCAL_BTN_FRAME, TRUE, TRUE); m_iInterleaving = 0; break; case IDFM_LOCAL_BTN_PIXEL : SetBtnCheck(IDFM_LOCAL_BTN_PIXEL, TRUE, TRUE); m_iInterleaving = 1; break; case IDFM_LOCAL_BTN_EDGE : SetBtnCheck(IDFM_LOCAL_BTN_EDGE, TRUE, TRUE); m_iInterleaving = 2; break; } m_pLocalizerManager->RedrawAll();}void RxFMWndLocalizer::OnLocalMin(){ RxFrameMain *pFrameMain = RxGetFrameMain(); int nFrame3DFMatrix = pFrameMain->Frame3DF_GetMatrix(); if(nFrame3DFMatrix == FRAME_MATRIX_12) pFrameMain->Frame3DF_Local_Nor(); else if(nFrame3DFMatrix == FRAME_MATRIX_32) { int nIndex, nID = GetDlgCtrlID(); if(nID == IDF_MAIN_WND_3DLOCALA_R || nID == IDF_MAIN_WND_3DLOCALA_F || nID == IDF_MAIN_WND_3DLOCALA_C){ nIndex = 0; } else if(nID == IDF_MAIN_WND_3DLOCALC_R || nID == IDF_MAIN_WND_3DLOCALC_F || nID == IDF_MAIN_WND_3DLOCALC_C){ nIndex = 1; } else if(nID == IDF_MAIN_WND_3DLOCALS_R || nID == IDF_MAIN_WND_3DLOCALS_F || nID == IDF_MAIN_WND_3DLOCALS_C){ nIndex = 2; } pFrameMain->Frame3DF_Local_Min(nIndex); } m_pLocalizerManager->Reset();}void RxFMWndLocalizer::OnLocalMax(){ int nIndex, nID = GetDlgCtrlID(); if(nID == IDF_MAIN_WND_3DLOCALA_R || nID == IDF_MAIN_WND_3DLOCALA_F || nID == IDF_MAIN_WND_3DLOCALA_C){ nIndex = 0; RxGetFrameMain()->Frame3DF_Local_Max(nIndex);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -