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