📄 gmgsanalysewnd.cpp
字号:
// GmgsAnalyseWnd.cpp : implementation file
//
#include "stdafx.h"
#include "WellDataProcess.h"
#include "GmgsAnalyseWnd.h"
#include "GlobalData.h"
#include "MessageDlg.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGmgsAnalyseWnd
CGmgsAnalyseWnd::CGmgsAnalyseWnd()
{
g_pAnalyseWnd = this;
m_bLeftDown = FALSE;
m_bMove = FALSE;
m_bDrag = FALSE;
m_bInterpret = FALSE;
m_bHaveData = FALSE;
m_bContinue = FALSE;
m_nInterpretIndex = 0;
m_nMeanMethod = 0;
m_nInterpretMode = INTERPRET_NULL;
}
CGmgsAnalyseWnd::~CGmgsAnalyseWnd()
{
}
BEGIN_MESSAGE_MAP(CGmgsAnalyseWnd, CWndEx)
//{{AFX_MSG_MAP(CGmgsAnalyseWnd)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_KEYDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_SETCURSOR()
ON_WM_SYSKEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGmgsAnalyseWnd message handlers
int CGmgsAnalyseWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
void CGmgsAnalyseWnd::OnDestroy()
{
CWndEx::OnDestroy();
// TODO: Add your message handler code here
}
BOOL CGmgsAnalyseWnd::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return CWndEx::OnEraseBkgnd(pDC);
}
void CGmgsAnalyseWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
int nMode = 0;
if(m_bInterpret && m_nInterpretMode == INTERPRET_FINE)
{
int i;
int nPos;
int nIndex = -1;
int nCount = m_arrMeanLine.GetSize();
for(i = 0; i < nCount; i ++)
{
if(m_arrMeanLine[i]->m_bSelect)
{
nIndex = i;
nMode = 1;
}
}
nCount = m_arrRectLine.GetSize();
for(i = 0; i < nCount; i ++)
{
if(m_arrRectLine[i]->m_bSelect)
{
nIndex = i;
nMode = 2;
}
}
if(nIndex >= 0 && nMode != 0)
{
switch(nChar)
{
case VK_LEFT:
{
if(nMode == 1)
{
m_arrIntLayer[nIndex]->SetMeanValue(m_arrIntLayer[nIndex]->GetMeanValue() -0.5f);
int nXPos = m_arrCurve[0]->GetXPosition(m_arrIntLayer[nIndex]->GetMeanValue());
m_arrMeanLine[nIndex]->SetXPos(nXPos);
}
if(nMode == 2)
{
nPos = m_arrRectLine[nIndex]->m_pRect1->GetBottomPosition();
m_arrRectLine[nIndex]->m_pRect1->SetBottomPosition(nPos - 2);
nPos = m_arrRectLine[nIndex]->m_pRect2->GetTopPosition();
m_arrRectLine[nIndex]->m_pRect2->SetTopPosition(nPos - 2);
m_arrRectLine[nIndex]->Offset(0, -2);
ReLoadInterpretMeanLineData();
}
}
break;
case VK_RIGHT:
{
if(nMode == 1)
{
m_arrIntLayer[nIndex]->SetMeanValue(m_arrIntLayer[nIndex]->GetMeanValue() +0.5f);
int nXPos = m_arrCurve[0]->GetXPosition(m_arrIntLayer[nIndex]->GetMeanValue());
m_arrMeanLine[nIndex]->SetXPos(nXPos);
}
if(nMode == 2)
{
nPos = m_arrRectLine[nIndex]->m_pRect1->GetBottomPosition();
m_arrRectLine[nIndex]->m_pRect1->SetBottomPosition(nPos + 2);
nPos = m_arrRectLine[nIndex]->m_pRect2->GetTopPosition();
m_arrRectLine[nIndex]->m_pRect2->SetTopPosition(nPos + 2);
m_arrRectLine[nIndex]->Offset(0, 2);
ReLoadInterpretMeanLineData();
}
}
break;
case VK_UP:
{
if(nMode == 1)
{
m_arrIntLayer[nIndex]->SetMeanValue(m_arrIntLayer[nIndex]->GetMeanValue() - 2.0f);
int nXPos = m_arrCurve[0]->GetXPosition(m_arrIntLayer[nIndex]->GetMeanValue());
m_arrMeanLine[nIndex]->SetXPos(nXPos);
}
if(nMode == 2)
{
nPos = m_arrRectLine[nIndex]->m_pRect1->GetBottomPosition();
m_arrRectLine[nIndex]->m_pRect1->SetBottomPosition(nPos - 6);
nPos = m_arrRectLine[nIndex]->m_pRect2->GetTopPosition();
m_arrRectLine[nIndex]->m_pRect2->SetTopPosition(nPos - 6);
m_arrRectLine[nIndex]->Offset(0, -6);
ReLoadInterpretMeanLineData();
}
}
break;
case VK_DOWN:
{
if(nMode == 1)
{
m_arrIntLayer[nIndex]->SetMeanValue(m_arrIntLayer[nIndex]->GetMeanValue() +2.0f);
int nXPos = m_arrCurve[0]->GetXPosition(m_arrIntLayer[nIndex]->GetMeanValue());
m_arrMeanLine[nIndex]->SetXPos(nXPos);
}
if(nMode == 2)
{
nPos = m_arrRectLine[nIndex]->m_pRect1->GetBottomPosition();
m_arrRectLine[nIndex]->m_pRect1->SetBottomPosition(nPos + 6);
nPos = m_arrRectLine[nIndex]->m_pRect2->GetTopPosition();
m_arrRectLine[nIndex]->m_pRect2->SetTopPosition(nPos + 6);
m_arrRectLine[nIndex]->Offset(0, 6);
ReLoadInterpretMeanLineData();
}
}
break;
default:
break;
}
}
Plot();
ReDraw();
}
this->SetFocus();
CWndEx::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CGmgsAnalyseWnd::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
this->SetFocus();
switch(m_nInterpretMode)
{
case INTERPRET_NULL:
{
m_arrButtom.HitTest(point);
m_arrCurve.HitTest(point);
}
break;
case INTERPRET_COARSE:
{
m_interpretLine.HitTest(point);
}
break;
case INTERPRET_FINE:
{
m_arrCurve[0]->HitTest(point);
m_arrOrgLayer.HitTest(point);
m_arrIntLayer.HitTest(point);
m_arrRectLine.HitTest(point);
m_arrMeanLine.HitTest(point);
}
break;
default:
break;
}
Plot();
ReDraw();
CWndEx::OnLButtonDblClk(nFlags, point);
}
void CGmgsAnalyseWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bInterpret)
{
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
int nIndex = pFrame->m_meanComboBox.GetCurSel();
this->SetMeanCalculateMothed(nIndex);
m_bLeftDown = TRUE;
m_bMove = FALSE;
m_ptOrg = point;
m_ptPrev = point;
if(m_nInterpretIndex == 0)
{
m_ptInterpretOrg.x = point.x;
m_ptInterpretOrg.y = m_arrRoad[0]->GetRoadHeadHeight() + 10;
}
else
{
m_ptInterpretOrg.x = point.x;
m_ptInterpretOrg.y = m_ptInterpretPrev.y;
}
}
CWndEx::OnLButtonDown(nFlags, point);
}
void CGmgsAnalyseWnd::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bLeftDown = FALSE;
m_bMove = FALSE;
if(m_bDrag && m_arrCurve[0]->m_bSelect)
{
CRoadUnit* pRoadUnit = m_arrRoad.HitTest(point);
if(pRoadUnit)
m_arrCurve[0]->SetRoad(pRoadUnit);
m_bDrag = FALSE;
}
if(m_bInterpret && m_bDrag)
{
switch(m_nInterpretMode)
{
case INTERPRET_NULL:
break;
case INTERPRET_COARSE:
{
COLORREF color;
m_ptPrev = point;
m_ptInterpretPrev = point;
int nHeight = m_arrRoad[0]->GetRoadHeight();
if(m_ptInterpretPrev.y > nHeight)
m_ptInterpretPrev.y = nHeight;
m_bDrag = FALSE;
m_nInterpretIndex ++; // 解释层位的索引
if(m_ptPrev.y < m_ptOrg.y)
{
m_ptInterpretOrg = m_interpretLine.GetPointSecond();
m_ptInterpretPrev = m_ptInterpretOrg;
return;
}
float depthStart = m_arrCurve[0]->GetDepth(m_ptOrg.y);
float depthEnd = m_arrCurve[0]->GetDepth(m_ptPrev.y);
float fMeanValue = m_arrCurve[0]->GetMeanValue(depthStart, depthEnd, m_nMeanMethod);
int nPos = m_arrCurve[0]->GetXPosition(fMeanValue);
int nColorIndex = m_arrCurve[0]->GetColorIndex(fMeanValue);
color = m_arrColor[0]->GetIndexColor(nColorIndex);
m_arrIntLayer.AddLayerRect(color, fMeanValue, CRect(450, m_ptInterpretOrg.y, 470, m_ptInterpretPrev.y));
m_arrMeanLine.AddMeanLineUnit(color, fMeanValue, m_ptInterpretOrg.y, m_ptInterpretPrev.y, nPos);
ReAddLayerLine(); // 生成层位间的数据线
m_interpretLine.SetPoint(CPoint(110, m_ptInterpretPrev.y), CPoint(410, m_ptInterpretPrev.y));
m_interpretLine.SetRoad(m_arrRoad[2]);
}
break;
case INTERPRET_FINE:
break;
default:
break;
}
m_arrIntLayer.SetRoad(m_arrRoad[5]);
Plot();
ReDraw();
}
CWndEx::OnLButtonUp(nFlags, point);
}
void CGmgsAnalyseWnd::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString strMsg;
if(m_bInterpret)
{
float depth = m_arrCurve[0]->GetDepth(point.y);
strMsg.Format ("井深度值:%8.3f", depth);
OnMsg(strMsg);
}
m_bMove = TRUE;
if(m_bLeftDown && m_bMove)
{
m_bDrag = TRUE;
}
else
{
m_bDrag = FALSE;
}
CWndEx::OnMouseMove(nFlags, point);
}
void CGmgsAnalyseWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
ReDraw();
// Do not call CWndEx::OnPaint() for painting messages
}
void CGmgsAnalyseWnd::OnSize(UINT nType, int cx, int cy)
{
CWndEx::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
void CGmgsAnalyseWnd::ReDraw()
{
CDC *pDC = GetDC();
CRect rect;
pDC->GetClipBox (rect);
pDC->BitBlt (rect.left,rect.top,rect.Width(),rect.Height(),&m_memDC,rect.left,rect.top,SRCCOPY);
ReleaseDC(pDC);
}
void CGmgsAnalyseWnd::ReadData()
{
m_arrRoad.AddRoadUnit(80, 2400, 50, CPoint(10, 10), "深度");
m_arrRoad.AddRoadUnit(80, 2400, 80, CPoint(60, 10), "地质层位");
m_arrRoad.AddRoadUnit(80, 2400, 100, CPoint(140, 10), "");
m_arrRoad.AddRoadUnit(80, 2400, 100, CPoint(240, 10), "");
m_arrRoad.AddRoadUnit(80, 2400, 100, CPoint(340, 10), "");
m_arrRoad.AddRoadUnit(80, 2400, 80, CPoint(440, 10), "解释层位");
m_arrRoad.AddRoadUnit(80, 2400, 80, CPoint(520, 10), "反演层位");
/* 增加按钮控件 */
m_arrButtom.AddButtomRect(RGB(0, 0, 0), CRect(10, 10, 20 ,20), "自然电位");
m_arrButtom.AddButtomRect(RGB(0, 0, 0), CRect(10, 10, 20 ,20), "密度");
m_arrButtom.AddButtomRect(RGB(0, 0, 0), CRect(10, 10, 20 ,20), "电阻率");
m_arrButtom[0]->SetRoad(m_arrRoad[2]);
m_arrButtom[1]->SetRoad(m_arrRoad[3]);
m_arrButtom[2]->SetRoad(m_arrRoad[4]);
m_arrOrgLayer.AddLayerRect(COR_RED, 123.0f, CRect(50, 90, 70, 140));
m_arrOrgLayer.AddLayerRect(COR_GREEN, 123.0f, CRect(50, 140, 70, 230));
m_arrOrgLayer.AddLayerRect(COR_GRAY, 123.0f, CRect(50, 230, 70, 240));
m_arrOrgLayer.AddLayerRect(COR_BLUE, 123.0f, CRect(50, 240, 70, 340));
m_arrOrgLayer.AddLayerRect(COR_YELLOW, 123.0f, CRect(50, 340, 70, 370));
m_arrOrgLayer.SetRoad(m_arrRoad[1]);
m_interpretLine.SetIsDraw(FALSE);
m_interpretLine.SetLineColor(COR_RED);
m_interpretLine.SetLineStyle(PS_SOLID);
m_interpretLine.SetLineWidth(2);
m_interpretLine.SetPoint(CPoint(110, 90), CPoint(410, 90));
m_interpretLine.SetRoad(m_arrRoad[2]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -