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

📄 ana_32view.cpp

📁 一个用C++写的电力系统故障录波数据管理系统
💻 CPP
字号:
// Ana_32View.cpp : implementation file
//

#include "stdafx.h"
#include "wgl_32.h"
#include "wgl_32doc.h"
#include "Ana_32View.h"

#include "math.h"

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


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


/////////////////////////////////////////////////////////////////////////////
// CAna_32View

IMPLEMENT_DYNCREATE(CAna_32View, CScrollView)

CAna_32View::CAna_32View()
{
  m_HalfCurveHeigh = 55;
  N=20;
  n=7;
  scrolly=0;
  memset(C, 0x00, sizeof(C));
  memset(A, 0x00, sizeof(A));
  memset(B, 0x00, sizeof(B));
  memset(Value, 0x00, sizeof(Value));
  memset(alpha, 0x00, sizeof(alpha));

  LOGBRUSH lb;
  FrontColor[0] = FrontColor[4] = RGB(255,255,0);
  FrontColor[1] = FrontColor[5] = RGB(0,  255,0);
  FrontColor[2] = FrontColor[6] = RGB(255,0,  0);
  FrontColor[3] = FrontColor[7] = RGB(255,255,255);

  for(int i=0; i<8;i++)
     {
	   lb.lbStyle = BS_SOLID;
	   lb.lbColor = FrontColor[i];
       FrontBrush[i].CreateBrushIndirect(&lb);
      
	   lb.lbColor = RGB(192,192,128);
       lb.lbStyle = BS_SOLID;
       TopBrush[i].CreateBrushIndirect(&lb);

       lb.lbStyle = BS_SOLID;
       lb.lbColor = RGB(128,128,192);
       LeftBrush[i].CreateBrushIndirect(&lb);
	}
 NewPen.CreatePen(PS_SOLID, 1, RGB(255,255,255));   
}

CAna_32View::~CAna_32View()
{
 for(int i=0; i<8;i++)
     {
       FrontBrush[i].DeleteObject();
       TopBrush[i].DeleteObject();
       LeftBrush[i].DeleteObject();
	}
  NewPen.DeleteObject();
}


BEGIN_MESSAGE_MAP(CAna_32View, CScrollView)
	//{{AFX_MSG_MAP(CAna_32View)
	ON_WM_VSCROLL()
	ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAna_32View drawing


void CAna_32View::OnDraw(CDC* pDC)
{

    CWgl_32Doc* pDoc = GetDocument();

	if(pDoc->m_FaultLineNo == -1)
	  { pDC->TextOut(100,100, "无故障线路!"); return; }
	if(pDoc->AnaError)
		{ pDC->TextOut(100,80, "无法正确取得故障线路的数据!"); return; }
	FFT();     
	char StrTemp[100];
    CRect rect;
	GetClientRect( &rect );
	WORD CurveHeigh = m_HalfCurveHeigh*2;

	int xl = rect.left+10;
	int xr = rect.right;
	int yt = rect.top-20;
	int yb = rect.bottom;
	int Heigth, i,j;
    
	OldPen = pDC->SelectObject(&NewPen);
	pDC->MoveTo(xl, yt);
	pDC->LineTo(xl, yt+9*CurveHeigh-scrolly);
    OldBrush = pDC->SelectObject( &FrontBrush[0] );
	
    double Max1=0,Max2=0;

	for( i =0; i<4;i++)
	      if(Max1 <  C[i][1])Max1 =  C[i][1];
	for(  i =4; i<8;i++)
	      if(Max2 <  C[i][1])Max2 =  C[i][1];
 
   pDC->SetBkColor(RGB(64,128,128));

	for(i =0; i<8; i++)
	   {
	
		pDC->MoveTo(xl, yt+(i+1)*CurveHeigh-scrolly);
		pDC->LineTo(xl+550, yt+(i+1)*CurveHeigh-scrolly);

		pDC->SetTextColor(FrontColor[i]);
		if(pDoc->m_strFaultLineName[i].GetLength()==0)continue;
		pDC->TextOut(xl+550+30, yt+(i+1)*CurveHeigh-scrolly-10, pDoc->m_strFaultLineName[i]);
		for(j=0; j<n+1;j++)
		   {
		    if(i<4)
			   Heigth =  (int)(C[i][j]*(CurveHeigh-60)/Max1);
			else 
			   Heigth =  (int)(C[i][j]*(CurveHeigh-60)/Max2);

			int dx =5,dy=4;
            pDC->MoveTo(40+xl+j*60,        yt+(i+1)*CurveHeigh-Heigth-scrolly);
			pDC->LineTo(40+xl+j*60+dx,     yt+(i+1)*CurveHeigh-Heigth-dy-scrolly);
            pDC->LineTo(40+xl+j*60+30+dx,  yt+(i+1)*CurveHeigh-Heigth-dy-scrolly);
			pDC->LineTo(40+xl+j*60+30,     yt+(i+1)*CurveHeigh-Heigth-scrolly);
			pDC->LineTo(40+xl+j*60,        yt+(i+1)*CurveHeigh-Heigth-scrolly);
			pDC->MoveTo(40+xl+j*60+30+dx,  yt+(i+1)*CurveHeigh-Heigth-dy-scrolly);
			pDC->LineTo(40+xl+j*60+30+dx,  yt+(i+1)*CurveHeigh-dy-scrolly);
            pDC->LineTo(40+xl+j*60+30,  yt+(i+1)*CurveHeigh-scrolly);
            
			pDC->SelectObject(&TopBrush[i]);
			pDC->FloodFill(40+xl+j*60+25, yt+(i+1)*CurveHeigh-Heigth-3-scrolly, RGB(255,255,255));
			pDC->SelectObject(&FrontBrush[i]);
            pDC->Rectangle(40+xl+j*60, yt+(i+1)*CurveHeigh-Heigth-scrolly, 
			               40+xl+j*60+30, yt+(i+1)*CurveHeigh-scrolly); 
			if(Heigth > 4 )
			   {
                pDC->SelectObject(&LeftBrush[i]);
			    pDC->FloodFill(40+xl+j*60+30+dx/2, yt+(i+1)*CurveHeigh - scrolly - dy/2-1, RGB(255,255,255));
				}

            double percent = (C[i][j]/C[i][1])*100.0;
			StrTemp[120];

			pDC->SetTextColor(RGB(255,255,255));            
			sprintf(StrTemp, "%3.1lf", C[i][j]);
		    pDC->TextOut(40+xl+j*60, yt+(i+1)*CurveHeigh+2-scrolly, StrTemp);
			
            if(percent == 100)
			 sprintf(StrTemp, "%3.0lf", percent);
			else
			 sprintf(StrTemp, "%3.1lf", percent);

			pDC->TextOut(40+xl+j*60, 16+yt+(i+1)*CurveHeigh+2-scrolly, StrTemp);
		    if(j>0)
			 {
			  sprintf(StrTemp, "%3.1lf", alpha[i][j]*180/3.1415925);
			  pDC->TextOut(40+xl+j*60, 32+yt+(i+1)*CurveHeigh+2-scrolly, StrTemp);
             }
           }
		pDC->TextOut(40+xl+((int)n+1)*60, yt+(i+1)*CurveHeigh+2-scrolly,    "幅值( V )");
		pDC->TextOut(40+xl+((int)n+1)*60, 18+yt+(i+1)*CurveHeigh+2-scrolly, "比值( % )");
		pDC->TextOut(40+xl+((int)n+1)*60, 36+yt+(i+1)*CurveHeigh+2-scrolly, "相角( °)");

	  }
    
    CFont FontN, FontB, *OldFont;
    FontN.CreatePointFont(200, "Times New Roman");//Times New Roman
    FontB.CreatePointFont(100, "Times New Roman");//Arial

	pDC->SetBkMode(OPAQUE);
	OldFont = pDC->SelectObject(&FontN);
	pDC->SetTextColor(RGB(192,192,192));
	for(i =0; i<8 ;i ++)
	   {
	    pDC->SelectObject(&FontN);
	    sprintf(StrTemp, "%d", i);
	    pDC->TextOut(40+xl+i*62, rect.top, StrTemp);
		pDC->SelectObject(&FontB);
        pDC->TextOut(55+xl+i*62, rect.top+15, "nd");
	   }

	pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(0,255,255));
	for(i =0; i<8 ;i ++)
	   {
	    pDC->SelectObject(&FontN);
	    sprintf(StrTemp, "%d", i);
	    pDC->TextOut(40+xl+i*62-2, rect.top+2, StrTemp);
		pDC->SelectObject(&FontB);
        pDC->TextOut(55+xl+i*62-1, rect.top+16, "nd");
	   }
    pDC->SetBkMode(OPAQUE);

	pDC->SelectObject( OldBrush);
	pDC->SelectObject( OldFont);
	FontN.DeleteObject();
    FontB.DeleteObject();
    pDC->SelectObject(OldPen);
    

}

