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

📄 imagelabview.cpp

📁 医学图象处理系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				break;
			default:
				AfxMessageBox("请将颜色分辨率调到至少16位显示!!!");
				return -1;
			}		
		}
		pScrnBMP = new CBitmap;
		pScrnBMP->CreateCompatibleBitmap(pDC, MaxImageWidth, MaxImageHeight);
		pScrnImageMemDC = new CDC;
		pScrnImageMemDC->CreateCompatibleDC(pDC);
		pScrnImageMemDC->SelectObject(pScrnBMP);
		ReleaseDC(pDC);
	}

	return 0;
}

void CImageLABView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	CImageLABDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CRect    rect, Wrect;
	GetClientRect(&rect);

	int ImgWidth, ImgHeight;
	ScrollSize = CSize(MaxImageWidth, MaxImageHeight);
	if(pDoc->Image.m_lpDibArray != NULL)
	{
		ImgWidth  = int(pDoc->Image.m_ImageWidth * ShowScaleType[ShowScale] + 0.5);
		ImgHeight = int(pDoc->Image.m_ImageHeight * ShowScaleType[ShowScale] + 0.5);
		ImgWidth  = ImgWidth<100? 100 : ImgWidth; 
		ImgHeight = ImgHeight<100? 100 : ImgHeight;
		ScrollSize = CSize(ImgWidth, ImgHeight); 
	}	

	CSize sizePage(rect.Size());
	if(ScrollSize.cx>32000||ScrollSize.cy>32000)
	{
		if(ScrollSize.cx<sizePage.cx) 
			sizePage.cx=ScrollSize.cx;
        if(ScrollSize.cy<sizePage.cy) 
			sizePage.cy=ScrollSize.cy;
		SCROLLINFO xInfo,yInfo;
        xInfo.cbSize    = sizeof(SCROLLINFO);
		xInfo.fMask     = SIF_ALL|SIF_DISABLENOSCROLL;
		xInfo.nMin      = 0;
		xInfo.nMax      = ScrollSize.cx-1;
		xInfo.nPage     = sizePage.cx;
		xInfo.nPos      = 0;
		xInfo.nTrackPos = 0;
		
		yInfo.cbSize    = sizeof(SCROLLINFO);
		yInfo.fMask     = SIF_ALL|SIF_DISABLENOSCROLL;
		yInfo.nMin      = 0;
		yInfo.nMax      = ScrollSize.cy-1;
		yInfo.nPage     = sizePage.cy;
		yInfo.nPos      = 0;
		yInfo.nTrackPos = 0;
		SetScrollInfo(SB_HORZ,&xInfo);
		SetScrollInfo(SB_VERT,&yInfo);
	}
	else
	{
		SetScrollSizes(MM_TEXT, ScrollSize);	
	}

	CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd();
	pMain->GetClientRect(&Wrect);
	if(ImgWidth < int(Wrect.Width()*0.8) && ImgHeight < int(Wrect.Height()*0.8))
		ResizeParentToFit(FALSE);
	if(pDoc->Image.m_lpDibArray == NULL)
		ResizeParentToFit(FALSE);
	ResizeParentToFit();
	pDoc->SetPathName(LPCTSTR(pDoc->ImageFileName), false);

	InvalidateRect(&rect, false);         // 更新视类图像	
	pMain->m_wndMyDialogBar.Invalidate(); // 更新导游图中的图像
}

