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

📄 wshmview.cpp

📁 提供交互的方式选取合适的震相
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// wshmView.cpp : implementation of the CWshmView class
//

#include "stdafx.h"
#include "wshm.h"

#include <math.h>

#include "wshmDoc.h"
#include "wshmView.h"

#include "../spliTest/spliTest.h"
#include "../SacIO/SacIO.h"
#include "DlgSKSinfo.h"

#include <list>
#include <string>
#include <algorithm>

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

// define the tool constant

#define ID_TOOLS_NULL 0 //没有选中工具
#define ID_TOOLS_MAGNIFY 1 //选中了放大工具
#define ID_TOOLS_MARK_SKS 2 //选中标记SKS震相范围工具

/////////////////////////////////////////////////////////////////////////////
// CWshmView

IMPLEMENT_DYNCREATE(CWshmView, CView)

BEGIN_MESSAGE_MAP(CWshmView, CView)
	//{{AFX_MSG_MAP(CWshmView)
	ON_COMMAND(ID_TOOL_VERTICAL_MAGNIFY, OnToolVerticalMagnify)
	ON_COMMAND(ID_TOOL_VERTICAL_MINIFY, OnToolVerticalMinify)
	ON_COMMAND(ID_TOOL_MARK_IASP91, OnToolMarkIasp91)
	ON_WM_LBUTTONUP()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_UPDATE_COMMAND_UI(ID_TOOL_MARK_IASP91, OnUpdateToolMarkIasp91)
	ON_COMMAND(ID_TOOL_HORIZONTAL_STEP_ADD, OnToolHorizontalStepAdd)
	ON_COMMAND(ID_TOOL_HORIZONTAL_STEP_MINUS, OnToolHorizontalStepMinus)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_TOOL_MAGNIFY, OnToolMagnify)
	ON_UPDATE_COMMAND_UI(ID_TOOL_MAGNIFY, OnUpdateToolMagnify)
	ON_COMMAND(ID_TOOL_SHOW_E, OnToolShowE)
	ON_UPDATE_COMMAND_UI(ID_TOOL_SHOW_E, OnUpdateToolShowE)
	ON_COMMAND(ID_TOOL_SHOW_N, OnToolShowN)
	ON_UPDATE_COMMAND_UI(ID_TOOL_SHOW_N, OnUpdateToolShowN)
	ON_COMMAND(ID_TOOL_SHOW_Z, OnToolShowZ)
	ON_UPDATE_COMMAND_UI(ID_TOOL_SHOW_Z, OnUpdateToolShowZ)
	ON_COMMAND(ID_TOOL_MODE_EVENT, OnToolModeEvent)
	ON_UPDATE_COMMAND_UI(ID_TOOL_MODE_EVENT, OnUpdateToolModeEvent)
	ON_COMMAND(ID_TOOL_MODE_FILE, OnToolModeFile)
	ON_UPDATE_COMMAND_UI(ID_TOOL_MODE_FILE, OnUpdateToolModeFile)
	ON_COMMAND(ID_TOOL_SELECT_SKS, OnToolSelectSks)
	ON_UPDATE_COMMAND_UI(ID_TOOL_SELECT_SKS, OnUpdateToolSelectSks)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_WM_VSCROLL()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWshmView construction/destruction
using namespace std;

CWshmView::CWshmView() : m_bCalcIASP91(false), m_bMouseDown(false), 
	m_cDeflateRect(20,2,5,0), m_bFirstDraw(true), m_selFileIndex(0), 
	m_bDrawFileIndex(0), m_curTool(ID_TOOLS_NULL), 
	m_ShowOption(eShowE | eShowN | eShowZ | eShowFile), 
	m_pDlgSKSinfo(NULL)
	
{
	skslog = fopen("sks.log","wt");
	
	ASSERT( NULL != skslog );

}

CWshmView::~CWshmView()
{
	if( NULL != skslog )
		fclose(skslog);

	m_lsShow.clear();
}

BOOL CWshmView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CWshmView drawing

void CWshmView::OnDraw(CDC* pDC)
{
	CWshmDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if( !m_lsShow.size() )
		return;

	list<CFileDataHolder *>::const_iterator iter = m_lsShow.begin();
	CRect drawRc;
	int bottom;
	long index = 0;
	CRgn Rgn;

	GetDrawRect(drawRc);
	bottom = drawRc.bottom;
	Rgn.CreateRectRgnIndirect(&drawRc);
	drawRc.bottom = drawRc.top + CFileDataHolder::m_singleProfileHeight;

	while( iter != m_lsShow.end() ) {
		if( index++ >= m_bDrawFileIndex ) {
			if( m_bCalcIASP91 )
				((CSacFile*)*iter)->CalcIASP91(); // ensure the iasp91 time is calculated

			pDC->IntersectClipRect(drawRc);
			((CSacFile*)*iter)->Draw( *pDC, drawRc, m_bCalcIASP91 );
			if( drawRc.bottom > bottom )
				break;
			drawRc.top = drawRc.bottom;
			drawRc.bottom += CFileDataHolder::m_singleProfileHeight;
			pDC->SelectClipRgn(&Rgn);
		}
		++iter;

	}
}

/////////////////////////////////////////////////////////////////////////////
// CWshmView printing

BOOL CWshmView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CWshmView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CWshmView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CWshmView diagnostics

#ifdef _DEBUG
void CWshmView::AssertValid() const
{
	CView::AssertValid();
}

void CWshmView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CWshmDoc* CWshmView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWshmDoc)));
	return (CWshmDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CWshmView message handlers

void CWshmView::OnToolVerticalMagnify() 
{
	if( m_lsShow.size() ) {
		((CSacFile *)*(m_lsShow.begin()))->MagnifyVertScale();
		Invalidate();
	}
}

void CWshmView::OnToolVerticalMinify() 
{
	if( m_lsShow.size() ) {
		((CSacFile*)*(m_lsShow.begin()))->MinifyVertScale();
	
		Invalidate();	
	}
}

void CWshmView::OnToolMarkIasp91() 
{
	m_bCalcIASP91 = !m_bCalcIASP91;

	list<CFileDataHolder *>::const_iterator iter = m_lsShow.begin();
	CRect drawRc;
	int bottom;

	GetClientRect(drawRc);
	bottom = ceil( drawRc.Height()/CFileDataHolder::m_singleProfileHeight );
	
	BeginWaitCursor();
	while( iter != m_lsShow.end() ) {
		((CSacFile*)*iter)->CalcIASP91();
		if( --bottom < 0)
			break;
		++iter;
	}
	EndWaitCursor();

	Invalidate();
}

void CWshmView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CSacFile * pSelSac = GetSelSacFile();
	if( NULL != pSelSac ) {
		CRect drawRc;

		GetDrawRect(drawRc);

		if( ID_TOOLS_NULL == m_curTool ) {

			ReleaseCapture();

			if( !m_bFirstDraw ) {
				// erase the drawing
				CDC * pDC = GetDC();
				CPoint pt;
				CPen pen;

				pen.CreatePen( PS_DOT, 1, RGB( 0xff, 0xff, 0xff ) );
				pDC->SelectObject(&pen);
				int oldROP2 = pDC->SetROP2(R2_XORPEN);

				pt.x = m_ptMouseDown.x;
				pt.y = m_iDrawMoveVPos;
				pDC->MoveTo(pt);
				pt.x = m_ptOldMouseMove.x;
				pDC->LineTo(pt);
				if( m_ptOldMouseMove.x > m_ptMouseDown.x ) {
					pDC->MoveTo(pt.x - 5, pt.y + 5);
					pDC->LineTo(pt);
					pDC->LineTo(pt.x - 5, pt.y - 5);
				}
				else {
					pDC->MoveTo(pt.x + 5, pt.y + 5);
					pDC->LineTo(pt);
					pDC->LineTo(pt.x + 5, pt.y - 5);
				}
				
				pDC->SetROP2( oldROP2 );
				ReleaseDC(pDC);
			}

			// move the drawing data
			pSelSac->MouseMoveHoriz( m_ptOldMouseMove.x - m_ptMouseDown.x );
			
			
			drawRc.top = m_iDrawMoveVPos-floor(CFileDataHolder::m_singleProfileHeight/2);
			drawRc.bottom = drawRc.top + 2*CFileDataHolder::m_singleProfileHeight;
			drawRc.InflateRect(1,1,1,1);

			InvalidateRect(drawRc);

		}
		else if( ID_TOOLS_MAGNIFY == m_curTool ) {
			ReleaseCapture();
			CRect wRc( point.x, point.y, m_ptMouseDown.x, m_ptMouseDown.y);

			wRc.NormalizeRect();
			if( wRc.Height() > 2 && wRc.Width() > 2 ) {
				pSelSac->Magnify2Window( wRc, drawRc );

				Invalidate();
			}
		}
		else if( ID_TOOLS_MARK_SKS == m_curTool ) {
			ReleaseCapture();
			CRect wRc( point.x, point.y, m_ptMouseDown.x, m_ptMouseDown.y);

			wRc.NormalizeRect();
			if( wRc.Height() > 2 && wRc.Width() > 2 ) {
				// test the split parameter
				CalcCurSKSparam(point);

			}
			//Invalidate();
		}

		m_bMouseDown = false;
		m_bFirstDraw = true;
	}

	CView::OnLButtonUp(nFlags, point);

}

