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

📄 wgl_32view.cpp

📁 一个真正实用的应用程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// Wgl_32View.cpp : implementation file
//

#include "stdafx.h"
#include "wgl_32.h"
#include "Wgl_32View.h"
#include "prtgrp.h"
#include "PrtSlt.h"

#include "math.h"

#include "Recorder.h"
#include "Dialing.h"
#include "Trans.h"
#include "tty.h"
#include "DDCJ.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BOOL ReadDog(void);
extern CTTY MyTTY;
CDialing MMyDialing;
CTrans MyTrans;

IMPLEMENT_DYNCREATE(CWgl_32View, CView)//CScrollView

COLORREF LRGB = RGB(0,128,255);
COLORREF RRGB = RGB(255,128,64);

const COLORREF GlobalAxialColor[5] = 
{
	RGB(255,255,255), RGB(0, 0, 255),RGB(255, 0, 255),
	RGB(0,  255,255), RGB(128,128,0)
};

int intINT(double x)
{	return x<0.0 ? int(x-0.5) : int(x+0.5); }

/////////////////////////////////////////////////////////////////////////////
// CWgl_32View

CWgl_32View::CWgl_32View()
{
	AxialPen[0].CreatePen(PS_SOLID, 1, GlobalAxialColor[0]);
	AxialPen[1].CreatePen(PS_SOLID, 1, GlobalAxialColor[1]);
	AxialPen[2].CreatePen(PS_SOLID, 1, GlobalAxialColor[2]);
	AxialPen[3].CreatePen(PS_SOLID, 1, GlobalAxialColor[3]);
	AxialPen[4].CreatePen(PS_SOLID, 1, GlobalAxialColor[4]);

	LPen.CreatePen(PS_SOLID, 1, LRGB);
	RPen.CreatePen(PS_SOLID, 1, RRGB);

	ShortPen.CreatePen(PS_DASHDOT, 1, RRGB);

	PrintIndex = NULL;

	nRemaindCurve = 1;
	bZoomIn = bZoomOut = TRUE;

	bLButtonDown = FALSE;
	bCopyArea = FALSE;
	bVExpand = bVExpand = bXExpand = bEditYcursor = FALSE;
	bShortSeg = bMove = bCopyCurve = bDeleteCurve = FALSE;
	nSelectCurve = -1;
	HOldCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
	m_HHExpand = AfxGetApp()->LoadCursor(IDC_HEXPAND);
	m_HVExpand = AfxGetApp()->LoadCursor(IDC_VEXPAND);
	m_HBeforeMove = AfxGetApp()->LoadCursor(IDC_BEFORE_MOVE);
	m_HMoving = AfxGetApp()->LoadCursor(IDC_MOVING);
	m_HYValue = AfxGetApp()->LoadCursor(IDC_YVALUE);

	bCPUShortPrint = bCPUTotalPrint = bSelectTotalPrint = bSelectShortPrint = FALSE;
}

CWgl_32View::~CWgl_32View()
{
	bVExpand = FALSE;
	bXExpand = FALSE;
	bEditYcursor = FALSE;
	bVExpand = FALSE;
	bMove = FALSE;
	bShortSeg = FALSE;
	if(PrintIndex)
		delete[] PrintIndex;
}

BOOL CWgl_32View::PreCreateWindow(CREATESTRUCT& cs) 
{
	cs.lpszClass = 
		AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, 
		NULL, (HBRUSH)GetStockObject(BLACK_BRUSH));
	return CView::PreCreateWindow(cs);
}

int CWgl_32View::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)HOldCursor);
	return 0;
}

BOOL CWgl_32View::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	dwStyle = dwStyle | WS_HSCROLL | WS_VSCROLL;
	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

