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

📄 fft_projectview.cpp

📁 用VC++实现串口通信
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -