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

📄 raderview.cpp

📁 可调节自适应滤波器-代码.rar
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// RaderView.cpp : implementation of the CRaderView class
//

#include "stdafx.h"
#include "Rader.h"
#include "MainFrm.h"
#include "RaderDoc.h"
#include "RaderView.h"
#include "Math.h"
#include "LFilterDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CRaderView

IMPLEMENT_DYNCREATE(CRaderView, CScrollView)

BEGIN_MESSAGE_MAP(CRaderView, CScrollView)
	//{{AFX_MSG_MAP(CRaderView)
	ON_COMMAND(ID_VIEW_WHOLEMAP, OnViewWholemap)
	ON_UPDATE_COMMAND_UI(ID_VIEW_WHOLEMAP, OnUpdateViewWholemap)
	ON_COMMAND(ID_SCROLLWINDOW, OnViewScrollWindow)
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_COMMAND(ID_LFILTER_TWO, OnLfilterTwo)
	ON_UPDATE_COMMAND_UI(ID_LFILTER_TWO, OnUpdateLfilterTwo)
	ON_WM_SIZE()
	ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
	ON_UPDATE_COMMAND_UI(ID_FILE_EXPORT, OnUpdateFileExport)
	ON_WM_SETCURSOR()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRaderView construction/destruction

CRaderView::CRaderView()
{
	m_pImageData = NULL;
	m_dwLeft = 0; m_dwTop = 0;
	m_dwWidth = 0; m_dwHeight = 0;
	m_pWholeMapDlg = NULL;
	m_pLeeDlg = NULL;
	m_bViewPosition = FALSE;
	m_bSized = FALSE;
	m_bExport = FALSE;
	m_bMouseDown = FALSE;
	m_ptMouseDown.x = -1;
	m_ptMouseDown.y = -1;

	m_pTemp = NULL;
	m_pTemp = new BYTE[ sizeof( BITMAPINFOHEADER ) + 256 * sizeof( RGBQUAD ) ] ;
	for(DWORD i = 0; i < 256; i++)
	{
		m_pTemp[i * sizeof( RGBQUAD ) + sizeof( BITMAPINFOHEADER )] = (BYTE)i;
		m_pTemp[i * sizeof( RGBQUAD ) + sizeof( BITMAPINFOHEADER ) + 1] = (BYTE)i;
		m_pTemp[i * sizeof( RGBQUAD ) + sizeof( BITMAPINFOHEADER ) + 2] = (BYTE)i;
		m_pTemp[i * sizeof( RGBQUAD ) + sizeof( BITMAPINFOHEADER ) + 3] = 0;
	}
	m_pBmi = ( LPBITMAPINFO )m_pTemp;
	m_pBmi->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
	m_pBmi->bmiHeader.biBitCount = 8;
	m_pBmi->bmiHeader.biPlanes = 1; 
	m_pBmi->bmiHeader.biCompression = 0; 
	m_pBmi->bmiHeader.biXPelsPerMeter = 0; 
	m_pBmi->bmiHeader.biYPelsPerMeter = 0; 
	m_pBmi->bmiHeader.biClrUsed = 0; 
	m_pBmi->bmiHeader.biClrImportant = 0; 

}

CRaderView::~CRaderView()
{
	if(m_pImageData != NULL)
		delete[] m_pImageData;
	if(m_pWholeMapDlg!=NULL)
	{
		m_pWholeMapDlg->DestroyWindow();
		delete m_pWholeMapDlg;
	}
	if(m_pLeeDlg != NULL)
	{
		m_pLeeDlg->DestroyWindow();
		delete m_pLeeDlg;
	}
	if(m_pTemp != NULL)
		delete[] m_pTemp;
}

BOOL CRaderView::PreCreateWindow(CREATESTRUCT& cs)
{
	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CRaderView drawing

void CRaderView::OnDraw(CDC* pDC)
{
	CRaderDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if(!pDoc->m_bHasReady)	return;
	ViewWindow(pDC);
	if(m_bSized)
	{
		if(m_pLeeDlg)
		{
			CRect rect0, rect;
			GetWindowRect(&rect0);
			m_pLeeDlg->GetWindowRect(&rect);
			m_pLeeDlg->SetWindowPos(NULL,
									rect.left,// + rect.Width() + 10,
									rect.top,//-23,
									rect0.Width() + 10,
									rect0.Height() + 150,
									SWP_NOZORDER);

			m_pLeeDlg->InvalidateDlg();
			m_bSized = FALSE;
		}
	}
}

void CRaderView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CRaderDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CSize sizeTotal;
	if(pDoc->m_bHasReady)
	{
		sizeTotal.cx = pDoc->m_dwWidth;
		sizeTotal.cy = pDoc->m_dwHeight;
	}
	else
		sizeTotal.cx = sizeTotal.cy = 0;

	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CRaderView diagnostics

#ifdef _DEBUG
void CRaderView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CRaderView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CRaderDoc* CRaderView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRaderDoc)));
	return (CRaderDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRaderView message handlers
BOOL CRaderView::ViewWindow(CDC* pDC)
{
	CRaderDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	//得到整个图象信息
	DWORD	dwImageWidth = pDoc->m_dwWidth;
	DWORD	dwImageHeight = pDoc->m_dwHeight;
	
	//获得视窗
	CRect	rectDraw, 
			rectImage(0, 0, dwImageWidth, dwImageHeight), 
			rectClient;
	GetClientRect(&rectClient);
	rectImage.NormalizeRect();
	CPoint point = GetDeviceScrollPosition();
	SIZE	size;
	size.cx = point.x;
	size.cy = point.y;
	rectClient += size;
	rectClient.NormalizeRect();
	if(FALSE == rectDraw.IntersectRect( rectImage, rectClient))
		return FALSE;
	rectDraw.NormalizeRect();
	if(rectDraw.Width() <=4)
		return FALSE;
	rectDraw.right = rectDraw.left + rectDraw.Width() / 4 * 4;
	rectDraw.bottom = rectDraw.top + rectDraw.Height();
	rectDraw.NormalizeRect();
	DWORD	dwViewLeft = rectDraw.left;
	DWORD	dwViewTop = rectDraw.top;
	DWORD	dwViewWidth = rectDraw.Width();
	DWORD	dwViewHeight = rectDraw.Height();
	
	//打开文件
	CFile	f;
	CFileException e;
	DWORD	i, j;
	if(!f.Open(pDoc->m_szFilePath,CFile::modeRead,&e))
	{
		AfxMessageBox("Cannot Open file!");
		return FALSE;
	}
	if(m_pImageData != NULL)
		delete[] m_pImageData;
	m_pImageData = new UNDATA[dwViewWidth * dwViewHeight];
	if(!m_pImageData)
	{
		AfxMessageBox("NULL Memory!",MB_ICONSTOP);
		f.Close();
		return FALSE;
	}
	UNDATA	dwTemp;
	UNDATA*	pData = new UNDATA[dwViewWidth];
	for(i = 0; i < dwViewHeight; i++)
	{
		f.Seek(((dwViewTop + i) * dwImageWidth + dwViewLeft) * sizeof(UNDATA), CFile::begin);
		VERIFY(f.Read(pData, dwViewWidth * sizeof(UNDATA)));
		for(j = 0; j < dwViewWidth; j++)
			m_pImageData[i * dwViewWidth + j] = pData[j];
		
	}
	f.Close();
	delete[] pData;
/*	
	BYTE color;
	for(i = 0; i < dwViewHeight; i++)
	{
		for(j = 0; j < dwViewWidth; j++)
		{
			dwTemp = (DWORD)(m_pImageData[j + i * dwViewWidth] / pow(2, 24)); 
			ASSERT(dwTemp < 256);
			color = (BYTE)dwTemp;
			pDC->SetPixel(	dwViewLeft + j, 
							dwViewTop + i,
							RGB(color,color,color));
		}
	}
	return TRUE;
*/
	int ret =0 ;
	m_pBmi->bmiHeader.biWidth = dwViewWidth;
	m_pBmi->bmiHeader.biHeight = dwViewHeight;
	m_pBmi->bmiHeader.biSizeImage = dwViewWidth * dwViewHeight * sizeof(UNDATA); 

	LPBYTE pImage = new BYTE[dwViewWidth * dwViewHeight];
	for(i = 0; i < dwViewHeight; i++)
		for(j = 0; j < dwViewWidth; j++)
		{
			if(sizeof(UNDATA) == sizeof(DWORD))
				dwTemp = (UNDATA)(m_pImageData[(dwViewHeight - 1 - i) * dwViewWidth + j] / pow(2, 24));//UNDATA 
			else if(sizeof(UNDATA) == sizeof(unsigned short))
				dwTemp = (UNDATA)(m_pImageData[(dwViewHeight - 1 - i) * dwViewWidth + j] / pow(2, 8));//UNDATA 
			else if(sizeof(UNDATA) == sizeof(BYTE))
				dwTemp = (UNDATA)(m_pImageData[(dwViewHeight - 1 - i) * dwViewWidth + j]);
			else
				ASSERT(FALSE);
			ASSERT(dwTemp < 256);
			pImage[i * dwViewWidth + j] = (BYTE)dwTemp;
		}
	ret = ::StretchDIBits(
			pDC->m_hDC,		// handle of device context 
			dwViewLeft,				// x-coordinate of upper-left corner of dest. rect. 
			dwViewTop,				// y-coordinate of upper-left corner of dest. rect. 
			dwViewWidth,//m_pBmi->bmiHeader.biWidth,	// width of destination rectangle 
			dwViewHeight,//m_pBmi->bmiHeader.biHeight,	// height of destination rectangle 
			0,				// x-coordinate of upper-left corner of source rect. 
			0,				// y-coordinate of upper-left corner of source rect. 
			dwViewWidth,//m_pBmi->bmiHeader.biWidth,	// width of source rectangle 
			dwViewHeight,//m_pBmi->bmiHeader.biHeight,	// height of source rectangle 
			pImage,	// address of bitmap data
			m_pBmi,	// address of bitmap bits 
			DIB_RGB_COLORS,	// usage 
			SRCCOPY			// raster operation code 				) ;
		);
	//delete[] m_pTemp;
	delete[] pImage;

	ASSERT(ret != 0);

	m_dwLeft = dwViewLeft;
	m_dwTop = dwViewTop;
	m_dwWidth = dwViewWidth;
	m_dwHeight = dwViewHeight;

	return TRUE;
}

void CRaderView::OnViewScrollWindow()
{
	if(!m_bViewPosition)
		return;
	//ScrollToPosition(CPoint(m_pWholeMapDlg->m_Rect.left,m_pWholeMapDlg->m_Rect.top));
	SetScrollPos(SB_HORZ, m_pWholeMapDlg->m_Rect.left, TRUE);
	SetScrollPos(SB_VERT, m_pWholeMapDlg->m_Rect.top, TRUE);
	CRect rectClient;
	GetClientRect(&rectClient);
	rectClient.NormalizeRect();
	CRect	rect(0,0,rectClient.Width(),rectClient.Height());

	m_bSized = TRUE;
	InvalidateRect(&rect, FALSE);
}

void CRaderView::OnViewWholemap() 
{
	if(m_bViewPosition)
	{
		m_pWholeMapDlg->DestroyWindow();
		delete m_pWholeMapDlg;
		m_pWholeMapDlg = NULL;
		m_bViewPosition = FALSE;
		return;
	}
	CRaderDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	m_pWholeMapDlg = new CWholeMapDialog(this);
	DWORD dwWidth = pDoc->m_dwWidth;
	DWORD dwHeight = pDoc->m_dwHeight;
	if(dwWidth>dwHeight)
	{
		m_pWholeMapDlg->m_dwThisWidth = 200;//128
		m_pWholeMapDlg->m_dwThisHeight = 200 * dwHeight/dwWidth; 
		//m_pWholeMapDlg->m_dwZoomOutRate = (DWORD)(dwWidth / 200);
	}
	else
	{
		m_pWholeMapDlg->m_dwThisHeight = 200;
		m_pWholeMapDlg->m_dwThisWidth = 200 * dwWidth/dwHeight; 
		//m_pWholeMapDlg->m_dwZoomOutRate = (DWORD)(dwWidth / 200);
	}
	
	float fRatio = (float)dwWidth/m_pWholeMapDlg->m_dwThisWidth;
	DWORD dwSampleCol;
	DWORD dwScanBytes;
	{
		dwSampleCol = m_pWholeMapDlg->m_dwThisWidth;//(m_pWholeMapDlg->m_dwThisWidth-3)/4*4;
		dwScanBytes = dwWidth;//(m_dwWidth-3)/4*4;
		for(int i=0;i<256;i++)
			m_pWholeMapDlg->m_pPal[i] = RGB(i, i, i);
	}

	//m_pWholeMapDlg->m_pDisplayData = (BYTE *)malloc(m_pWholeMapDlg->m_dwThisHeight*dwSampleCol);
	m_pWholeMapDlg->m_pDisplayData = new BYTE[m_pWholeMapDlg->m_dwThisHeight*dwSampleCol];
	
	if(m_pWholeMapDlg->m_pDisplayData==NULL)
		return;

	//开始重采样...
	ASSERT(pDoc->m_szFilePath != "");
	ASSERT(pDoc->m_bHasReady);

⌨️ 快捷键说明

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