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

📄 navigationdialog.cpp

📁 影像融合与融合精度评价源码影像融合与融合精度评价源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			NavZoomOut.MoveWindow(60,clientRect.bottom-24,18,16,TRUE);
			m_NavigationCtrl.MoveWindow(78,clientRect.bottom-24,100,15,TRUE);
			NavZoomIn .MoveWindow(178,clientRect.bottom-24,18,16,TRUE);
			bRedrawControl = FALSE;
		}

		//缩略图
		HDIB hDIB = pDoc->m_hDIB;
		if(hDIB==NULL)  return;
		DocSize=pDoc->m_sizeDoc;

		CRect FillRect=clientRect;
		clientRect.top=5;
		clientRect.bottom=clientRect.bottom-35;
		vRate=(float)DocSize.cy/clientRect.Height();
		if((int)((clientRect.Width()-10)*vRate)<=DocSize.cx)
			vRate=(float)DocSize.cx/(clientRect.Width()-10);
		DisplayRect.top=(int)((clientRect.top+clientRect.bottom)/2.0-DocSize.cy/2.0/vRate);
		DisplayRect.bottom=DisplayRect.top+(int)(DocSize.cy/vRate);
		DisplayRect.left=(int)((clientRect.left+clientRect.right)/2.0-DocSize.cx/2.0/vRate);
		DisplayRect.right=DisplayRect.left+(int)(DocSize.cx/vRate);

		if(pbmp!=NULL)	delete pbmp;
		CBitmapDC bitmapDC(DisplayRect.Width(), DisplayRect.Height(),pDC);

		rcDIB.top=rcDIB.left=0;
		rcDIB.right=DocSize.cx;
		rcDIB.bottom=DocSize.cy;

		rcDest.top=rcDest.left=0;
		rcDest.right=DisplayRect.Width();
		rcDest.bottom=DisplayRect.Height();

		PaintDIB(bitmapDC.m_hDC, &rcDest, hDIB, &rcDIB, pDoc->m_palDIB );
	
		pbmp=bitmapDC.Close();

		COLORREF bkColor=GetSysColor(COLOR_BTNFACE);
		FillSolidRectUser( pDC, FillRect, DisplayRect,bkColor);

		DrawBitmap(pbmp, pDC, DisplayRect, CPoint(0,0));

		bpbmpChanged=FALSE;
	}
	else
		DrawBitmap(pbmp, pDC, CRect(RedRect.left-1,RedRect.top-1,RedRect.right+1,RedRect.bottom+1),
		CPoint(RedRect.left-1-DisplayRect.left,RedRect.top-1-DisplayRect.top));

	//计算导航框
	int mid;
	CRect ViewClientRect;
	pImageLayer->GetClientRect(&ViewClientRect);

	if( ViewClientRect.Width() >= (int)(DocSize.cx * pImageLayer->m_Zoom) ) 
	{
		RedRect.left=DisplayRect.left;
		RedRect.right=DisplayRect.right;
	}
	else
	{
		float xRate  = DocSize.cx * pImageLayer->m_Zoom / DisplayRect.Width() ;
		float length = ViewClientRect.Width() / xRate;
		mid          = (int)( (pImageLayer->ptDIBOff.x * pImageLayer->m_Zoom + ( ViewClientRect.left + ViewClientRect.right ) / 2 ) / xRate)+ DisplayRect.left;
		RedRect.left = mid - (int)(length/2.0 +0.5)  ;
		RedRect.right= mid + (int)(length/2.0 +0.5)  ;
	}
	if( ViewClientRect.Height() >= (int)(DocSize.cy * pImageLayer->m_Zoom) ) 
	{
		RedRect.top=DisplayRect.top;
		RedRect.bottom=DisplayRect.bottom;
	}
	else
	{
		float yRate  = DocSize.cy * pImageLayer->m_Zoom /  DisplayRect.Height() ;
		float length = ViewClientRect.Height()/ yRate;
		mid          = (int)((pImageLayer->ptDIBOff.y * pImageLayer->m_Zoom + ( ViewClientRect.top + ViewClientRect.bottom ) / 2 ) / yRate) + DisplayRect.top ;
		RedRect.top  = mid - (int)(length/2.0 +0.5);
		RedRect.bottom= mid + (int)(length/2.0 +0.5);
	}

	//adjust it advance
	if(RedRect.Width()<4)
	{
		RedRect.left -= (2-RedRect.Width()/2);
		RedRect.right += (2-RedRect.Width()/2);
	}
	if(RedRect.Height()<4)
	{
		RedRect.top -= (2-RedRect.Height()/2);
		RedRect.bottom += (2-RedRect.Height()/2);
	}
	if(RedRect.left < DisplayRect.left)
		RedRect.OffsetRect(DisplayRect.left-RedRect.left,0);
	if(RedRect.top < DisplayRect.top)
		RedRect.OffsetRect(0,DisplayRect.top-RedRect.top);
	if(RedRect.right > DisplayRect.right)
		RedRect.OffsetRect(DisplayRect.right-RedRect.right,0);
	if(RedRect.bottom > DisplayRect.bottom)
		RedRect.OffsetRect(0,DisplayRect.bottom-RedRect.bottom);

	//画边框
	pDC->SelectStockObject(BLACK_PEN);
	pDC->SelectStockObject(NULL_BRUSH);
	pDC->Rectangle(DisplayRect.left-1,DisplayRect.top-1,DisplayRect.right,DisplayRect.bottom);

	//画图象显示区域的红色方框
	CPen Pen,*pOldPen;
	Pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
	pOldPen = pDC->SelectObject(&Pen);
	pDC->Rectangle(RedRect);
	pDC->SelectObject(pOldPen);
	pDC->SelectStockObject(WHITE_BRUSH);

	pDC->MoveTo(clrect.left+3,clrect.bottom-30);
	pDC->LineTo(clrect.right-3,clrect.bottom-30);
	ReleaseDC(pDC);
}

//在对话框中控制回车键的操作,使其不起作用
void CNavigationDialog::OnOK()
{
	if(	bActiveView == FALSE)
		return ;

	if(bEditChanged)
	{
		UpdateData(TRUE);
		float nValue=(float)atof(m_scale_now);
		if(nValue<0.1 || nValue>1600)
		{
			AfxMessageBox("0.10%到1600.00%之间的数字有效。\n匹配最接近的数字!",MB_ICONSTOP);
			if(nValue>1600)
				nValue=1600;
			if(nValue<0.1)
				nValue=0.1f;
		}

		CMYFUSIONView * pImageLayer = ((CMYFUSIONView *)((CMDIFrameWnd *)AfxGetApp()->
			m_pMainWnd)->MDIGetActive()->GetActiveView());
		float m_oldZoom=pImageLayer->m_Zoom;
		pImageLayer->m_Zoom=(float)(nValue/100.0);
		pImageLayer->AdjustZoomNav(m_oldZoom);

		bEditChanged= FALSE;
	}
}
void CNavigationDialog::OnCancel()
{
	CMainFrame * pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
	//退出全屏显示
	if(	pAppFrame->m_bFullScreenMode)	
		pAppFrame->FullScreenModeOff();

//	CDialog::OnCancel();
}
void CNavigationDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	if(	bActiveView == FALSE)
	{
		CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
		return ;
	}
	CMYFUSIONView * pImageLayer = ((CMYFUSIONView *)((CMDIFrameWnd *)AfxGetApp()->
		m_pMainWnd)->MDIGetActive()->GetActiveView());
	int NowPos = m_NavigationCtrl.GetPos();
	float m_oldZoom=pImageLayer->m_Zoom;
	pImageLayer->m_Zoom=(float)pow(NowPos/25.0,2.0);
	pImageLayer->AdjustZoomNav(m_oldZoom);

	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CNavigationDialog::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if(	bActiveView == FALSE)
	{
		CDialog::OnLButtonDown(nFlags, point);
		return ;
	}
	if(RedRect==DisplayRect)
	{
		CDialog::OnLButtonDown(nFlags, point);
		return ;
	}

	//Move smooth
	if(RedRect.PtInRect(point))
	{
		SetCapture();
		CursorStatus=NAVDLG_HAND_MOVE;
		::SetCursor(m_HandMove);
		ptOffRed.x = point.x - (RedRect.left + RedRect.right)  / 2;
		ptOffRed.y = point.y - (RedRect.top  + RedRect.bottom) / 2;
	}
	//scroll to directly
	else if(DisplayRect.PtInRect(point))
	{
		ptOffRed.x = 0;
		ptOffRed.y = 0;
		if(point.x - DisplayRect.left < (RedRect.Width() / 2))
			ptOffRed.x = point.x - DisplayRect.left - (RedRect.Width() / 2) ;
		if(point.x > DisplayRect.right - RedRect.Width() / 2)
			ptOffRed.x = point.x - DisplayRect.right + RedRect.Width() / 2 ;
		if(point.y - DisplayRect.top < (RedRect.Height() / 2))
			ptOffRed.y = point.y - DisplayRect.top - (RedRect.Height() / 2) ;
		if(point.y > DisplayRect.bottom - RedRect.Height() / 2)
			ptOffRed.y = point.y - DisplayRect.bottom + RedRect.Height() / 2 ;

		//move to the place first
		CMYFUSIONView* pImageLayer = ((CMYFUSIONView *)((CMDIFrameWnd *)AfxGetApp()->
		m_pMainWnd)->MDIGetActive()->GetActiveView());
		CRect ViewClientRect;
		pImageLayer->GetClientRect(&ViewClientRect);

		CPoint NewScroll;
		pImageLayer->ptDIBOff.x = (int)((double) (point.x-DisplayRect.left) / DisplayRect.Width() * DocSize.cx);
		pImageLayer->ptDIBOff.y = (int)((double) (point.y-DisplayRect.top) / DisplayRect.Height() * DocSize.cy);

		//置于中间
		pImageLayer->ptDIBOff.x -= (int) ( (double)ViewClientRect.Width() / 2 / pImageLayer->m_Zoom + 0.5);  
		pImageLayer->ptDIBOff.y -= (int) ( (double)ViewClientRect.Height() / 2 / pImageLayer->m_Zoom + 0.5);  
		if((int)pImageLayer->Width - pImageLayer->ptDIBOff.x < (int) ( (double)ViewClientRect.Width() / pImageLayer->m_Zoom + 0.5))
			pImageLayer->ptDIBOff.x = pImageLayer->Width - (int) ( (double)ViewClientRect.Width() / pImageLayer->m_Zoom + 0.5);
		if((int)pImageLayer->Height - pImageLayer->ptDIBOff.y < (int) ( (double)ViewClientRect.Height() / pImageLayer->m_Zoom + 0.5))
			pImageLayer->ptDIBOff.y = pImageLayer->Height - (int) ( (double)ViewClientRect.Height() / pImageLayer->m_Zoom + 0.5);
		if(pImageLayer->ptDIBOff.x<0) pImageLayer->ptDIBOff.x=0;
		if(pImageLayer->ptDIBOff.y<0) pImageLayer->ptDIBOff.y=0;

		pImageLayer->SetScrollPos(SB_HORZ,(int)(pImageLayer->ptDIBOff.x*pImageLayer->m_Zoom+0.5),TRUE);
		pImageLayer->SetScrollPos(SB_VERT,(int)(pImageLayer->ptDIBOff.y*pImageLayer->m_Zoom+0.5),TRUE);

		PostMessage(WM_REDRAWDISPLAYRECT);

		pImageLayer->bpbmpChanged=TRUE;
		pImageLayer->PostMessage(WM_REDRAWVIEWRECT);

		//second 
		SetCapture();
		CursorStatus=NAVDLG_HAND_MOVE;
		::SetCursor(m_HandMove);
	}
	CDialog::OnLButtonDown(nFlags, point);
}