void CImageLABView::OnSize(UINT nType, int cx, int cy) 
{
	CScrollView::OnSize(nType, cx, cy);

	if(ScrollOrgPt.x||ScrollOrgPt.y)
	{
		OldScrollOrgPt = ScrollOrgPt;
		ScrollOrgPt = GetScrollPosition();
		CRect clientRect;
		GetClientRect(&clientRect);
		CImageLABDoc* pDoc = GetDocument();
		ASSERT_VALID(pDoc);
		int cxDIB = (int)pDoc->Image.m_ImageWidth;         // 图像的宽度
		int cyDIB = (int)pDoc->Image.m_ImageHeight;        // 图像的高度
		if((clientRect.Width()<cxDIB || clientRect.Height()<cyDIB)&&CanManualMove) 
		{			
			MaxScrollRange.cx = (int)(cxDIB*ShowScaleType[ShowScale] + 0.5
									  - clientRect.Width());
			MaxScrollRange.cy = (int)(cyDIB*ShowScaleType[ShowScale] + 0.5 
									  - clientRect.Height());
		}
	}
	CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd();
	pMain->m_wndMyDialogBar.DrawMiniImage();

	CImageLABDoc* pDoc = GetDocument();
	if(hcg200 != NULL && !bFreeze)
	{
		CG200Capture(hcg200, false);
		ReSetDisplayPos();	
		CG200Capture(hcg200, true);
	}
	else if(bFreeze)
		ReSetDisplayPos();
}
void CImageLABView::ReSetDisplayPos()
{
	GetClientRect(&VideoRect);
	//TRACE("Begin in ReSetDisplayPos VideoRect = (%d %d %d %d)\n", VideoRect.left,  VideoRect.top, VideoRect.right, VideoRect.bottom);
	MapWindowPoints(NULL, &VideoRect);
	
	int dx , dy;
	if( VideoRect.Width() && VideoRect.Height() )
	{
		//如果显示的尺寸大于 768*576 则将图像显示在客户区的中部
		if(VideoRect.Width()  >MaxImageWidth) 
		{
			dx = (VideoRect.Width() - MaxImageWidth)/2;
			VideoRect.left  += dx;			
			VideoRect.right  = VideoRect.left + MaxImageWidth;
		}
		if(VideoRect.Height() >MaxImageHeight) 
		{
			dy = (VideoRect.Height() - MaxImageHeight)/2;
			VideoRect.top   += dy;
			VideoRect.bottom = VideoRect.top  + MaxImageHeight;
		}
		VideoRect.left  = VideoRect.left/4*4 - 2;
		VideoRect.right = VideoRect.right/4*4 - 2;
		if( VideoRect.left < 2 ) 
		{
			VideoRect.right = (2 - VideoRect.left + VideoRect.right)/2*2;
			VideoRect.left = 2;
		}

		if( hcg200 != NULL )
		{
			CG200SetInpVideoWindow(hcg200, (int)VideoStart.x, (int)VideoStart.y,
											MaxImageWidth,     MaxImageHeight);
			CG200SetDispWindow(hcg200, VideoRect.left,    VideoRect.top,
								       VideoRect.Width(), VideoRect.Height());
		}
	}
	//TRACE("End in ReSetDisplayPos VideoRect = (%d %d %d %d)\n", VideoRect.left,  VideoRect.top, VideoRect.right, VideoRect.bottom);
}
void CImageLABView::CG200Show(BOOL IsShow)
{
	if(hcg200 != NULL)
	{
		CG200Capture(hcg200, IsShow);
	}
}
void CImageLABView::PostNcDestroy() 
{	
	if(hcg200 != NULL && !bFreeze)
	{
		CG200Capture(hcg200, false);
	}
	if(hcg200          != NULL) { EndCG200(hcg200);			  hcg200 = NULL;     }
	if(hinstDevice     != NULL) { FreeLibrary( hinstDevice ); hinstDevice = NULL;}

	SaveDesFile();
	CImageLABApp::SorceType = 0;
	CScrollView::PostNcDestroy();
}

BOOL CImageLABView::OnEraseBkgnd(CDC* pDC) 
{
	return false;
	//return CScrollView::OnEraseBkgnd(pDC);
}
void CImageLABView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CPoint tmpPt; 
	GetCursorPos(&tmpPt);

	switch(nChar)
	{
		case VK_UP:
			SetCursorPos(tmpPt.x ,tmpPt.y - 1);
			break;
		case VK_DOWN:
			SetCursorPos(tmpPt.x ,tmpPt.y + 1);
			break;
		case VK_LEFT:
			SetCursorPos(tmpPt.x - 1 , tmpPt.y);
			break;
		case VK_RIGHT:
			SetCursorPos(tmpPt.x + 1 , tmpPt.y);
			break;
		case VK_HOME:
			OnVScroll(SB_TOP, 0, NULL);
			OnHScroll(SB_LEFT, 0, NULL);
			break;
		case VK_END:
			OnVScroll(SB_BOTTOM, 0, NULL);
			OnHScroll(SB_RIGHT, 0, NULL);
			break;
		case VK_PRIOR:
			OnVScroll(SB_PAGEUP, 0, NULL);
			break;
		case VK_NEXT:
			OnVScroll(SB_PAGEDOWN, 0, NULL);
			break;
		case VK_RETURN:
			{
				DWORD	lp;
				CPoint	pt = tmpPt + ScrollOrgPt;
				lp = (WORD)pt.y;
				lp = lp << 16;
				lp = lp + (WORD)pt.x;
				SendMessage(WM_LBUTTONDOWN, 0, lp);
				SendMessage(WM_LBUTTONUP,   0, lp);
			}
			break;
		case VK_SPACE:
			SpaceKeyPressed=true;
			break;
        case VK_CONTROL:
			CtrlKeyPressed=true;
			break;
        case VK_CAPITAL:
		{
			CapsKeyLocked^=1;
			if(CapsKeyLocked)
				::SetCursor( AfxGetApp()->LoadCursor(IDC_CURSOR_SELECTRECT));
			else 
				::SetCursor( AfxGetApp()->LoadStandardCursor(IDC_ARROW));
			break;
		}
		case VK_SHIFT:
			ShiftKeyPressed = true;
			break;
	}
	
	CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CImageLABView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	switch(nChar)
	{
		case VK_SPACE:
			SpaceKeyPressed=false;
			break;
        case VK_CONTROL:
			CtrlKeyPressed=false;
			break;        
		case VK_SHIFT:
			ShiftKeyPressed = false;
			break;
	}
	
	CScrollView::OnKeyUp(nChar, nRepCnt, nFlags);
}

void CImageLABView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if (DashRectDrawed)
	{
		CPoint p0,p1;
		p0 = SelectLTPt- ScrollOrgPt;
		p1 = SelectRBPt- ScrollOrgPt;
		CheckRect(p0,p1);
		CRect  dashRect(p0.x, p0.y, p1.x+3, p1.y+3);
		InvalidateRect(dashRect, FALSE);
		DashRectDrawed = FALSE;
		ISLineSelected = FALSE;
	}    
	if(CanManualMove && IsFreePan)
		::SetCursor( AfxGetApp()->LoadCursor(IDC_HANDGRABED));
	SelectLTPt = SelectRBPt = point + ScrollOrgPt;
	IsLButtonDown = TRUE;
	SetCapture();
	CScrollView::OnLButtonDown(nFlags, point);
}

void CImageLABView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CImageLABDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
	if(IsLButtonDown&&!IsFreePan)
	{
		CClientDC pdc(this);		
		pdc.SetROP2(R2_COPYPEN);
	 
	    pOldPen = pdc.SelectObject(&dashRedPen);
        CPoint lt=SelectLTPt-ScrollOrgPt;
		CPoint rb=SelectRBPt-ScrollOrgPt;
		
		if(abs(lt.x-rb.x)>5 || abs(lt.y-rb.y)>5)
		{
			if(IsShowLineGray)
			{
				pdc.MoveTo(lt);
				pdc.LineTo(rb.x, rb.y);	
			}
			else if(abs(lt.x-rb.x)>5 && abs(lt.y-rb.y)>5)
			{
				pdc.MoveTo(lt.x,lt.y);
				pdc.LineTo(rb.x,lt.y);
				pdc.LineTo(rb.x,rb.y);
				pdc.LineTo(lt.x,rb.y);
				pdc.LineTo(lt.x,lt.y);			
			}
		}
		else 
		{
			CheckRect(lt,rb);
			CRect  dashRect(lt.x,lt.y,rb.x+1,rb.y+1);
			DashRectDrawed = FALSE;
			ISLineSelected = FALSE;
			InvalidateRect(dashRect, FALSE);
		}
		pdc.SelectObject(pOldPen);
	}
	else if (IsLButtonDown&&IsFreePan)
	{
		CMainFrame *pMainFrame = (CMainFrame *)AfxGetMainWnd();
	    ASSERT_VALID(pMainFrame);
	    BOOL NoScroll = OldScrollOrgPt==ScrollOrgPt;
		if(pMainFrame->m_wndMyDialogBar.BigImage)
		{
			pMainFrame->m_wndMyDialogBar.DrawMiniImage();
		}
		else
		{
			pMainFrame->m_wndMyDialogBar.Invalidate();
		}
	}
	
	IsLButtonDown = false;
	ReleaseCapture();

	CScrollView::OnLButtonUp(nFlags, point);
}

