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

📄 navigationdialog.cpp

📁 影像融合与融合精度评价源码影像融合与融合精度评价源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// NavigationDialog.cpp : implementation file
//

#include "stdafx.h"
#include "MYFUSION.h"
#include "MainFrm.h"
#include "MYFUSIONDoc.h"
#include "MYFUSIONView.h"

#include "NavigationDialog.h"
#include "resource.h"
#include <math.h>
#include "BitMapDC.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/*
float SliderArray[]={0.2f,0.225f,0.25f,0.275f,0.3f,0.325f,0.35f,0.375f,
					 0.4f,0.425f,0.45f,0.475f,0.5f,0.525f,0.55f,0.575f,
					 0.6f,0.65f,0.7f,0.75f,0.8f,0.85f,0.9f,0.95f,
					 1.0f,1.05f,1.1f,1.15f,1.2f,1.25f,1.3f,1.35f,
					 1.4f,1.45f,1.5f,1.55f,1.6f,1.7f,1.8f,1.9f,
					 2.0f,2.5f,3.0f,3.5f,4.0f,4.5f,5.0f,5.5f,
					 6.0f,7.0f,8.0f,9.0f,10.0f,11.0f,12.0f,14.0f,
					 16.0f};   //57
*/
/////////////////////////////////////////////////////////////////////////////
// CNavigationDialog dialog


CNavigationDialog::CNavigationDialog(CWnd* pParent /*=NULL*/)
	: CDialog(CNavigationDialog::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNavigationDialog)
	m_scale_now = _T("");
	//}}AFX_DATA_INIT

	pbmp=NULL;
//	pbmp->CGdiObject->m_hObject=NULL;

	CursorStatus=NAVDLG_DO_NOTHING;
	m_HandPoint = AfxGetApp()->LoadCursor(IDC_HAND_POINT);
	m_HandMove  = AfxGetApp()->LoadCursor(IDC_HAND_MOVE);
	m_HandCatch = AfxGetApp()->LoadCursor(IDC_HAND_CATCH);
	bActiveView = FALSE;
	bEditChanged= FALSE;
}
CNavigationDialog::~CNavigationDialog()
{
	if(pbmp!=NULL)
		delete pbmp;
}
void CNavigationDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNavigationDialog)
	DDX_Control(pDX, IDC_SCALE_EDIT, m_ZoomEdit);
	DDX_Text(pDX, IDC_SCALE_EDIT, m_scale_now);
	DDX_Control(pDX, IDC_NAVIGATION_SLIDER, m_NavigationCtrl);
	//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNavigationDialog, CDialog)
	ON_WM_CONTEXTMENU()
	//{{AFX_MSG_MAP(CNavigationDialog)
	ON_WM_HSCROLL()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_SETCURSOR()
	ON_WM_LBUTTONUP()
	ON_EN_CHANGE(IDC_SCALE_EDIT, OnChangeScaleEdit)
	ON_WM_SIZE()
	ON_COMMAND(ID_DEFAULT_SIZE, OnDefaultSize)
	ON_COMMAND(ID_DEFAULT_LOCATION, OnDefaultLocation)
	ON_COMMAND(ID_HIDE_NAVDLG, OnHideNavdlg)
	ON_UPDATE_COMMAND_UI(ID_DEFAULT_SIZE, OnUpdateDefaultSize)
	ON_UPDATE_COMMAND_UI(ID_DEFAULT_LOCATION, OnUpdateDefaultLocation)
	ON_BN_CLICKED(IDC_NAV_ZOOMOUT, OnNavZoomout)
	ON_BN_CLICKED(IDC_NAV_ZOOMIN, OnNavZoomin)
	ON_BN_DOUBLECLICKED(IDC_NAV_ZOOMIN, OnDoubleclickedNavZoomin)
	ON_BN_DOUBLECLICKED(IDC_NAV_ZOOMOUT, OnDoubleclickedNavZoomout)
	ON_WM_DESTROY()
	ON_WM_CLOSE()
	ON_WM_PAINT()
	ON_WM_KEYDOWN()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_REDRAWDISPLAYRECT,RedrawDisplayRect)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNavigationDialog message handlers
