⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagelabview.cpp

📁 医学图象处理系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	CScrollView::OnRButtonDown(nFlags, point);
}

void CImageLABView::OnRButtonUp(UINT nFlags, CPoint point) 
{
	//CImageLABDoc* pDoc = GetDocument();
	//ASSERT_VALID(pDoc);
	CScrollView::OnRButtonUp(nFlags, point);
}

BOOL CImageLABView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll) 
{
	MousePt -= ScrollOrgPt;
	OldScrollOrgPt = ScrollOrgPt;
	ScrollOrgPt = GetScrollPosition();
	MousePt += ScrollOrgPt;

	CMainFrame *pMainFrame = (CMainFrame *)AfxGetMainWnd();
	ASSERT_VALID(pMainFrame);
	BOOL NoScroll = OldScrollOrgPt==ScrollOrgPt;
	if(!NoScroll) 
	{
		if(pMainFrame->m_wndMyDialogBar.BigImage)
		{
			pMainFrame->m_wndMyDialogBar.DrawMiniImage();
		}
		else
		{
			pMainFrame->m_wndMyDialogBar.Invalidate();
		}
	}	

	BYTE nCode = LOBYTE (nScrollCode);

	if ((nCode == SB_PAGELEFT) || (nCode == SB_PAGERIGHT) || (nCode == SB_LINELEFT) || (nCode == SB_LINERIGHT))
	{
		int nCount, nInc, nFinalInc, nLineCode;

		switch (nCode) 
		{
		case SB_PAGELEFT:
			nLineCode = SB_LINELEFT;
			nInc = m_pageDev.cx / m_nPageSlices;
			nFinalInc = m_pageDev.cx % m_nPageSlices;
			nCount = m_nPageSlices;
			break;

		case SB_PAGERIGHT:
			nLineCode = SB_LINERIGHT;
			nInc = m_pageDev.cx / m_nPageSlices;
			nFinalInc = m_pageDev.cx % m_nPageSlices;
			nCount = m_nPageSlices;
			break;

		case SB_LINELEFT:
			nLineCode = SB_LINELEFT;
			nInc = m_lineDev.cx / m_nLineSlices;
			nFinalInc = m_lineDev.cx % m_nLineSlices;
			nCount = m_nLineSlices;
			break;

		case SB_LINERIGHT:
			nLineCode = SB_LINERIGHT;
			nInc = m_lineDev.cx / m_nLineSlices;
			nFinalInc = m_lineDev.cx % m_nLineSlices;
			nCount = m_nLineSlices;
			break;
		}

		int nOldLineSize = m_lineDev.cx;
		BOOL bResult = FALSE;
		DWORD dwTime = 0;

		while (nCount--) 
		{
			DWORD dwCurrentTime = ::GetCurrentTime ();
			DWORD dwElapsedTime = dwCurrentTime - dwTime;
			if (dwElapsedTime < m_dwMinTime)
				::Sleep (m_dwMinTime - dwElapsedTime);
			dwTime = dwCurrentTime;

			m_lineDev.cx = nInc;
			BOOL bScrolled =
				CScrollView::OnScroll (MAKEWORD (nLineCode, -1), nPos);
			m_lineDev.cx = nOldLineSize;

			if (!bScrolled)
				return bResult;

			bResult = TRUE;
		}

		if (nFinalInc) {
			m_lineDev.cx = nFinalInc;
			if (!CScrollView::OnScroll (MAKEWORD (nLineCode, -1), nPos))
				bResult = TRUE;
			m_lineDev.cx = nOldLineSize;
		}
		return bResult;
	}
	
	// Next handle up/down scroll messages. If scrolling by page,
	// scroll m_nPageSlices times rather than 1. If scrolling by line,
	// scroll m_nLineSlices times.
	
	nCode = HIBYTE (nScrollCode);

	if ((nCode == SB_PAGEUP) || (nCode == SB_PAGEDOWN) || (nCode == SB_LINEUP) || (nCode == SB_LINEDOWN)) 
	{
		int nCount, nInc, nFinalInc, nLineCode;

		switch (nCode)
		{
		case SB_PAGEUP:
			nLineCode = SB_LINEUP;
			nInc = m_pageDev.cy / m_nPageSlices;
			nFinalInc = m_pageDev.cy % m_nPageSlices;
			nCount = m_nPageSlices;
			break;

		case SB_PAGEDOWN:
			nLineCode = SB_LINEDOWN;
			nInc = m_pageDev.cy / m_nPageSlices;
			nFinalInc = m_pageDev.cy % m_nPageSlices;
			nCount = m_nPageSlices;
			break;

		case SB_LINEUP:
			nLineCode = SB_LINEUP;
			nInc = m_lineDev.cy / m_nLineSlices;
			nFinalInc = m_lineDev.cy % m_nLineSlices;
			nCount = m_nLineSlices;
			break;

		case SB_LINEDOWN:
			nLineCode = SB_LINEDOWN;
			nInc = m_lineDev.cy / m_nLineSlices;
			nFinalInc = m_lineDev.cy % m_nLineSlices;
			nCount = m_nLineSlices;
			break;
		}

		int nOldLineSize = m_lineDev.cy;
		BOOL bResult = FALSE;
		DWORD dwTime = 0;

		while (nCount--) 
		{
			DWORD dwCurrentTime = ::GetCurrentTime ();
			DWORD dwElapsedTime = dwCurrentTime - dwTime;
			if (dwElapsedTime < m_dwMinTime)
				::Sleep (m_dwMinTime - dwElapsedTime);
			dwTime = dwCurrentTime;

			m_lineDev.cy = nInc;
			BOOL bScrolled =
				CScrollView::OnScroll (MAKEWORD (-1, nLineCode), nPos);
			m_lineDev.cy = nOldLineSize;

			if (!bScrolled)
				return bResult;

			bResult = TRUE;
		}

		if (nFinalInc) {
			m_lineDev.cy = nFinalInc;
			if (!CScrollView::OnScroll (MAKEWORD (-1, nLineCode), nPos))
				bResult = TRUE;
			m_lineDev.cy = nOldLineSize;
		}
		return bResult;
	}//*/

	return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
}
void CImageLABView::CheckRect(CPoint &p1,CPoint &p2)
{
	P_LONG tempx,tempy,temp;
    tempx=p2.x - p1.x;
	tempy=p2.y - p1.y;
	if(tempx<0)
	{
		temp=p1.x; 
		p1.x=p2.x; 
		p2.x=temp;
	}
	if(tempy<0)
	{
		temp=p1.y; 
		p1.y=p2.y; 
		p2.y=temp;
	}
}
void CImageLABView::OnContextMenu(CWnd*, CPoint point)
{	// CG: This block was added by the Pop-up Menu component		{		if (point.x == -1 && point.y == -1)
		{			//keystroke invocation			CRect rect;			GetClientRect(rect);			ClientToScreen(rect);			point = rect.TopLeft();			point.Offset(5, 5);		}		CMenu menu;		VERIFY(menu.LoadMenu(CG_IDR_POPUP_IMAGE_LABVIEW));		CMenu* pPopup = menu.GetSubMenu(0);		ASSERT(pPopup != NULL);		CWnd* pWndPopupOwner = this;		while (pWndPopupOwner->GetStyle() & WS_CHILD)			pWndPopupOwner = pWndPopupOwner->GetParent();		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,			pWndPopupOwner);	}
}

void CImageLABView::OnFitimage() 
{
	ShowScale = FITSCALENUM;
	fShowScale = ShowScaleType[ShowScale];

	DashRectDrawed = FALSE;
	OnUpdate(this,NULL,NULL);
	ScrollOrgPt = GetScrollPosition();
	for(int i= 0; i< MAXPINNUM; i++)
	{
		if( m_Pin[i] != NULL ) 
		{
			m_PinPos[i].x = m_PinImagePos[i].x;
			m_PinPos[i].y = m_PinImagePos[i].y;
			m_Pin[i]->MoveToPt(m_PinPos[i]);
		}
	}
}

void CImageLABView::OnUpdateFitimage(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(ShowScale != FITSCALENUM);
}

void CImageLABView::OnZoomin() 
{
	ShowScale++;
	fShowScale = ShowScaleType[ShowScale];

	DashRectDrawed = FALSE;	
	OnUpdate(this,NULL,NULL);
	ScrollOrgPt = GetScrollPosition();
	for(int i= 0; i< MAXPINNUM; i++)
	{
		if( m_Pin[i] != NULL ) 
		{
			m_PinPos[i].x = int( fShowScale * m_PinImagePos[i].x );
			m_PinPos[i].y = int( fShowScale * m_PinImagePos[i].y );
			m_Pin[i]->MoveToPt(m_PinPos[i]);
		}
	}
}

void CImageLABView::OnUpdateZoomin(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(ShowScale<MAXSCALENUM-1);
}

void CImageLABView::OnZoomout() 
{
	ShowScale--;
	fShowScale = ShowScaleType[ShowScale];
	DashRectDrawed = FALSE;
	OnUpdate(this,NULL,NULL);
	ScrollOrgPt = GetScrollPosition();
	for(int i= 0; i< MAXPINNUM; i++)
	{
		if( m_Pin[i] != NULL ) 
		{
			m_PinPos[i].x = int( fShowScale * m_PinImagePos[i].x );
			m_PinPos[i].y = int( fShowScale * m_PinImagePos[i].y );
			m_Pin[i]->MoveToPt(m_PinPos[i]);
		}
	}
}

void CImageLABView::OnUpdateZoomout(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(ShowScale>0);
}

void CImageLABView::OnImageShowlinegrayinfo() 
{
	IsShowLineGray = TRUE;
	if(DashRectDrawed && !ISLineSelected)
	{
		CPoint  p0 = SelectLTPt- ScrollOrgPt;
		CPoint  p1 = SelectRBPt- ScrollOrgPt;
		CheckRect(p0, p1);
		CRect  dashRect(p0.x, p0.y, p1.x+ 1, p1.y+ 1);
		InvalidateRect(dashRect, FALSE);
		DashRectDrawed = FALSE;
	}//*/
	if(ISLineSelected) 
	{
		CPoint p0, p1;
		GetSelectArea(p0, p1);
		CImageLABDoc* pDoc = GetDocument();
		ASSERT_VALID(pDoc);
		CLineGrayInfoDlg dlg(GetDocument(), p0, p1);
		dlg.DoModal();	
		ISLineSelected = IsShowLineGray = DashRectDrawed = FALSE;
		p0 = SelectLTPt - ScrollOrgPt;
		p1 = SelectRBPt - ScrollOrgPt;
		CheckRect(p0, p1);
		CRect  dashRect(p0.x-1,p0.y-1,p1.x+2,p1.y+2);
		InvalidateRect(dashRect, FALSE);
	}
}
void CImageLABView::OnUpdateImageShowlinegrayinfo(CCmdUI* pCmdUI) 
{
	pCmdUI->SetText(ISLineSelected ? "线灰度显示" : "线灰度显示选点");
}
BOOL CImageLABView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	if(nHitTest == HTCLIENT)
	{
		if(IsShowLineGray)
			::SetCursor( AfxGetApp()->LoadCursor(IDC_CURSOR_SELECTLINE));
		else if(!IsFreePan)
		{
			if(CapsKeyLocked)
				::SetCursor( AfxGetApp()->LoadCursor(IDC_CURSOR_SELECTRECT));
			else
				::SetCursor( AfxGetApp()->LoadStandardCursor(IDC_ARROW));
		}
		else if(CanManualMove && IsFreePan)
		{
			if(IsLButtonDown)
				::SetCursor( AfxGetApp()->LoadCursor(IDC_HANDGRABED));
			else
				::SetCursor( AfxGetApp()->LoadCursor(IDC_HANDWANTGRAB)); 
		}
		return true;
	}
	return CScrollView::OnSetCursor(pWnd, nHitTest, message);
}
void CImageLABView::OnUpdateIndicatorImagepixels(CCmdUI* pCmdUI) 
{
	CImageLABDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	double fPx = MousePt.x/ ShowScaleType[ShowScale];
	double fPy = MousePt.y/ ShowScaleType[ShowScale];
	int    ClientW = int( pDoc->Image.m_ImageWidth * ShowScaleType[ShowScale] );
	long px = long( fPx + 0.5);
	long py = long( fPy + 0.5);
	if(pDoc->Image.CheckPoint(px, py) && pDoc->Image.m_lpDibArray != NULL)
	{
		RGBTRIPLE temp = pDoc->Image.GetRGBPixel(px, py);
		CString msg;
		msg.Format("鼠标位置:(%7.2f, %7.2f) RGB=(%3d,%3d,%3d)\n",fPx, fPy, 
			       temp.rgbtRed, temp.rgbtGreen, temp.rgbtBlue);
		pCmdUI->SetText(msg);	
		if(ClientW < 500)
			pSB->SetPaneText(0,msg);
	}
}

void CImageLABView::OnUpdateIndicatorImagescale(CCmdUI* pCmdUI) 
{
    CString strscale;
	strscale.Format("显示比例:%d%%",int(ShowScaleType[ShowScale]*100));
	pCmdUI->SetText(strscale);	
}

void CImageLABView::OnEditCopy() 
{
	CImageLABDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (OpenClipboard())
	{
		BeginWaitCursor();
		EmptyClipboard();
		CPoint p0,p1;
		if(DashRectDrawed)
		{
			GetSelectArea(p0,p1);
		}
		else
		{
			p0 = CPoint(0,0);
			p1 = CPoint(pDoc->Image.m_ImageWidth-1,pDoc->Image.m_ImageHeight-1);
		}
		
		HANDLE h_Dib =  pDoc->Image.GetCopyHandle(p0, p1);
		SetClipboardData(CF_DIB, CopyHandle(h_Dib));
		CloseClipboard();
        pDoc->Image.ReleaseCopyHandle();
		EndWaitCursor();
	}
}

BOOL CImageLABView::GetSelectArea(CPoint &p1, CPoint &p2)
{
	CImageLABDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CPoint tempPT1(0, 0), tempPT2(0, 0);
	
	int w = int(pDoc->Image.m_ImageWidth*ShowScaleType[ShowScale]);
    int h = int(pDoc->Image.m_ImageHeight*ShowScaleType[ShowScale]);
	CRect ViewRect;
	GetClientRect(&ViewRect);
	if(ViewRect.Width()>w) 
	{
		tempPT1.x -= (ViewRect.Width()-w)/2;
		tempPT2.x -= (ViewRect.Width()-w)/2;
	}
	if(ViewRect.Height()>h) 
	{
		tempPT1.y -= (ViewRect.Height()-h)/2;
		tempPT2.y -= (ViewRect.Height()-h)/2;
	}
	tempPT1.x = int((double)SelectLTPt.x /ShowScaleType[ShowScale] + 0.5);
	tempPT1.y = int((double)SelectLTPt.y /ShowScaleType[ShowScale] + 0.5);
	tempPT2.x = int((double)SelectRBPt.x /ShowScaleType[ShowScale] + 0.5);
	tempPT2.y = int((double)SelectRBPt.y /ShowScaleType[ShowScale] + 0.5);
	pDoc->Image.CheckPoint(tempPT1);
	pDoc->Image.CheckPoint(tempPT2);	
	pDoc->Image.CheckRect(tempPT1, tempPT2);	
	p1 = tempPT1;
	p2 = tempPT2;
	return TRUE;
}

void CImageLABView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) 
{
	CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd();
	pMain->m_wndMyDialogBar.Invalidate();

	CImageLABDoc* pDoc = GetDocument();

	if( pDoc->Image.m_SorceType )
		CImageLABApp::SorceType = pDoc->Image.m_SorceType;

	if(!bFreeze && hcg200 != NULL)
	{		 
		if( !bActivate  )
		{
			CG200Capture(hcg200, false);
		}
		else 
		{
			CG200Capture(hcg200, true);
		}
	}
	CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}

void CImageLABView::OnFreepan() 
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -