www.pudn.com > 医学图像处理示例源代码.rar > MainFrm.cpp


// MainFrm.cpp : implementation of the CMainFrame class 
// 
 
#include "stdafx.h" 
#include "ImageLAB.h" 
 
#include "MainFrm.h" 
#include "AllImage.h" 
#include "ImageLABDoc.h" 
#include "ImageLABView.h" 
 
#include "ChildFrm.h" 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame 
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)	 
	ON_COMMAND_EX(CG_ID_VIEW_MYDIALOGBAR, OnBarCheck) 
	ON_UPDATE_COMMAND_UI(CG_ID_VIEW_MYDIALOGBAR, OnUpdateControlBarMenu) 
	ON_COMMAND_EX(IDW_MYTOOLBAR1, OnBarCheck) 
	ON_UPDATE_COMMAND_UI(IDW_MYTOOLBAR1, OnUpdateControlBarMenu) 
 
	ON_WM_INITMENUPOPUP()                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
	ON_WM_MENUSELECT() 
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_DATE, OnUpdateDate) 
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_TIME, OnUpdateTime) 
	//{{AFX_MSG_MAP(CMainFrame) 
	ON_WM_CREATE() 
	ON_COMMAND(ID_VIEW_STATUS_CHANGEFONT, OnViewStatusChangefont) 
	ON_COMMAND(ID_WINDOW_CLOSEALL, OnWindowCloseall) 
	ON_UPDATE_COMMAND_UI(ID_WINDOW_CLOSEALL, OnUpdateWindowCloseall) 
	ON_WM_SIZE() 
	ON_COMMAND(ID_BUTTONRESET, OnBCReset) 
	ON_UPDATE_COMMAND_UI(ID_BUTTONRESET, OnUpdateBCReset) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
/*int      CMainFrame::iSHospitalLength = 3; 
CString  CMainFrame::lpHospital[] = {"湘雅医院", 
										 "附二医院", 
										 "附三医院" };*/ 
 
static UINT indicators[] = 
{ 
	ID_SEPARATOR,           // status line indicator 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL, 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame construction/destruction 
 
CMainFrame::CMainFrame() 
{ 
	// CG: The following block was inserted by 'Status Bar' component. 
	{ 
		m_nStatusPane1Width = -1; 
		m_bMenuSelect = FALSE; 
	} 
} 
 
CMainFrame::~CMainFrame() 
{ 
} 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	CTime  tmpTime = CTime::GetCurrentTime(); 
	int year  = tmpTime.GetYear(); 
	int month = tmpTime.GetMonth(); 
	int day   = tmpTime.GetDay(); 
 
	if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	if (!m_wndToolBar.Create(this) || 
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) 
	{ 
		TRACE0("Failed to create toolbar\n"); 
		return -1;      // fail to create 
	} 
 
	if (!m_wndStatusBar.Create(this) || 
		!m_wndStatusBar.SetIndicators(indicators, 
		  sizeof(indicators)/sizeof(UINT))) 
	{ 
		TRACE0("Failed to create status bar\n"); 
		return -1;      // fail to create 
	} 
 
	// TODO: Remove this if you don't want tool tips or a resizeable toolbar 
	//m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | 
	//	CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 
	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | 
		CBRS_GRIPPER | CBRS_BORDER_3D | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 
 
	// TODO: Delete these three lines if you don't want the toolbar to 
	//  be dockable 
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
	EnableDocking(CBRS_ALIGN_ANY); 
	DockControlBar(&m_wndToolBar); 
	m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT); 
 
 
	// TODO: Delete these three lines if you don't want the toolbar to be dockable 
 
	// CG: The following block was inserted by 'Status Bar' component. 
	{ 
		// Find out the size of the static variable 'indicators' defined 
		// by AppWizard and copy it 
		int nOrigSize = sizeof(indicators) / sizeof(UINT); 
 
		UINT* pIndicators = new UINT[nOrigSize + 2]; 
		memcpy(pIndicators, indicators, sizeof(indicators)); 
 
		// Call the Status Bar Component's status bar creation function 
		if (!InitStatusBar(pIndicators, nOrigSize, 60)) 
		{ 
			TRACE0("Failed to initialize Status Bar\n"); 
			return -1; 
		} 
		delete[] pIndicators; 
	} 
 
	// TODO: Add a menu item that will toggle the visibility of the
	// dialog bar named "My Dialog Bar":
	//   1. In ResourceView, open the menu resource that is used by
	//      the CMainFrame class
	//   2. Select the View submenu
	//   3. Double-click on the blank item at the bottom of the submenu
	//   4. Assign the new item an ID: CG_ID_VIEW_MYDIALOGBAR
	//   5. Assign the item a Caption: My Dialog Bar

	// TODO: Change the value of CG_ID_VIEW_MYDIALOGBAR to an appropriate value:
	//   1. Open the file resource.h
	// CG: The following block was inserted by the 'Dialog Bar' component
	{ 
		// Initialize dialog bar m_wndMyDialogBar 
		if (!m_wndMyDialogBar.Create(this, CG_IDD_RIGHTBAR, 
			CBRS_RIGHT | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE, 
			CG_ID_VIEW_MYDIALOGBAR)) 
		{ 
			TRACE0("Failed to create dialog bar m_wndMyDialogBar\n"); 
			return -1;		// fail to create 
		} 
 
		//m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_RIGHT | CBRS_ALIGN_LEFT); 
		m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_ANY); 
		EnableDocking(CBRS_ALIGN_ANY); 
		DockControlBar(&m_wndMyDialogBar); 
	} 
/*	if( !(year == 2000 && (month == 4 || month == 5))) 
	{ 
		AfxMessageBox("对不起,使用期限已过!"); 
		return -1; 
	} 
//*/ 
	 
	CPoint FloatPt; 
	CSize DialogBarSize = m_wndMyDialogBar.CalcFixedLayout( false, false); 
	CSize ToolBarSize = m_wndToolBar.CalcFixedLayout( false, false); 
	FloatPt.x = ::GetSystemMetrics(SM_CXSCREEN) - DialogBarSize.cx - 8; 
	FloatPt.y = ::GetSystemMetrics(SM_CYMENU) + ::GetSystemMetrics(SM_CYCAPTION)+ 
		        ToolBarSize.cx;
	FloatControlBar(&m_wndMyDialogBar,  FloatPt);  
 
	// 改变状态行的字体的部分 
    memset(&m_lf,0,sizeof(LOGFONT)); 
	m_lf.lfHeight=18; 
	m_lf.lfWeight=18; 
	strcpy(m_lf.lfFaceName,"宋体"); 
	VERIFY(m_font.CreateFontIndirect(&m_lf)); 
	m_wndStatusBar.SetFont(&m_font); 
 
    UINT nID,nStyle; 
	int cxWidth; 
    m_wndStatusBar.GetPaneInfo(0, nID, nStyle, cxWidth); 
    m_wndStatusBar.SetPaneInfo(0, nID, SBPS_STRETCH | SBPS_NORMAL, cxWidth); 
 
	CRect rect(0, 0, 100, 100); 
	CImageLABApp *lpApp = (CImageLABApp *)AfxGetApp(); 
	lpApp->m_scan.Create("scan",  "scan", WS_VISIBLE|WS_CHILD, rect, this, ID_SCAN); 
	return 0; 
} 
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CMDIFrameWnd::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame diagnostics 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CMDIFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CMDIFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame message handlers 
 
void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) 
{ 
  	CMDIFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu); 
   
	// CG: The following block was inserted by 'Status Bar' component. 
	{ 
		// Restore first pane of the statusbar? 
		if (nFlags == 0xFFFF && hSysMenu == 0 && m_nStatusPane1Width != -1) 
		{ 
			m_bMenuSelect = FALSE; 
			m_wndStatusBar.SetPaneInfo(0,  
				m_nStatusPane1ID, m_nStatusPane1Style, m_nStatusPane1Width); 
			m_nStatusPane1Width = -1;   // Set it to illegal value 
		} 
		else  
		{ 
			m_bMenuSelect = TRUE; 
		} 
	} 
} 
 
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
{ 
  	CMDIFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); 
   
	// CG: The following block was inserted by 'Status Bar' component. 
	{ 
		// store width of first pane and its style 
		if (m_nStatusPane1Width == -1 && m_bMenuSelect) 
		{ 
			m_wndStatusBar.GetPaneInfo(0, m_nStatusPane1ID,  
				m_nStatusPane1Style, m_nStatusPane1Width); 
			m_wndStatusBar.SetPaneInfo(0, m_nStatusPane1ID,  
				SBPS_NOBORDERS|SBPS_STRETCH, 16384); 
		} 
	} 
 
} 
 
void CMainFrame::OnUpdateDate(CCmdUI* pCmdUI) 
{ 
	// CG: This function was inserted by 'Status Bar' component. 
	if(!m_wndStatusBar.IsWindowVisible())  
		return; 
	// Get current date and format it 
	CTime time = CTime::GetCurrentTime(); 
	//CString strDate = time.Format(_T("%x")); 
	CString strDate = time.Format(_T("%d/%m/%Y"));  
 
	// BLOCK: compute the width of the date string 
	CSize size; 
	{ 
		HGDIOBJ hOldFont = NULL; 
		HFONT hFont = (HFONT)m_wndStatusBar.SendMessage(WM_GETFONT); 
		CClientDC dc(NULL); 
		if (hFont != NULL)  
			hOldFont = dc.SelectObject(hFont); 
		size = dc.GetTextExtent(strDate); 
		if (hOldFont != NULL)  
			dc.SelectObject(hOldFont); 
	} 
 
	// Update the pane to reflect the current date 
	UINT nID, nStyle; 
	int nWidth; 
	m_wndStatusBar.GetPaneInfo(m_nDatePaneNo, nID, nStyle, nWidth); 
	m_wndStatusBar.SetPaneInfo(m_nDatePaneNo, nID, nStyle, size.cx); 
	pCmdUI->SetText(strDate); 
	pCmdUI->Enable(TRUE); 
 
} 
 
void CMainFrame::OnUpdateTime(CCmdUI* pCmdUI) 
{ 
	// CG: This function was inserted by 'Status Bar' component. 
	if(!m_wndStatusBar.IsWindowVisible())  
		return; 
	 
	// Get current date and format it 
	CTime time = CTime::GetCurrentTime(); 
	CString strTime = time.Format(_T("%X")); 
 
	// BLOCK: compute the width of the date string 
	CSize size; 
	{ 
		HGDIOBJ hOldFont = NULL; 
		HFONT hFont = (HFONT)m_wndStatusBar.SendMessage(WM_GETFONT); 
		CClientDC dc(NULL); 
		if (hFont != NULL)  
			hOldFont = dc.SelectObject(hFont); 
		size = dc.GetTextExtent(strTime); 
		if (hOldFont != NULL)  
			dc.SelectObject(hOldFont); 
	} 
 
	// Update the pane to reflect the current time 
	UINT nID, nStyle; 
	int nWidth; 
	m_wndStatusBar.GetPaneInfo(m_nTimePaneNo, nID, nStyle, nWidth); 
	m_wndStatusBar.SetPaneInfo(m_nTimePaneNo, nID, nStyle, size.cx); 
	pCmdUI->SetText(strTime); 
	pCmdUI->Enable(TRUE); 
} 
 
BOOL CMainFrame::InitStatusBar(UINT *pIndicators, int nSize, int nSeconds) 
{ 
	// CG: This function was inserted by 'Status Bar' component. 
 
	// Create an index for the DATE pane 
	m_nDatePaneNo = nSize++; 
	pIndicators[m_nDatePaneNo] = ID_INDICATOR_DATE; 
	// Create an index for the TIME pane 
	m_nTimePaneNo = nSize++; 
	nSeconds = 1; 
	pIndicators[m_nTimePaneNo] = ID_INDICATOR_TIME; 
 
	// TODO: Select an appropriate time interval for updating 
	// the status bar when idling. 
	m_wndStatusBar.SetTimer(0x1000, nSeconds * 1000, NULL); 
 
	return m_wndStatusBar.SetIndicators(pIndicators, nSize); 
} 
 
void CMainFrame::OnViewStatusChangefont()  
{ 
	CFontDialog dlg(&m_lf,CF_SCREENFONTS); 
	if(dlg.DoModal()==IDOK) 
	{ 
		m_font.DeleteObject(); 
		if(m_font.CreateFontIndirect(&m_lf)) 
		{ 
			m_wndStatusBar.SetFont(&m_font); 
			RecalcLayout(); 
		}					    
	}     
} 
 
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	if (pMsg->message == WM_RBUTTONDOWN) 
	{ 
		CWnd* pWnd = CWnd::FromHandlePermanent(pMsg->hwnd); 
		CControlBar* pBar = DYNAMIC_DOWNCAST(CControlBar, pWnd); 
 
		if (pBar != NULL) 
		 { 
			CMenu Menu; 
			CPoint pt; 
 
			pt.x = LOWORD(pMsg->lParam); 
			pt.y = HIWORD(pMsg->lParam); 
			pBar->ClientToScreen(&pt); 
 
			if (Menu.LoadMenu(IDR_MENU_TOOLBAR)) 
			{ 
				CMenu* pSubMenu = Menu.GetSubMenu(0); 
 
				if (pSubMenu!=NULL) 
				{ 
					pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this); 
				} 
			} 
		} 
	} 
	return CMDIFrameWnd::PreTranslateMessage(pMsg); 
} 
 
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	if (CMDIFrameWnd::OnCreateClient(lpcs, pContext)) 
	{ 
		m_wndMdiClient.SubclassWindow(m_hWndMDIClient); 
		m_wndMdiClient.SetBitmap(IDB_BGBMP); 
		return TRUE; 
	} 
	else 
		return FALSE; 
} 
 
void CMainFrame::OnWindowCloseall()  
{ 
	CChildFrame *pChild, *pPrevChild = NULL; 
	while((pChild = (CChildFrame *) MDIGetActive()) != NULL) 
	{ 
		if (pChild == pPrevChild) 
			return ; 
		pPrevChild = pChild; 
		pChild->SendMessage(WM_CLOSE); 
	};	 
} 
void CMainFrame::OnUpdateWindowCloseall(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(MDIGetActive() != NULL); 
} 
// For mainframe client bachground pattern 
CMdiClient::CMdiClient() 
{ 
	m_pBmp = NULL; 
	m_nBackColor = CLR_INVALID; 
} 
 
CMdiClient::~CMdiClient() 
{ 
	if (m_pBmp) 
	{ 
		m_pBmp->DeleteObject(); 
		delete m_pBmp; 
		m_pBmp = NULL; 
	} 
} 
 
IMPLEMENT_DYNCREATE(CMdiClient, CWnd) 
 
BEGIN_MESSAGE_MAP(CMdiClient, CWnd) 
	//{{AFX_MSG_MAP(CMdiClient) 
	ON_WM_ERASEBKGND() 
	ON_WM_SIZE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
BOOL CMdiClient::OnEraseBkgnd(CDC* pDC)  
{ 
	CRect rect; 
	GetClientRect(&rect); 
 
	if (m_nBackColor != CLR_INVALID) 
		pDC->FillSolidRect(&rect, m_nBackColor); 
	else 
		if (m_pBmp != NULL) 
		{ 
			BITMAP bm; 
			CDC dcMem; 
			VERIFY(m_pBmp->GetObject(sizeof(BITMAP), (LPVOID)&bm)); 
			dcMem.CreateCompatibleDC(NULL); 
			CBitmap* pOldBitmap = dcMem.SelectObject(m_pBmp); 
 
			for (register int nX = 0; nX < rect.Width(); nX += bm.bmWidth) 
				for (register int nY = 0; nY < rect.Height(); nY += bm.bmHeight) 
					pDC->BitBlt(nX, nY, bm.bmWidth, bm.bmHeight, &dcMem, 0, 0, SRCCOPY); 
 
			dcMem.SelectObject(pOldBitmap); 
		} 
		else 
			CWnd::OnEraseBkgnd(pDC); 
 
	return TRUE; 
} 
 
COLORREF CMdiClient::SetBackColor(COLORREF nBackColor) 
{ 
	LockWindowUpdate(); 
 
	COLORREF cr = m_nBackColor; 
	m_nBackColor = nBackColor; 
 
	UnlockWindowUpdate(); 
 
	return cr; 
} 
 
BOOL CMdiClient::SetBitmap(UINT nID) 
{ 
	BOOL bResult = true; 
 
	LockWindowUpdate(); 
 
	if (m_pBmp) 
	{ 
		m_pBmp->DeleteObject(); 
		delete m_pBmp; 
		m_pBmp = NULL; 
	} 
 
	m_pBmp = new CBitmap(); 
	bResult = m_pBmp->LoadBitmap(nID); 
 
	UnlockWindowUpdate(); 
 
	return bResult; 
} 
 
void CMdiClient::OnSize(UINT nType, int cx, int cy)  
{ 
	CWnd::OnSize(nType, cx, cy); 
	 
	if (m_pBmp != NULL) 
		Invalidate(); 
} 
 
void CMainFrame::OnSize(UINT nType, int cx, int cy)  
{ 
	CMDIFrameWnd::OnSize(nType, cx, cy); 
	 
	CImageLABView *pView = (CImageLABView*)GetActiveFrame()->GetActiveView( ); 
	if(pView!=NULL) 
	{ 
		if(!pView->bFreeze) 
		{ 
			pView->CG200Show(false); 
			pView->ReSetDisplayPos(); 
			pView->CG200Show(); 
		} 
		else 
		{ 
			pView->ReSetDisplayPos(); 
		}	 
	} 
} 
void CMainFrame::OnBCReset() 
{ 
	m_wndMyDialogBar.ButtonReset(); 
} 
 
void CMainFrame::OnUpdateBCReset(CCmdUI* pCmdUI) 
{ 
	pCmdUI->Enable(m_wndMyDialogBar.IsButtonReset); 
}