BEGIN_MESSAGE_MAP(CWgl_32View, CView)
	//{{AFX_MSG_MAP(CWgl_32View)
	ON_WM_SIZE()
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_UPDATE_COMMAND_UI(ID_EDIT_ZOOMIN, OnUpdateEditZoomin)
	ON_UPDATE_COMMAND_UI(ID_EDIT_ZOOMOUT, OnUpdateEditZoomout)
	ON_UPDATE_COMMAND_UI(ID_EDIT_MOVE, OnUpdateEditMove)
	ON_UPDATE_COMMAND_UI(ID_EDIT_XEXPAND, OnUpdateEditXexpand)
	ON_UPDATE_COMMAND_UI(ID_EDIT_YCURSOR, OnUpdateEditYcursor)
	ON_COMMAND(ID_EDIT_VEXPAND, OnEditVexpand)
	ON_COMMAND(ID_EDIT_XEXPAND, OnEditXexpand)
	ON_COMMAND(ID_EDIT_ZOOMIN, OnEditZoomin)
	ON_COMMAND(ID_EDIT_ZOOMOUT, OnEditZoomout)
	ON_COMMAND(ID_EDIT_MOVE, OnEditMove)
	ON_COMMAND(ID_EDIT_YCURSOR, OnEditYcursor)
	ON_COMMAND(ID_EDIT_RESTORE, OnEditRestore)
	ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
	ON_COMMAND(ID_FILE_PRINTSELECT, OnFilePrintselect)
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_TRANS_SEND, OnTransSend)
	ON_COMMAND(ID_ANALYSIS_SINGLE, OnAnalysisSingle)
	ON_COMMAND(ID_ANALYSIS_TOTAL, OnAnalysisTotal)
	ON_WM_DESTROY()
	ON_UPDATE_COMMAND_UI(ID_EDIT_VEXPAND, OnUpdateEditVexpand)
	ON_COMMAND(ID_SHORTSEG, OnShortseg)
	ON_UPDATE_COMMAND_UI(ID_SHORTSEG, OnUpdateShortseg)
	ON_COMMAND(ID_FILE_SELPRT, OnFileSelprt)
	ON_COMMAND(ID_EDIT_COPYCURVE, OnEditCopyCurve)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPYCURVE, OnUpdateEditCopyCurve)
	ON_COMMAND(ID_EDIT_DELETE, OnEditDelete)
	ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateEditDelete)
	ON_WM_CREATE()
	ON_COMMAND(ID_EDIT_COPYAREA, OnEditCopyArea)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPYAREA, OnUpdateEditCopyArea)
	ON_UPDATE_COMMAND_UI(ID_DELETE_SUBCURVE, OnUpdateDeleteSubCurve)
	ON_COMMAND(ID_DELETE_SUBCURVE, OnDeleteSubCurve)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, OnFilePrint)
	ON_COMMAND(ID_FILE_SHRTCPU, OnFileShrtCPU)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWgl_32View drawing

void CWgl_32View::OnInitialUpdate()
{
	CView::OnInitialUpdate();
	CRect rect;
	GetClientRect( &rect );
	SetResynScroll( rect.right, rect.bottom );
}

BOOL CWgl_32View::IsSpecRate(unsigned long xi,WORD m_NumRates,SampRates* m_pSampRates)
{
	for(WORD i=0; i<m_NumRates; i++)
		if(m_pSampRates[i].EndSampNum>=xi) break;
	if(m_pSampRates[i].SampRate==1.0 ||
		m_pSampRates[i].SampRate==10.0 ||
		m_pSampRates[i].SampRate==200.0)
		return TRUE;
	else 
		return FALSE;
}

CPen *CWgl_32View::SelectDrawAxialPen(CDC *pDC,double SampRate)
{
	if(SampRate==1000.0)
		return (CPen *)pDC->SelectObject(CPen::FromHandle(AxialPen[0]));
	if(SampRate==200.0)
		return (CPen *)pDC->SelectObject(CPen::FromHandle(AxialPen[1]));
	if(SampRate==10.0)
		return (CPen *)pDC->SelectObject(CPen::FromHandle(AxialPen[2]));
	if(SampRate==1.0)
		return (CPen *)pDC->SelectObject(CPen::FromHandle(AxialPen[3]));
	return (CPen *)pDC->SelectObject(CPen::FromHandle(AxialPen[4]));
}

CPen *CWgl_32View::SelectDrawAxialPen(CDC* pDC,SampRates* pSampRates,WORD m_NumRates,unsigned long lli)
{
	WORD wi=0;
	while(pSampRates[wi].EndSampNum<lli && wi<m_NumRates) wi++;
	return SelectDrawAxialPen(pDC,pSampRates[wi].SampRate);
}

void CWgl_32View::OnDraw(CDC* pDC)
{
	CWgl_32Doc* pDoc = GetDocument();
	if(pDoc->bReadError) return;
	Channel* m_pChannel=pDoc->m_pChannel;
	if(m_pChannel==NULL) return;

	WORD NumPerView=pDoc->m_NumPerView;
	WORD HalfCurveHeigh=pDoc->HalfCurveHeigh;
	WORD CurveHeigh = HalfCurveHeigh*2;

	CRect rect;
	GetClientRect( &rect );
	int xl=rect.left;
	int yt=rect.top;

	long **PSamplData = pDoc->PSamplData;
	double *SampleIndex = pDoc->SampleIndex;
	WORD m_ViewChannelMax = pDoc->m_ViewChannelMax;
	WORD m_ViewChannel=pDoc->m_ViewChannel;
	double m_XSizeFactor = pDoc->m_XSizeFactor;
	SampRates* m_pSampRates = pDoc->m_pSampRates;
	ChannelNumber *m_pChannelIndex = pDoc->m_pChannelIndex;
	WORD m_NumRates = pDoc->m_NumRates;
	unsigned long PageFromSampNum = pDoc->PageFromSampNum;
	unsigned long EndSampNum = pDoc->EndSampNum;
	int nWhichCurve = pDoc->nWhichCurve;
	ShortNode *pShortNode = pDoc->m_pShortNode;

	CPen *GOldPen=(CPen *)pDC->SelectObject(CPen::FromHandle(AxialPen[4]));
	pDC->MoveTo(xl,0);
	pDC->LineTo(xl+8,0);
	int xlstart = 0;
	while(pShortNode[xlstart].lend <= PageFromSampNum) 
		xlstart ++;
	xlstart--;
	BOOL bFirstDraw = TRUE;
	unsigned long lle,lli;
	int y,t,kl = 0;
	WORD wIndex = m_ViewChannel;
	CPen PenCurve;
	while(wIndex <= m_ViewChannelMax && kl < NumPerView)
	{
		int nSubIndex = -1;
		int nNumb = m_pChannelIndex[wIndex].nNumb;
		WORD* pSub = m_pChannelIndex[wIndex].pSub;
		WORD wChannel = m_pChannelIndex[wIndex].No;
		WORD wIndexOld = wIndex;
		t = HalfCurveHeigh+CurveHeigh*kl;
		do
		{
			lli = PageFromSampNum;
			int xcStart = 0;
			int xlstartA = xlstart;
			double xi,fy;
			int& ShortNodeNum=pDoc->ShortNodeNum;
			CPen *pDoPen;
			if(m_pChannel[wChannel].VAD >= 0)
			{
				PenCurve.CreatePen(PS_SOLID,1,m_pChannelIndex[wIndex].Color);
				pDoPen = (CPen *)pDC->SelectObject( &PenCurve );
			}
			else
				pDoPen = (CPen *)pDC->SelectStockObject(WHITE_PEN);
			while(xlstartA < ShortNodeNum)
			{
				BOOL bPrevHide = FALSE;
				while(xlstartA < ShortNodeNum && pShortNode[xlstartA].bShow==0)
				{
					bPrevHide = TRUE;
					int tw;
					if(lli == pShortNode[xlstartA].lend)
						tw = pDoc->ShortWidth;
					else
						tw = pDoc->ShortWidth/2;

					if(bFirstDraw)
					{
						CPen *pOldPen=(CPen *)pDC->SelectObject(CPen::FromHandle(ShortPen));
						pDC->MoveTo(xcStart, 0);
						pDC->LineTo(xcStart, rect.bottom);
						pDC->MoveTo(xcStart+tw, 0);
						pDC->LineTo(xcStart+tw, rect.bottom);
						pDC->SelectObject( pOldPen );
					}
					xcStart += tw;
					xlstartA++;
					lli = pShortNode[xlstartA].lend;
					if(xcStart >= rect.right)
						goto drawaxial;
				}
				if(xlstartA == ShortNodeNum)
					goto drawaxial;
				if(xcStart==0)
					bPrevHide=TRUE;
				xlstartA ++;
				if(xlstartA == ShortNodeNum)
					goto drawaxial;
				lle = pShortNode[xlstartA].lend;
				if(lle != EndSampNum) lle++;
				xi = xcStart;

				if(m_pChannel[wChannel].VAD >= 0)
				{
					double max,min;
					if(m_pChannel[wChannel].VAD == 0)
					{
						max = pDoc->maxA;
						min = pDoc->minA;
					}
					else
					{
						max = pDoc->maxV;
						min = pDoc->minV;
					}
					double mean = 0.0;//0.5*(max+min);
					double factor = max-min;
					factor = m_pChannelIndex[wIndex].YFactor*CurveHeigh/factor;
					double tempdbl = PSamplData[wChannel][lli];
					if(tempdbl == 999999) tempdbl = 0;
					fy = factor*(tempdbl-mean);
            
					if(IsSpecRate(lli,m_NumRates,m_pSampRates)) 
					{
						pDC->MoveTo(xcStart,intINT(t+fy));
						pDC->LineTo(xcStart,intINT(t-fy));
					}
					else
						if(bPrevHide)
							pDC->MoveTo(xcStart,intINT(t-fy));
						else
							pDC->LineTo(xcStart,intINT(t-fy));
					
					for(unsigned long tlli=lli+1; tlli < lle; tlli++)
					{
							xi = xi+m_XSizeFactor;
							double tempdbl = PSamplData[wChannel][tlli];
							if(tempdbl == 999999) tempdbl = 0;
							fy = factor*(tempdbl-mean);
							if(IsSpecRate(tlli,m_NumRates,m_pSampRates))
							{
								pDC->MoveTo(intINT(xi),intINT(t+fy));
								pDC->LineTo(intINT(xi),intINT(t-fy));
							}
							else
								pDC->LineTo(intINT(xi),intINT(t-fy));
							if(xi > rect.right)
								goto drawaxial;
					}
				} //if(m_pChannel[wChannel].VAD >= 0)
				else
				{
					double factor = 2.0;
					factor = m_pChannelIndex[wIndex].YFactor*HalfCurveHeigh/factor;
					double tempdbl = PSamplData[wChannel][lli];
					if(tempdbl == 999999) tempdbl = 0;
					fy = factor*tempdbl;
					
					if(bPrevHide)
						pDC->MoveTo(xcStart,intINT(t-fy));
					else
						pDC->LineTo(xcStart,intINT(t-fy));

					for(unsigned long tlli=lli+1; tlli < lle; tlli++)
					{
						xi = xi+m_XSizeFactor;
						tempdbl = PSamplData[wChannel][tlli];
						if(tempdbl == 999999) tempdbl = 0;
						fy = factor*tempdbl;
						pDC->LineTo(intINT(xi), intINT(t-fy));

						if(xi > rect.right)
							goto drawaxial;
					}
				}
drawaxial:
				if(nSubIndex<0)
				{
					double xxi = xcStart;
					pDC->MoveTo(xcStart,t);
					for(lli = lli+1; lli < lle; lli++)
					{
						xxi = xxi+m_XSizeFactor;
						CPen *Pen = SelectDrawAxialPen(pDC,m_pSampRates,m_NumRates,lli);
						pDC->LineTo(intINT(xxi),t);
						pDC->SelectObject( Pen );
						if(xxi > rect.right)	break;
					}
					pDC->MoveTo(intINT(xi),intINT(t-fy));
				} // end if(nSubIndex<0)
				lli = pShortNode[xlstartA].lend;
				xcStart = intINT(xi);
			} // end while(xlstartA < ShortNodeNum)
			pDC->SelectObject( pDoPen );
			PenCurve.DeleteObject();
			nSubIndex++;
			if( pSub )
			{
				wChannel = pSub[nSubIndex];
				wIndex = GetCurveNumberIndex(wChannel);
			}
		} while(nSubIndex < nNumb);
		pDC->SelectObject(CPen::FromHandle(AxialPen[4]));
		pDC->MoveTo(xl,t+HalfCurveHeigh);
		pDC->LineTo(xl+8,t+HalfCurveHeigh);
		bFirstDraw = FALSE;
		wIndex = wIndexOld;
		wIndex++;
		while(wIndex < m_ViewChannelMax && m_pChannelIndex[wIndex].bShow==0)
			wIndex++;
		kl++;		
	} // end of draw display curve
	kl = 0;
	wIndex = m_ViewChannel;
	int DrawMode = pDC->SetROP2(R2_XORPEN);
	if(nWhichCurve>0) // draw y cursor two lines
		while(wIndex <= m_ViewChannelMax && kl < NumPerView)
		{
			if(m_pChannelIndex[wIndex].bShow==0)
			{
				wIndex++;
				continue;
			}
			wIndex++; kl++;
			WORD wChannel=m_pChannelIndex[wIndex].No;
			if(nWhichCurve==wChannel && m_pChannelIndex[wIndex].bShow)
			{
				t = HalfCurveHeigh+CurveHeigh*(wIndex-m_ViewChannel);
				double max,min;
				if(m_pChannel[wChannel].VAD==0)
				{
					max = pDoc->maxA;
					min = pDoc->minA;
				}
				else
				{
					max = pDoc->maxV;
					min = pDoc->minV;
				}
				double mean = 0.0;//0.5*(max+min);
				double factor = max-min;
				factor=m_pChannelIndex[wChannel].YFactor*CurveHeigh/factor;
				pDC->SelectObject(CPen::FromHandle(LPen));
				double fy = factor*(pDoc->LCursorA-mean);
				pDC->MoveTo(0, intINT(t-fy));
				pDC->LineTo(rect.right, intINT(t-fy));
				fy = factor*(pDoc->RCursorA-mean);
				pDC->SelectObject(CPen::FromHandle(RPen));
				pDC->MoveTo(0, intINT(t-fy));
				pDC->LineTo(rect.right, intINT(t-fy));
			}
		}
	lle = pDoc->LCursor;
	if(lle >= PageFromSampNum && lle <= lli)
	{
		pDC->SelectObject(CPen::FromHandle(LPen));
		pDoc->GetHNumPosit(xlstart,lle);
		pDC->MoveTo(xlstart, 0);
		pDC->LineTo(xlstart, rect.bottom);
	}
	lle = pDoc->RCursor;
	if(lle >= PageFromSampNum && lle <= lli)
	{
		pDoc->GetHNumPosit(xlstart,lle);
		pDC->SelectObject(CPen::FromHandle(RPen));
		pDC->MoveTo(xlstart, 0);
		pDC->LineTo(xlstart, rect.bottom);
	}
	if(nSelectCurve>=0)
	{		
		y = GetCurveDisplayIndex(nSelectCurve);

⌨️ 快捷键说明

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