void CWshmView::OnLButtonDown(UINT nFlags, CPoint point) 
{

	CSacFile * pSelSac = GetSelSacFile();
	if( NULL != pSelSac ) {

		if( ID_TOOLS_MARK_SKS == m_curTool )
			Invalidate();// erase last draw
		
		CalcMouseAtFileIndex( point );
	
		if( ID_TOOLS_NULL == m_curTool || 
			( ID_TOOLS_MAGNIFY == m_curTool ) || 
			ID_TOOLS_MARK_SKS == m_curTool ) {
			SetCapture();
		
		}

		m_bMouseDown = true;
		m_ptMouseDown = point;
	}
	

	CView::OnLButtonDown(nFlags, point);
}

void CWshmView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CSacFile * pSelSac = GetSelSacFile();

	if(NULL != pSelSac) {
		CDC * pDC = GetDC();
		CPoint pt;
		CPen pen, *pOldPen;
		int nOldBkMode;

		pen.CreatePen(PS_SOLID, 1, RGB( 0xff, 0xff, 0xff ) );
		pOldPen = pDC->SelectObject(&pen);
		nOldBkMode = pDC->SetBkMode( TRANSPARENT );

		if(m_bMouseDown  ) {

			int oldROP2 = pDC->SetROP2(R2_XORPEN);
			if( !m_bFirstDraw ) {
				// erase the original drawing
				if( ID_TOOLS_NULL == m_curTool ) {
					pt.x = m_ptMouseDown.x;
					pt.y = m_iDrawMoveVPos;
					pDC->MoveTo(pt);
					pt.x = m_ptOldMouseMove.x;
					pDC->LineTo(pt);
					if(abs(m_ptOldMouseMove.x - m_ptMouseDown.x) > 2){
					if( m_ptOldMouseMove.x > m_ptMouseDown.x ) {
						pDC->MoveTo(pt.x - 5, pt.y + 5);
						pDC->LineTo(pt);
						pDC->LineTo(pt.x - 5, pt.y - 5);
					}
					else {
						pDC->MoveTo(pt.x + 5, pt.y + 5);
						pDC->LineTo(pt);
						pDC->LineTo(pt.x + 5, pt.y - 5);
					}}
				}
				else if( ID_TOOLS_MAGNIFY == m_curTool ) {
					// 当前工具,放大
					//pDC->MoveTo(m_ptMouseDown.x, m_ptMouseDown.y);
					pDC->Rectangle( m_ptMouseDown.x, m_ptMouseDown.y, m_ptOldMouseMove.x, m_ptOldMouseMove.y );
					//pDC->LineTo(m_ptOldMouseMove.x,;
				}
				else if( ID_TOOLS_MARK_SKS == m_curTool ) {
					// 当前工具,选择SKS震相范围
					pDC->Rectangle( m_ptMouseDown.x, m_iDrawMoveVPos - CFileDataHolder::m_singleProfileHeight/2, 
						m_ptOldMouseMove.x, m_iDrawMoveVPos + CFileDataHolder::m_singleProfileHeight/2 );
				}
			}
			m_bFirstDraw = false;

			// draw out
			if( ID_TOOLS_NULL == m_curTool ) {
				pt.x = m_ptMouseDown.x;
				pDC->MoveTo(pt);
				pt.x = point.x;
				pDC->LineTo(pt);
				if(abs(point.x - m_ptMouseDown.x) > 2){
				if( point.x > m_ptMouseDown.x ) {
					pDC->MoveTo(pt.x - 5, pt.y + 5);
					pDC->LineTo(pt);
					pDC->LineTo(pt.x - 5, pt.y - 5);
				}
				else {
					pDC->MoveTo(pt.x + 5, pt.y + 5);
					pDC->LineTo(pt);
					pDC->LineTo(pt.x + 5, pt.y - 5);
				}}
			}
			else if( ID_TOOLS_MAGNIFY == m_curTool ) {
				// 当前工具,放大
				pDC->Rectangle( m_ptMouseDown.x, m_ptMouseDown.y, point.x, point.y );
			}
			else if( ID_TOOLS_MARK_SKS == m_curTool ) {
				// 当前工具,选择SKS震相范围
				pDC->Rectangle( m_ptMouseDown.x, m_iDrawMoveVPos - CFileDataHolder::m_singleProfileHeight/2, 
					point.x, m_iDrawMoveVPos + CFileDataHolder::m_singleProfileHeight/2 );
			}

			pDC->SetROP2( oldROP2 );
		}

		m_ptOldMouseMove = point;
		pDC->SetBkMode(nOldBkMode);
		pDC->SelectObject(pOldPen);
		ReleaseDC(pDC);
	}

	CView::OnMouseMove(nFlags, point);
}