/////////////////////////////////////////////////////////////////////////////
// CAna_32View diagnostics

#ifdef _DEBUG
void CAna_32View::AssertValid() const
{
	CScrollView::AssertValid();
}

void CAna_32View::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}
#endif //_DEBUG


/////////////////////////////////////////////////////////////////////////////
// CAna_32View message handlers

void CAna_32View::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CScrollView::OnEndPrinting(pDC, pInfo);
}

void CAna_32View::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CScrollView::OnBeginPrinting(pDC, pInfo);
}

BOOL CAna_32View::OnPreparePrinting(CPrintInfo* pInfo) 
{
	pInfo->SetMaxPage(1);
	return DoPreparePrinting(pInfo);
}

void CAna_32View::FFT(void)
{
  int i,  k;
  UINT j;
  CWgl_32Doc* pDoc = GetDocument();
  for(i=0;i<8;i++)
     for(j=0;j<=pDoc->FFTPoints;j++)
         Value[i][j] = pDoc->Value[i][j];

  double Segma;
  double PI=3.1415926;
  j=0;
  for(j=0; j<8; j++)
  {
    alpha[j][0]=0.0;
    for(i=0; i<=n; i++)
      {
	   Segma = 0.0;
	   for(k=0; k<=N; k++)
	      Segma +=  Value[j][k]*sin(2*PI*k*i/N);
	   A[j][i] = 2*Segma/N;

	   Segma = 0.0;
	  for(k=1; k<=N-1; k++)
	     Segma +=  Value[j][k]*cos(2*PI*k*i/N);
      B[j][i] =  (Value[j][0] + Value[j][(int)N]+2*Segma)/N ;

	  C[j][i] = (double )sqrt(A[j][i]*A[j][i] + B[j][i]*B[j][i]);

	  if(i>=1)alpha[j][i] = atan(B[j][i]/A[j][i]);
	  if(j==1 || j==5)alpha[j][i] -= 120/180*PI;
	  if(j==2 || j==6)alpha[j][i] -= 240/180*PI;
	  }
	 }
 
}

BOOL CAna_32View::PreCreateWindow(CREATESTRUCT& cs) 
{
    CBrush NewBrush;
    LOGBRUSH lb;
    lb.lbStyle = BS_SOLID;
    lb.lbColor = RGB(64,128,128);
    
    NewBrush.CreateBrushIndirect(&lb);
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, 
		AfxGetApp()->LoadStandardCursor(IDC_ARROW), NewBrush);
	NewBrush.DeleteObject();
	return CScrollView::PreCreateWindow(cs);	
}

void CAna_32View::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	CWgl_32Doc * pDoc;
	pDoc = (CWgl_32Doc *)GetDocument();
	pDoc->UpdateAllViews(NULL);
	CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}


