📄 fft_projectview.cpp
字号:
// FFT_PROJECTView.cpp : implementation of the CFFT_PROJECTView class
//
#include "stdafx.h"
#include "FFT_PROJECT.h"
#include "string.h"
#include "FFT_PROJECTDoc.h"
#include "FFT_PROJECTView.h"
#include "math.h"
#include "FttSetting.h"
//#define M 4
#include "MainFrm.h"
#include "Comsetting.h"
#include "Show.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int change(int a,int b);
/////////////////////////////////////////////////////////////////////////////
// CFFT_PROJECTView
IMPLEMENT_DYNCREATE(CFFT_PROJECTView, CScrollView)
BEGIN_MESSAGE_MAP(CFFT_PROJECTView, CScrollView)
//{{AFX_MSG_MAP(CFFT_PROJECTView)
ON_COMMAND(ID_COM1, OnCom1)
ON_COMMAND(ID_COM2, OnCom2)
ON_COMMAND(ID_ASII, OnAsii)
ON_COMMAND(ID_BIT, OnBit)
ON_COMMAND(ID_TRANSLATE, OnTranslate)
ON_WM_TIMER()
ON_COMMAND(ID_FFTSTART, OnFftstart)
ON_COMMAND(ID_FFTSETTING, OnFftsetting)
ON_COMMAND(ID_SHOWSETTINGS, OnShowsettings)
ON_COMMAND(ID_COM_SETTING, OnComSetting)
ON_UPDATE_COMMAND_UI(ID_ASII, OnUpdateAsii)
ON_UPDATE_COMMAND_UI(ID_BIT, OnUpdateBit)
ON_UPDATE_COMMAND_UI(ID_COM1, OnUpdateCom1)
ON_UPDATE_COMMAND_UI(ID_COM2, OnUpdateCom2)
ON_COMMAND(ID_BLUE, OnBlue)
ON_COMMAND(ID_SHEEPBLUE, OnSheepblue)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFFT_PROJECTView construction/destruction
CFFT_PROJECTView::CFFT_PROJECTView()
{
// TODO: add construction code here
pdlg=NULL;
psdlg=NULL;
}
CFFT_PROJECTView::~CFFT_PROJECTView()
{delete pdlg;
delete psdlg;
}
BOOL CFFT_PROJECTView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFFT_PROJECTView drawing
void CFFT_PROJECTView::OnDraw(CDC* pDC)
{
CFFT_PROJECTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CString str;
int i,temp0;
float max; // FFT变换后的最大值存放变量;
int k=0;
pDC->SetTextColor(RGB(0,255,0));// 字体的颜色
/*for(i=0;i<8;i++)
{str.Format("%f",pDoc->newarray[i].x);
pDC->TextOut(100,50*i,str);
}*/
//pDoc->nFttFinshed=true;
COLORREF crColor;
switch(pDoc->colorset)
{case 0 : crColor=RGB(0,0,0);
break;
case 1 : crColor=RGB(50,50,130);
break;
default : crColor=RGB(0,0,225);
}
CBrush brush(crColor),*oldbrush;
CPen pen;
if(pDoc->nFttFinshed&&pDoc->nShowFtt) // 标志是否传入数据;
{
/*for( i=0;i<pDoc->nCount;i++)
{str.Format("%f",pDoc->origindata[i]);
pDC->TextOut(100,60+20*i,str);}*/
temp0=pDoc->nFttLength; //看是否为新的变换
if(!pDoc->newchang)
pDoc->nFttLength=pDoc->prenFttLength;
//CBrush brush(RGB(0,0,0)); // 背景色
pDC->SetTextColor(RGB(0,255,0));// 字体的颜色
oldbrush=(CBrush*)pDC->SelectObject(&brush); // 把画刷选入
pDC->Rectangle(0,0,30800,1200); // 设背景;
pDC->SetBkColor(crColor); // 设文本的字体以便和背景色一致;
pen.CreatePen(PS_SOLID,2,RGB(0,255,0)); // 坐标的画笔
pDC->SelectObject(&pen); // 画笔选入;
pDC->MoveTo(50,450); // 画Y轴;
pDC->LineTo(50,100);
pDC->MoveTo(45,445); // 画X轴;
pDC->LineTo((pDoc->nFttLength+3)*30,445);
pDC->MoveTo(40,110); //画Y轴的箭头;
pDC->LineTo(50,100);
pDC->MoveTo(60,110);
pDC->LineTo(50,100);
/* for(i=1;i<=N;i++)
{ pDC->MoveTo(50+30*i,270);
pDC->LineTo(50+30*i,265);
str.Format("%d",i);
pDC->TextOut(50+30*i,285,str);
}
for(i=0;i<=5;i++)
{ pDC->MoveTo(50,270-30*i);
pDC->LineTo(55,270-30*i);
str.Format("%d",i);
pDC->TextOut(15,260-30*i,str);
}
pen.DeleteObject();
pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
pDC->SelectObject(&pen);
for(i=0;i<N;i++)
{pDC->MoveTo(50+30*i,270-2);
pDC->LineTo(50+30*i,270-(int)((pDoc->array[i].y)*30));
}*/
pDC->TextOut(60,110,"|x(K)|");
pDC->MoveTo((pDoc->nFttLength+3)*30-10,435);
pDC->LineTo((pDoc->nFttLength+3)*30,445);
pDC->MoveTo((pDoc->nFttLength+3)*30-10,455);
pDC->LineTo((pDoc->nFttLength+3)*30,445);
for(i=1;i<=pDoc->nFttLength;i++) //标X轴的刻度;
{ pDC->MoveTo(50+pDoc->nShowrate*i,445);
pDC->LineTo(50+pDoc->nShowrate*i,440);
str.Format("%d",i);
//if(i%5==0)
switch (pDoc->nShowrate)
{case 30 : pDC->TextOut(50+pDoc->nShowrate*i,455,str);
break;
case 20 :if(i/2)
pDC->TextOut(50+pDoc->nShowrate*i,455,str);
break;
case 10 :if(!(i%4))
pDC->TextOut(50+pDoc->nShowrate*i,455,str);
break;
case 5: if(!(i/6))
pDC->TextOut(50+pDoc->nShowrate*i,455,str);
break;
default: if(!(i/30))
pDC->TextOut(50+pDoc->nShowrate*i,455,str);
}
}
for(i=0;i<=12;i++) //标Y轴的刻度,每个刻度间隔25像素;
{pDC->MoveTo(50,445-25*i);
pDC->LineTo(55,445-25*i);
str.Format("%.1f",i*0.1);
pDC->TextOut(15,435-25*i,str);
}
float max; // FFT变换后的最大值存放变量;
int k=0;
max=pDoc->array[0].y;
for(i=0;i<pDoc->nFttLength;i++) //选出最大值;
{if(max<pDoc->array[i].y)
{max=pDoc->array[i].y;k=i;}
}
pen.DeleteObject(); //删除画坐标轴的画笔,然后创建画摸的画笔;
pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
pDC->SelectObject(&pen);
for(i=0;i<pDoc->nFttLength;i++) // 在上面画好的坐标中画频谱;
{pDC->MoveTo(50+pDoc->nShowrate*i,445-2);
pDC->LineTo(50+pDoc->nShowrate*i,445-(int)(((pDoc->array[i].y)/max)*25*10)); //把摸转化为以上坐标轴相适应;
}
str.Format("|X(%d)|=%.1f",k,max);
pDC->TextOut(500,500,"最大的"+str);
if(pDoc->newchang)
str.Format("%d",pDoc->nFttLength);
else
str.Format("%d",pDoc->prenFttLength);
pDC->TextOut(500,100,"这是"+str+"点的离散傅立叶变换(归一化)");
for(i=0;i<pDoc->nFttLength;i++)
{str.Format("%.1f",pDoc->array[i].y);
pDC->TextOut(50+30*i,550,str);}
//Invalidate(true);
// TODO: add draw code for native data here
/* if(!pDoc->nFttFinshed)
{CString str;
for(int i=0;i<pDoc->nCount;i++)
{str.Format("%f",pDoc->origindata[i]);
pDC->TextOut(100,50*i,str);
}
}*/
pDoc->nFttLength=temp0;
}
if(pDoc->datareceived&&pDoc->nShowsignal)
{ int len=0;
int temp;
if(pDoc->nShowFtt)
{len=600;
if(!pDoc->showallrate)
{temp=pDoc->nShowrate;
pDoc->nShowrate=30;
}
}
else // 背景色
{ oldbrush=(CBrush*)pDC->SelectObject(&brush); // 把画刷选入
pDC->Rectangle(0,0,30800,1200); // 设背景;
pDC->SetBkColor(crColor);} // 设文本的字体以便和背景色一致;
pen.DeleteObject();
pen.CreatePen(PS_SOLID,2,RGB(0,255,0)); // 坐标的画笔
pDC->SelectObject(&pen); // 画笔选入;
pDC->MoveTo(50,len+580); // 画Y轴;
pDC->LineTo(50,len+10);
pDC->MoveTo(45,len+300); // 画X轴;
pDC->LineTo((pDoc->nFttLength+3)*30,len+300);
pDC->MoveTo(40,len+20); //画Y轴的箭头;
pDC->LineTo(50,len+10);
pDC->MoveTo(60,len+20);
pDC->LineTo(50,len+10);
pDC->MoveTo((pDoc->nFttLength+3)*30-10,len+290);
pDC->LineTo((pDoc->nFttLength+3)*30,len+300);
pDC->MoveTo((pDoc->nFttLength+3)*30-10,len+310);
pDC->LineTo((pDoc->nFttLength+3)*30,len+300);
for(i=1;i<=pDoc->nFttLength;i++) //标X轴的刻度;
{ pDC->MoveTo(50+pDoc->nShowrate*i,len+300);
pDC->LineTo(50+pDoc->nShowrate*i,len+295);
str.Format("%d",i);
//if(i%5==0)
switch (pDoc->nShowrate)
{case 30 : pDC->TextOut(45+pDoc->nShowrate*i,len+310,str);
break;
case 20 :if(i/2)
pDC->TextOut(45+pDoc->nShowrate*i,len+310,str);
break;
case 10 :if(!(pDoc->nShowrate*i%10))
pDC->TextOut(45+pDoc->nShowrate*i,len+310,str);
break;
case 5: if(!(i/6))
pDC->TextOut(45+pDoc->nShowrate*i,len+310,str);
break;
default: if(!(i/30))
pDC->TextOut(45+pDoc->nShowrate*i,len+310,str);
}
}
for(i=0;i<21;i++) //绘制信号源的坐标Y轴刻度,每刻度相隔25像素;
{ pDC->MoveTo(50,len+550-25*i);
pDC->LineTo(55,len+550-25*i);
str.Format("%0.1f",-1+i/10.0);
pDC->TextOut(15,len+540-25*i,str);
}
max=pDoc->origindata[0];
for(i=0;i<pDoc->nFttLength;i++) //选出最大值;
{if(fabs(max)<fabs(pDoc->origindata[i]))
{max=pDoc->origindata[i];k=i;}
}
pen.DeleteObject(); //删除画坐标轴的画笔,然后创建画摸的画笔;
pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
pDC->SelectObject(&pen);
for(i=0;i<pDoc->nFttLength;i++) // 在上面画好的坐标中画信号源;
{pDC->MoveTo(50+pDoc->nShowrate*i,len+300-2);
pDC->LineTo(50+pDoc->nShowrate*i,len+300-(int)(((pDoc->origindata[i])/max)*25*10)); //把摸转化为以上坐标轴相适应;
}
str.Format("%d",pDoc->nCount);
pDC->TextOut(450,len+10,"信号源视图,采样点为"+str+"点(已归一化)");
pDC->TextOut(80,len+20,"X(n)");
str.Format("%f",fabs(max));
pDC->TextOut(450, len+560,"绝对值最大为"+str);
pDoc->nShowrate=temp;
for(i=0;i<pDoc->nCount;i++)
{str.Format("%0.2f",pDoc->origindata[i]);
pDC->TextOut(50+50*i,len+580,str);
}
}
}
void CFFT_PROJECTView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = 30800;
sizeTotal.cy =1200;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CFFT_PROJECTView printing
BOOL CFFT_PROJECTView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFFT_PROJECTView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CFFT_PROJECTView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CFFT_PROJECTView diagnostics
#ifdef _DEBUG
void CFFT_PROJECTView::AssertValid() const
{
CScrollView::AssertValid();
}
void CFFT_PROJECTView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CFFT_PROJECTDoc* CFFT_PROJECTView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFFT_PROJECTDoc)));
return (CFFT_PROJECTDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFFT_PROJECTView message handlers
void CFFT_PROJECTView::OnCom1()
{
// TODO: Add your command handler code here
CFFT_PROJECTDoc* pDoc = GetDocument();
pDoc->Com1Open=true; //选择COM1进行通信;
pDoc->Com2Open=false; //关闭COM2;
CMainFrame *pframe;
pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar *pstatus=&pframe->m_wndStatusBar;
int nIndex=pstatus->CommandToIndex(ID_INDICATOR_COM );
pstatus->SetPaneInfo(nIndex,ID_INDICATOR_COM ,SBPS_NORMAL,60);
pstatus->SetPaneText(nIndex,"选择串口1");
}
void CFFT_PROJECTView::OnCom2()
{
// TODO: Add your command handler code here
CFFT_PROJECTDoc* pDoc = GetDocument();
pDoc->Com2Open=true; //选择COM2进行通信;
pDoc->Com1Open=false; //关闭COM1;
CMainFrame *pframe;
pframe=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar *pstatus=&pframe->m_wndStatusBar;
int nIndex=pstatus->CommandToIndex(ID_INDICATOR_COM );
pstatus->SetPaneInfo(nIndex,ID_INDICATOR_COM ,SBPS_NORMAL,60);
pstatus->SetPaneText(nIndex,"选择串口2");
}
void CFFT_PROJECTView::OnAsii()
{
// TODO: Add your command handler code here
CFFT_PROJECTDoc* pDoc = GetDocument();
pDoc->datatyle=0; //选择ASII传输;
}
void CFFT_PROJECTView::OnBit()
{
// TODO: Add your command handler code here
CFFT_PROJECTDoc* pDoc = GetDocument();
pDoc->datatyle=1; //选择二进制传输;
}
void CFFT_PROJECTView::OnTranslate()
{ CFFT_PROJECTDoc* pDoc = GetDocument();
pDoc->receivedata=_T("");
int i=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -