📄 raderview.cpp
字号:
// 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 + -