void CAna_32View::OnInitialUpdate() 
{
	CScrollView::OnInitialUpdate();
	CSize sizeTotal;
	sizeTotal.cx = 800;
	sizeTotal.cy = 1000;
	CSize sizePage = CSize(sizeTotal.cx, sizeTotal.cy/2);
	CSize sizeLine = CSize(sizeTotal.cx/100, sizeTotal.cy/100);
	SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine);
}

void CAna_32View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
	CScrollView::OnPrepareDC(pDC, pInfo);
     if(pDC->IsPrinting())
		pDC->SetMapMode(MM_LOENGLISH);
	else
		pDC->SetMapMode(MM_TEXT);
}

void CAna_32View::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
{
	
    CWgl_32Doc* pDoc = GetDocument();
	
	if(pDoc->AnaError)
		{ pDC->TextOut(100,-80, "无法正确取得故障线路的数据!"); return; }
	
	if(pDoc->m_FaultLineNo == -1)
	  { pDC->TextOut(100, -100, "无故障线路!"); return; }
	
	FFT();     
	char StrTemp[100];
    CRect rect;
	GetClientRect( &rect );
	WORD CurveHeigh = m_HalfCurveHeigh*2;

	int xl = rect.left+10;
	int xr = rect.right;
	int yt = rect.top-20;
	int yb = rect.bottom;
	int Heigth, i,j;
    
	//OldPen = pDC->SelectObject(&NewPen);
	pDC->MoveTo(xl, -yt);
	pDC->LineTo(xl, -(yt+9*CurveHeigh-scrolly));
    //OldBrush = pDC->SelectObject( &FrontBrush[0] );
	
    double Max1=0,Max2=0;

	for( i =0; i<4;i++)
	      if(Max1 <  C[i][1])Max1 =  C[i][1];
	for(  i =4; i<8;i++)
	      if(Max2 <  C[i][1])Max2 =  C[i][1];
 
   //pDC->SetBkColor(RGB(64,128,128));

	for(i =0; i<8; i++)
	   {
	
		pDC->MoveTo(xl, -(yt+(i+1)*CurveHeigh-scrolly));
		pDC->LineTo(xl+550, -(yt+(i+1)*CurveHeigh-scrolly));

		//pDC->SetTextColor(FrontColor[i]);
		if(pDoc->m_strFaultLineName[i].GetLength()==0)continue;
		pDC->TextOut(xl+550+30, -(yt+(i+1)*CurveHeigh-scrolly-10), pDoc->m_strFaultLineName[i]);
		for(j=0; j<n+1;j++)
		   {
		    if(i<4)
			   Heigth =  (int)(C[i][j]*(CurveHeigh-60)/Max1);
			else 
			   Heigth =  (int)(C[i][j]*(CurveHeigh-60)/Max2);

			int dx =5,dy=4;
            pDC->MoveTo(40+xl+j*60,        -(yt+(i+1)*CurveHeigh-Heigth-scrolly));
			pDC->LineTo(40+xl+j*60+dx,     -(yt+(i+1)*CurveHeigh-Heigth-dy-scrolly));
            pDC->LineTo(40+xl+j*60+30+dx,  -(yt+(i+1)*CurveHeigh-Heigth-dy-scrolly));
			pDC->LineTo(40+xl+j*60+30,     -(yt+(i+1)*CurveHeigh-Heigth-scrolly));
			pDC->LineTo(40+xl+j*60,        -(yt+(i+1)*CurveHeigh-Heigth-scrolly));
			pDC->MoveTo(40+xl+j*60+30+dx,  -(yt+(i+1)*CurveHeigh-Heigth-dy-scrolly));
			pDC->LineTo(40+xl+j*60+30+dx,  -(yt+(i+1)*CurveHeigh-dy-scrolly));
            pDC->LineTo(40+xl+j*60+30,     -(yt+(i+1)*CurveHeigh-scrolly));
            
		//	pDC->SelectObject(&TopBrush[i]);
			pDC->FloodFill(40+xl+j*60+25, -(yt+(i+1)*CurveHeigh-Heigth-3-scrolly), RGB(0,0,0));
		//	pDC->SelectObject(&FrontBrush[i]);
            pDC->Rectangle(40+xl+j*60, -(yt+(i+1)*CurveHeigh-Heigth-scrolly), 
			               40+xl+j*60+30, -(yt+(i+1)*CurveHeigh-scrolly)); 
			if(Heigth > 4 )
			   {
          //      pDC->SelectObject(&LeftBrush[i]);
			    pDC->FloodFill(40+xl+j*60+30+dx/2, -(yt+(i+1)*CurveHeigh - scrolly - dy/2-1), RGB(0,0,0));
				}

            double percent = (C[i][j]/C[i][1])*100.0;
			StrTemp[120];

			//pDC->SetTextColor(RGB(255,255,255));            
			sprintf(StrTemp, "%3.1lf", C[i][j]);
		    pDC->TextOut(40+xl+j*60, -(yt+(i+1)*CurveHeigh+2-scrolly), StrTemp);
			
            if(percent == 100)
			 sprintf(StrTemp, "%3.0lf", percent);
			else
			 sprintf(StrTemp, "%3.1lf", percent);

			pDC->TextOut(40+xl+j*60, -(16+yt+(i+1)*CurveHeigh+2-scrolly), StrTemp);
		    if(j>0)
			 {
			  sprintf(StrTemp, "%3.1lf", alpha[i][j]*180/3.1415925);
			  pDC->TextOut(40+xl+j*60, -(32+yt+(i+1)*CurveHeigh+2-scrolly), StrTemp);
             }
           }
		pDC->TextOut(40+xl+((int)n+1)*60, -(yt+(i+1)*CurveHeigh+2-scrolly), "幅值");
		pDC->TextOut(40+xl+((int)n+1)*60, -(16+yt+(i+1)*CurveHeigh+2-scrolly), "比值");
		pDC->TextOut(40+xl+((int)n+1)*60, -(32+yt+(i+1)*CurveHeigh+2-scrolly), "相角");

	  }
    
    CFont FontN, FontB, *OldFont;
    FontN.CreatePointFont(200, "Times New Roman");//Times New Roman
    FontB.CreatePointFont(100, "Times New Roman");//Arial

	pDC->SetBkMode(OPAQUE);
	OldFont = pDC->SelectObject(&FontN);
	//pDC->SetTextColor(RGB(192,192,192));
	for(i =0; i<8 ;i ++)
	   {
	    pDC->SelectObject(&FontN);
	    sprintf(StrTemp, "%d", i);
	    pDC->TextOut(40+xl+i*62, -rect.top, StrTemp);
		pDC->SelectObject(&FontB);
        pDC->TextOut(55+xl+i*62, -(rect.top+15), "nd");
	   }

	pDC->SetBkMode(TRANSPARENT);
    //pDC->SetTextColor(RGB(0,255,255));
	for(i =0; i<8 ;i ++)
	   {
	    pDC->SelectObject(&FontN);
	    sprintf(StrTemp, "%d", i);
	    pDC->TextOut(40+xl+i*62-2, -(rect.top+2), StrTemp);
		pDC->SelectObject(&FontB);
        pDC->TextOut(55+xl+i*62-1, -(rect.top+16), "nd");
	   }
    pDC->SetBkMode(OPAQUE);

	//pDC->SelectObject( OldBrush);
	//pDC->SelectObject( OldFont);
	FontN.DeleteObject();
    FontB.DeleteObject();
    //pDC->SelectObject(OldPen);
}

void CAna_32View::OnFilePrint() 
{
  CScrollView::OnFilePrint();	
}

void CAna_32View::OnFilePrintPreview() 
{
	CScrollView::OnFilePrintPreview();	
}

⌨️ 快捷键说明

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