void CNavigationDialog::OnPaint() 
{	
	CPaintDC dc(this); 
	CDC * pDC = GetDC();

	CRect clientRect;
	GetClientRect(&clientRect);
	CRect clrect = clientRect;

	//draw control
	m_ZoomEdit.MoveWindow(3,clientRect.bottom-24,55,15,TRUE);
	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);
	pDC->MoveTo(clientRect.left+3,clientRect.bottom-30);
	pDC->LineTo(clientRect.right-3,clientRect.bottom-30);

	CMDIFrameWnd * pAppFrame = (CMDIFrameWnd *) AfxGetApp()->m_pMainWnd;
	CMDIChildWnd * pChild=(CMDIChildWnd* )pAppFrame->MDIGetActive();
	//当没有图象显示时,应该控制不显示
	if(pChild == NULL)
	{
		bActiveView = FALSE;
		m_scale_now = _T("");
		m_ZoomEdit.EnableWindow(FALSE);
		m_NavigationCtrl.EnableWindow (FALSE);
		NavZoomOut.EnableWindow (FALSE);
		NavZoomIn .EnableWindow (FALSE);
		UpdateData(FALSE);
		return;
	}

	CMYFUSIONView * pImageLayer = (CMYFUSIONView *)(pChild->GetActiveView());	
	if(pImageLayer == NULL) 	return;
	CMYFUSIONDoc* pDoc=(CMYFUSIONDoc *)pImageLayer->GetDocument();
	if(pDoc == NULL) 	return;

	m_ZoomEdit.EnableWindow(TRUE);
	m_NavigationCtrl.EnableWindow (TRUE);

	//show rate
	bActiveView = TRUE;
	if(pImageLayer->m_Zoom <= 0.001f)
		NavZoomOut.EnableWindow (FALSE);
	else
		NavZoomOut.EnableWindow (TRUE);
	if(pImageLayer->m_Zoom >= 16.0f)
		NavZoomIn .EnableWindow (FALSE);
	else
		NavZoomIn .EnableWindow (TRUE);
	
	char buf[10];
	sprintf(buf,"%.2f%s",pImageLayer->m_Zoom * 100.0,"%");
	m_scale_now = buf;
	int CurSlider=int(sqrt(pImageLayer->m_Zoom)*25.0+0.5);
	//设置SLIDER
	m_NavigationCtrl.SetPos(CurSlider);
	UpdateData(FALSE);

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

	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);

	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();

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

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

	pbmp=bitmapDC.Close();

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

	//计算导航框
	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::RedrawDisplayRect()
{
	CDC * pDC = GetDC();

	CRect clientRect;
	GetClientRect(&clientRect);
	CRect clrect = clientRect;

	CMDIFrameWnd * pAppFrame = (CMDIFrameWnd *) AfxGetApp()->m_pMainWnd;
	CMDIChildWnd * pChild=(CMDIChildWnd* )pAppFrame->MDIGetActive();
	if(pChild == NULL)
	{
		if(bRedrawControl)
		{
			COLORREF bkColor=GetSysColor(COLOR_BTNFACE);
			pDC->FillSolidRect(clientRect,bkColor);
			//draw control
			m_ZoomEdit.MoveWindow(3,clientRect.bottom-24,55,15,TRUE);
			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;
		}

		bActiveView = FALSE;
		m_scale_now = _T("");
		m_ZoomEdit.EnableWindow(FALSE);
		m_NavigationCtrl.EnableWindow (FALSE);
		NavZoomOut.EnableWindow (FALSE);
		NavZoomIn .EnableWindow (FALSE);
		UpdateData(FALSE);
		COLORREF bkColor=GetSysColor(COLOR_BTNFACE);
		FillSolidRectUser( pDC, clientRect, CRect(0,0,0,0),bkColor);
		pDC->MoveTo(clientRect.left+3,clientRect.bottom-30);
		pDC->LineTo(clientRect.right-3,clientRect.bottom-30);
		return;
	}

	CMYFUSIONView * pImageLayer = (CMYFUSIONView *)(pChild->GetActiveView());	
	if(pImageLayer == NULL) 	return;
	CMYFUSIONDoc* pDoc=(CMYFUSIONDoc *)pImageLayer->GetDocument();
	if(pDoc == NULL) 	return;

	//show rate
	//show rate
	bActiveView = TRUE;
	if(pImageLayer->m_Zoom <= 0.001f)
		NavZoomOut.EnableWindow (FALSE);
	else
		NavZoomOut.EnableWindow (TRUE);
	if(pImageLayer->m_Zoom >= 16.0f)
		NavZoomIn .EnableWindow (FALSE);
	else
		NavZoomIn .EnableWindow (TRUE);
	m_ZoomEdit.EnableWindow(TRUE);
	m_NavigationCtrl.EnableWindow (TRUE);
	pDC->MoveTo(clientRect.left+3,clientRect.bottom-30);
	pDC->LineTo(clientRect.right-3,clientRect.bottom-30);

	char buf[10];
	sprintf(buf,"%.2f%s",pImageLayer->m_Zoom * 100.0,"%");
	m_scale_now = buf;
	int CurSlider=int(sqrt(pImageLayer->m_Zoom)*25.0+0.5);
	//设置SLIDER
	m_NavigationCtrl.SetPos(CurSlider);
	UpdateData(FALSE);

	if(bpbmpChanged)
	{
		if(bRedrawControl)
		{
			//draw control
			m_ZoomEdit.MoveWindow(3,clientRect.bottom-24,55,15,TRUE);

⌨️ 快捷键说明

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