void CNavigationDialog::OnMouseMove(UINT nFlags, CPoint point) 
{
	if(	bActiveView == FALSE)
	{
		CDialog::OnMouseMove(nFlags, point);
		return ;
	}
	if(RedRect==DisplayRect)
	{
		CDialog::OnMouseMove(nFlags, point);
		return ;
	}

	if(CursorStatus==NAVDLG_HAND_MOVE)
	{
		if(nFlags && MK_LBUTTON)
		{
			::SetCursor(m_HandMove);
			//move smoothly
			CMYFUSIONView* pImageLayer = ((CMYFUSIONView *)((CMDIFrameWnd *)AfxGetApp()->
			m_pMainWnd)->MDIGetActive()->GetActiveView());
			CRect ViewClientRect;
			pImageLayer->GetClientRect(&ViewClientRect);

			CPoint NewScroll;
			pImageLayer->ptDIBOff.x = (int)((double) (point.x - ptOffRed.x -DisplayRect.left) / DisplayRect.Width() * DocSize.cx);
			pImageLayer->ptDIBOff.y = (int)((double) (point.y - ptOffRed.y -DisplayRect.top) / DisplayRect.Height() * DocSize.cy);

			//置于中间
			pImageLayer->ptDIBOff.x -= (int) ( (double)ViewClientRect.Width() / 2 / pImageLayer->m_Zoom + 0.5);  
			pImageLayer->ptDIBOff.y -= (int) ( (double)ViewClientRect.Height() / 2 / pImageLayer->m_Zoom + 0.5);  
			if((int)pImageLayer->Width - pImageLayer->ptDIBOff.x < (int) ( (double)ViewClientRect.Width() / pImageLayer->m_Zoom + 0.5))
				pImageLayer->ptDIBOff.x = pImageLayer->Width - (int) ( (double)ViewClientRect.Width() / pImageLayer->m_Zoom + 0.5);
			if((int)pImageLayer->Height - pImageLayer->ptDIBOff.y < (int) ( (double)ViewClientRect.Height() / pImageLayer->m_Zoom + 0.5))
				pImageLayer->ptDIBOff.y = pImageLayer->Height - (int) ( (double)ViewClientRect.Height() / pImageLayer->m_Zoom + 0.5);
			if(pImageLayer->ptDIBOff.x<0) pImageLayer->ptDIBOff.x=0;
			if(pImageLayer->ptDIBOff.y<0) pImageLayer->ptDIBOff.y=0;

			pImageLayer->SetScrollPos(SB_HORZ,(int)(pImageLayer->ptDIBOff.x*pImageLayer->m_Zoom+0.5),TRUE);
			pImageLayer->SetScrollPos(SB_VERT,(int)(pImageLayer->ptDIBOff.y*pImageLayer->m_Zoom+0.5),TRUE);

			PostMessage(WM_REDRAWDISPLAYRECT);

			pImageLayer->bpbmpChanged=TRUE;
			pImageLayer->PostMessage(WM_REDRAWVIEWRECT);
		}						
	}
	else
	{
		if(RedRect.PtInRect(point))
		{
			if(nFlags && MK_LBUTTON)
			{
				CursorStatus=NAVDLG_HAND_MOVE;
				::SetCursor(m_HandMove);
			}
			else
			{
				CursorStatus=NAVDLG_HAND_CATCH;
				::SetCursor(m_HandCatch);
			}
		}
		else if(DisplayRect.PtInRect(point))
		{
			CursorStatus=NAVDLG_HAND_POINT;
			::SetCursor(m_HandPoint);
		}
		else
		{
			CursorStatus=NAVDLG_DO_NOTHING;
			CDialog::OnMouseMove(nFlags, point);
		}
	}
	CDialog::OnMouseMove(nFlags, point);
}

void CNavigationDialog::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(	bActiveView == FALSE)
	{
		CDialog::OnLButtonUp(nFlags, point);
		return ;
	}

	if(CursorStatus==NAVDLG_HAND_MOVE)

⌨️ 快捷键说明

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