void CImageLABView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CRect  cClientRect;
	GetClientRect(cClientRect);
	if (!cClientRect.PtInRect(point)&&!IsFreePan)  	MessageBeep(-1);
    
	MousePt = point + ScrollOrgPt;

	CClientDC pdc(this);
    
	if (IsLButtonDown&&!IsFreePan)
	{
		CPoint   tmpP,oldP;
		pOldPen   = pdc.SelectObject(&dashPen);
		pdc.SelectStockObject(NULL_BRUSH);

		pdc.SetROP2(R2_XORPEN);
		if (DashRectDrawed)
		{
			oldP = SelectLTPt - ScrollOrgPt;
			tmpP = SelectRBPt - ScrollOrgPt;
			if(IsShowLineGray)
			{
				pdc.MoveTo(oldP);
				pdc.LineTo(tmpP.x, tmpP.y);
			}
			else
			{
				CheckRect(oldP,tmpP);
				pdc.Rectangle(oldP.x, oldP.y, tmpP.x+1, tmpP.y+1);
			}
		}        
		tmpP = point;		
		
		//如果space 按下的话,移动选择的矩形
		if(SpaceKeyPressed)
		{
            CSize Offest = tmpP - SelectRBPt + ScrollOrgPt;
			SelectLTPt +=Offest;
		}
		else if(CtrlKeyPressed)
		{
			CSize Offest = tmpP - SelectRBPt + ScrollOrgPt;
			SelectLTPt -= Offest;
		}

		oldP = SelectLTPt - ScrollOrgPt;
        if(IsShowLineGray)
		{
			if(ShiftKeyPressed&&!abs(oldP.x-tmpP.x)==0)
			{
				double slope =(double)(oldP.y-tmpP.y)/(double)(oldP.x-tmpP.x);
				if(fabs(slope)<0.7) 
				{
					tmpP.y = oldP.y;
				}
				else if (fabs(slope)>1.7)
				{
					tmpP.x = oldP.x;
				}
				else
				{
					if (fabs(slope)<1)
						tmpP.y = tmpP.y>oldP.y?oldP.y + abs(tmpP.x - oldP.x): oldP.y - abs(tmpP.x - oldP.x);
					else
						tmpP.x = tmpP.x>oldP.x?oldP.x + abs(tmpP.y - oldP.y): oldP.x - abs(tmpP.y - oldP.y); 
				}

			}			
			pdc.MoveTo(oldP);
			pdc.LineTo(tmpP.x, tmpP.y);
			SelectRBPt = tmpP + ScrollOrgPt;
			ISLineSelected = TRUE;
		}
		else
		{
			SelectRBPt = tmpP + ScrollOrgPt;
			CheckRect(oldP,tmpP);
			pdc.Rectangle(oldP.x, oldP.y, tmpP.x+1, tmpP.y+1);
		}
		DashRectDrawed = TRUE;
		pdc.SelectObject(pOldPen);
	}	
	else if (IsLButtonDown&&IsFreePan)
	{
		int dx = (MousePt.x - SelectLTPt.x);
		int dy = (MousePt.y - SelectLTPt.y);
		
		ScrollOrgPt.x -= dx;
		ScrollOrgPt.y -= dy;

		if(ShowScale > FITSCALENUM)
		{
			int ImageSclae = int(ShowScaleType[ShowScale]);
			ScrollOrgPt.x = (ScrollOrgPt.x+ ImageSclae- 1)/ImageSclae*ImageSclae;
			ScrollOrgPt.y = (ScrollOrgPt.y+ ImageSclae- 1)/ImageSclae*ImageSclae;
		}

		if(ScrollOrgPt.x < 0 ) 
			ScrollOrgPt.x = 0;
		else if(ScrollOrgPt.x > MaxScrollRange.cx) 
			ScrollOrgPt.x = MaxScrollRange.cx;

		if(ScrollOrgPt.y<0 ) ScrollOrgPt.y = 0;
		else if(ScrollOrgPt.y > MaxScrollRange.cy)
			ScrollOrgPt.y = MaxScrollRange.cy;		
		ScrollToPosition(ScrollOrgPt);		
	}
	CScrollView::OnMouseMove(nFlags, point);
}

void CImageLABView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	CImageLABDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	IsShowLineGray = IsFreePan = FALSE;
	m_PopPoint = point + ScrollOrgPt;

⌨️ 快捷键说明

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