void CWshmView::OnUpdateToolMarkIasp91(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bCalcIASP91);	
}

void CWshmView::OnToolHorizontalStepAdd() 
{
	if( m_lsShow.size() ) {
		((CSacFile*)*(m_lsShow.begin()))->MagnifyHorizScale();
	
		Invalidate();
	}
}

void CWshmView::OnToolHorizontalStepMinus() 
{
	if( m_lsShow.size() ) {
		((CSacFile*)*(m_lsShow.begin()))->MinifyHorizScale();
	
		Invalidate();
	}
}


void CWshmView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	CWshmDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if( pDoc->m_lsDataHolder.size() ) {

		CMenu Menu, *pPopMenu;

		Menu.LoadMenu(IDR_MENU_DATAFILE);
		pPopMenu = Menu.GetSubMenu(0);// 获取MFC菜单资源中的第一个弹出菜单

		VERIFY(  pPopMenu );
		
		CSacFile * pSelSac = GetSelSacFile();
		
		if( NULL != pSelSac && pSelSac->GetIASP91map().size() ) {
			// have data loaded
			long iIndex = m_selFileIndex;
			VERIFY( iIndex >= 0 );

			std::map<float, std::string>::iterator iterIASP = pSelSac->GetIASP91map().begin();
			int i=0;
			CMenu PhaseMenu;

			PhaseMenu.CreatePopupMenu();
			while( iterIASP != pSelSac->GetIASP91map().end() ) {
				PhaseMenu.AppendMenu( MF_STRING, ID_MENU_DATAFILE_PHASE + i++, (*iterIASP).second.c_str() );
				++iterIASP;
			}
			// insert the popup menuitem and attach the PhaseMenu to it
			pPopMenu->InsertMenu( 0, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)PhaseMenu.GetSafeHmenu(), 
				"Goto Phase");

		}
		if( ShowEvent() ) {
			CMenu EventMenu;
			int i = 0;
			int nCheckPos = 0;

			EventMenu.CreatePopupMenu();
			vector<std::string>::const_iterator iter = pDoc->m_vecEventNm.begin();
			while( iter != pDoc->m_vecEventNm.end() ) {
				EventMenu.AppendMenu( MF_STRING, ID_MENU_DATAFILE_EVENT + i++, (*iter).c_str() );
				if( !(*iter).compare(m_strCurEvt) )
					nCheckPos = ID_MENU_DATAFILE_EVENT + i-1;
				++iter;
			}
			EventMenu.CheckMenuItem(nCheckPos, MF_BYCOMMAND | MF_CHECKED);

			// insert the popup menuitem and attach the EventMenu to it
			pPopMenu->InsertMenu( 1, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)EventMenu.GetSafeHmenu(), 
				"Show Event");
		}

		pPopMenu->TrackPopupMenu(TPM_LEFTALIGN, 
			point.x,
			point.y,
			this);

		Menu.DestroyMenu();

		ScreenToClient(&point);
		CalcMouseAtFileIndex( point );
	}
}

BOOL CWshmView::OnCommand(WPARAM wParam, LPARAM lParam) 
{
	CWshmDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if( ID_MENU_DATAFILE_RESET == LOWORD(wParam) ) {
		// 复位横向和纵向比例因子
		if( pDoc->m_lsDataHolder.size() ) {
			( (CSacFile*) * pDoc->m_lsDataHolder.begin() )->ResetScale();

			Invalidate();
		}
	}
	else if( ID_MENU_DATAFILE_HIDETHIS == LOWORD(wParam) ) {
		// 隐藏选中的图形
		CSacFile * pSelSac = GetSelSacFile();

⌨️ 快捷键说明

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