📄 ana_32view.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 + -