📄 fftview.cpp
字号:
// FFTView.cpp : implementation of the CFFTView class
//
#include "stdafx.h"
#include "FFT.h"
#include "FFTDoc.h"
#include "FFTView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFFTView
IMPLEMENT_DYNCREATE(CFFTView, CView)
BEGIN_MESSAGE_MAP(CFFTView, CView)
//{{AFX_MSG_MAP(CFFTView)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
// ON_MESSAGE(WM_MSG_WAVE, OnMsgWave)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFFTView construction/destruction
CFFTView::CFFTView()
{
// TODO: add construction code here
}
CFFTView::~CFFTView()
{
}
BOOL CFFTView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFFTView drawing
void CFFTView::OnDraw(CDC* pDC)
{
CFFTDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
//添加背景图
/* HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, _T("1.bmp"), IMAGE_BITMAP,
0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
m_bitmap.Attach(hBitmap);
BITMAP bm;
//m_bitmap.GetBitmap(&bm);
CDC dcImage;
if (dcImage.CreateCompatibleDC(pDC))
{CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap);
pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcImage, 0, 0, SRCCOPY);
dcImage.SelectObject(pOldBitmap);
DeleteObject(m_bitmap.Detach());
}*/
CString str;
int i,maxx;
CRect rc;GetClientRect(rc);
if(rc.Height()<=100||rc.Width()<=100)return;
CPoint pcenter1(rc.left,rc.top+rc.Height()/2-2),pcenter2(rc.right,rc.top+rc.Height()/2-2);
CPen pWhite(PS_SOLID,1,RGB(255,255,255));
CPen pGray(PS_SOLID,1,RGB(192,192,192));
CPen pDark(PS_SOLID,1,RGB(96,96,96));
CPen pBlue(PS_SOLID,2,RGB(0,0,255));
CPen pGrid(PS_DOT,1,RGB(0,96,0));
//写标题
pDC->SetTextColor(RGB(0,0,128));
pDC->TextOut(rc.left+rc.Width()/2-40,rc.top,"频域波形");
//画窗格
CRect rfreq;
rfreq.top =rc.top +30;rfreq.bottom =rc.bottom -30;
rfreq.left =rc.left+10;rfreq.right =rc.right-10 ;
//pDC->TextOut(rfreq.left-5,rfreq.bottom+5,"0");
if(pDoc->m_bPower) maxx=pDoc->slice/2;
else maxx=pDoc->M;
//str.Format("%d",maxx);
//pDC->TextOut(rfreq.right-30,rfreq.bottom+5,str);//M
pDC->SelectObject(&pGrid);
int wnum,hnum;
wnum=rfreq.Width()/40;
hnum=rfreq.Height()/40;
for(i=0;i<=wnum;i++)//画竖线
{pDC->MoveTo(rfreq.left+i*rfreq.Width()/wnum,rfreq.top);
pDC->LineTo(rfreq.left+i*rfreq.Width()/wnum,rfreq.bottom);
str.Format("%d",maxx*i/wnum);
pDC->TextOut(rfreq.left+i*rfreq.Width()/wnum-10,rfreq.bottom+5,str);
}
for(i=0;i<=hnum;i++)//画横线
{pDC->MoveTo(rfreq.left,rfreq.top+i*rfreq.Height()/hnum);
pDC->LineTo(rfreq.right,rfreq.top+i*rfreq.Height()/hnum);
}
//频域波形
pDC->SelectObject(&pBlue);
double ys,xs;
int signa=0,signb=0,y0;
str.Format("%e",pDoc->fym);
pDC->TextOut(rfreq.left,rfreq.top-20,str);//ym1
if(pDoc->m_bPower){
for(i=0;i<pDoc->slice/2;i++) {
if (pDoc->mag[i]>fabs(pDoc->fym/20)) signa=1;
if (pDoc->mag[i]<-1*fabs(pDoc->fym/20)) signb=1;
}
if ((signa==1)&&(signb==1)) ys=(double)(rfreq.Height()>>1)/pDoc->fym;
else ys=(double)(rfreq.Height()/pDoc->fym);
y0=rfreq.top+rfreq.Height()/2;
xs=(double)(rfreq.Width())/(pDoc->slice/2);
if((signa==1)&&(signb==0)) y0=rfreq.bottom;
else if((signb==1)&&(signa==0)) y0=rfreq.top;
for(i=0;i<(pDoc->slice/2)-1;i++)
{pDC->MoveTo(xs*i+rfreq.left,y0-pDoc->mag[i]*ys);
pDC->LineTo(xs*(i+1)+rfreq.left,y0-pDoc->mag[i+1]*ys);}
}//mag[slice/2]
else{
xs=(double)(rfreq.Width())/pDoc->N;
ys=(double)(rfreq.Height())/pDoc->fym;
for(i=0;i<(pDoc->M)-1;i++)
{pDC->MoveTo(xs*i+rfreq.left,rfreq.bottom-pDoc->famp[i]*ys);
pDC->LineTo(xs*(i+1)+rfreq.left ,rfreq.bottom -pDoc->famp[i+1]*ys);
}}
}
/////////////////////////////////////////////////////////////////////////////
// CFFTView printing
BOOL CFFTView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFFTView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CFFTView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CFFTView diagnostics
#ifdef _DEBUG
void CFFTView::AssertValid() const
{
CView::AssertValid();
}
void CFFTView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CFFTDoc* CFFTView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFFTDoc)));
return (CFFTDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFFTView message handlers
void CFFTView::OnInitialUpdate()
{ CFFTDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
CView::OnInitialUpdate();
//3d风格的窗口(下沉),发送窗口改变大小的消息
ModifyStyleEx(0,WS_EX_CLIENTEDGE,SWP_FRAMECHANGED);
pDoc->SinWave();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -