📄 windowfilterview.cpp
字号:
CString str;
pOldFont = pLinwDC.SelectObject(&bigFont);
str.Format("%d",10);
pLinwDC.TextOut(0,-1*(rect.bottom/2-2),str);
pLinwDC.SelectObject(&smallFont);
int yymax =(int)log10(max);
str.Format("%d",yymax);
pLinwDC.TextOut(0+14,-1*(rect.bottom/2),str);
//绘制线段
pLinwDC.SelectObject(&pointPen);
pLinwDC.SelectObject(pOldFont);
int i,x,y;
float y1;
int j = 0;
for (i=0; i<length; i++)
{
//标注x轴
if (i % xbiaozhu == 0 && i !=0)
{
j ++ ;
str.Format("%.1f",(float )j / biaozhunum * xmax);
pLinwDC.TextOut((int)(i * detaX - 4) , 3, str);
}
x = (int)(i * detaX);
y1 = num[i];
y = (int)(y1 * detaY);
//第一个点
if (i == 0)
{
CPoint firstPt(x,-y);
// pLinwDC.SetPixel(firstPt,RGB(255,0,0));
pLinwDC.MoveTo(x,-y);
// pLinwDC.Ellipse(x-2,-2,x+2,2);
}
else
{
// pLinwDC.MoveTo(x,0);
pLinwDC.LineTo(x,-y);
// pLinwDC.Ellipse(x-2,-y-2,x+2,-y+2);
}
}
pLinwDC.SelectObject(pOldPen);
// pLinwDC.SelectObject(pOldFont);
axisPen.DeleteObject();
pointPen.DeleteObject();
bigFont.DeleteObject();
smallFont.DeleteObject();
}
//专门在控件上画线的函数
//参数 n为索引,max为相应的y最大值,num为相应的y的数列
//length为数组的大小
void CWindowFilterView::Stem(int n, int length, float max,float *num)
{
float detaX ,detaY;
CRect rect;
CStatic *pWndLine;
//得到对应的画板
switch (n)
{
case 1:
pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE1);
break;
// case 2:
// pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE2);
// break;
// case 3:
// pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE3);
// break;
}
pWndLine->GetClientRect(&rect);
CClientDC pLinwDC(pWndLine);
pLinwDC.SetBkMode(TRANSPARENT); //设置文字背景颜色
pLinwDC.SetMapMode(MM_TEXT); //Y轴向下,画图时候要加负号
//设置原点
pLinwDC.SetViewportOrg(int(rect.right/(length+2)),int(rect.bottom/2));
detaX = (float)(rect.right/(length+2)); //x轴间距
detaY = (float)(0.5 * (rect.Height()-30) / max); //y轴间距,重新计算,以及y的大小
CPen axisPen, pointPen;
CPen *pOldPen;
CFont bigFont, smallFont,smallestFont;
CFont *pOldFont;
axisPen.CreatePen(PS_SOLID,2,RGB(0,0,0)); //黑线
pointPen.CreatePen(PS_SOLID,1,RGB(255,0,0)); //红线
bigFont.CreatePointFont(100,"Arial",NULL);
smallFont.CreatePointFont(80,"Arial",NULL); //小字体
smallestFont.CreatePointFont(60,"Arial",NULL);
pOldPen = pLinwDC.SelectObject(&axisPen);
//绘制x,y坐标轴
pLinwDC.MoveTo(0,0);
pLinwDC.LineTo((int)(detaX*length),0);
pLinwDC.MoveTo((int)(detaX*length),0);
pLinwDC.LineTo((int)(detaX*length-8),-4);
pLinwDC.MoveTo((int)(detaX*length),0);
pLinwDC.LineTo((int)(detaX*length-8),4);
pLinwDC.MoveTo(0,rect.bottom/2-10);
pLinwDC.LineTo(0,-1*(rect.bottom/2-10));
//求最大值的次方数,用于标注10的几次方
//之后要创建字体
CString str;
pOldFont = pLinwDC.SelectObject(&bigFont);
str.Format("%d",10);
pLinwDC.TextOut(0,-1*(rect.bottom/2-2),str);
pLinwDC.SelectObject(&smallFont);
int ymax =(int)log10(max);
str.Format("%d",ymax);
pLinwDC.TextOut(0+14,-1*(rect.bottom/2),str);
//绘制线段
pLinwDC.SelectObject(&pointPen);
// pLinwDC.SelectObject(pOldFont);
pLinwDC.SelectObject(&smallestFont);
pLinwDC.SelectObject(&smallFont);
int i,x,y;
// int interBiaozhu = (int)(LineCount / 5);
int interBiaozhu ;
if (length < 10)
{
interBiaozhu = 5;
}
else
{
interBiaozhu = log10(length);
interBiaozhu = pow(10.0,interBiaozhu)/2;
}
float y1;
for (i=0; i<length; i++)
{
if (i % interBiaozhu == 0 && i !=0)
{
str.Format("%d",i);
pLinwDC.TextOut((int)(i * detaX - 4) , 3, str);
}
x = (int)(i * detaX);
y1 = num[i];
y = (int)(y1 * detaY);
if (y == 0)
{
pLinwDC.Ellipse(x-2,-2,x+2,2);
}
else
{
pLinwDC.MoveTo(x,0);
pLinwDC.LineTo(x,-y);
pLinwDC.Ellipse(x-2,-y-2,x+2,-y+2);
}
}
pLinwDC.SelectObject(pOldPen);
// pLinwDC.SelectObject(pOldFont);
axisPen.DeleteObject();
pointPen.DeleteObject();
bigFont.DeleteObject();
smallFont.DeleteObject();
smallestFont.DeleteObject();
}
//划线函数
//n为画板的索引
//未完成,半成品。
void CWindowFilterView::Plot(int n, int length, float max,float *num,float xmin, float xmax,
float ymin, float ymax)
{
float detaX ,detaY;
CRect rect;
CStatic *pWndLine;
//目前只标注5个点。
int xbiaozhu = length ;
//得到对应的画板
switch (n)
{
case 1:
pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE1);
break;
case 2:
pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE2);
break;
case 3:
pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE3);
break;
}
//得到画板的大小
pWndLine->GetClientRect(&rect);
CClientDC pLinwDC(pWndLine);
pLinwDC.SetBkMode(TRANSPARENT); //设置文字背景颜色
pLinwDC.SetMapMode(MM_TEXT); //Y轴向下,画图时候要加负号
//设置原点
pLinwDC.SetViewportOrg(int(rect.right/(length+2)),int(rect.bottom/2));
detaX = (float)(rect.right/(length+2)); //x轴间距
detaY = (float)(0.5 * (rect.Height()-30) / max); //y轴间距,重新计算,以及y的大小
CPen axisPen, pointPen;
CPen *pOldPen;
CFont bigFont, smallFont;
CFont *pOldFont;
axisPen.CreatePen(PS_SOLID,2,RGB(0,0,0)); //黑线
pointPen.CreatePen(PS_SOLID,1,RGB(255,0,0)); //红线
bigFont.CreatePointFont(100,"Arial",NULL);
smallFont.CreatePointFont(80,"Arial",NULL);
pOldPen = pLinwDC.SelectObject(&axisPen);
//绘制x,y坐标轴
pLinwDC.MoveTo(0,0);
pLinwDC.LineTo((int)(detaX*length),0);
pLinwDC.MoveTo((int)(detaX*length),0);
pLinwDC.LineTo((int)(detaX*length-8),-4);
pLinwDC.MoveTo((int)(detaX*length),0);
pLinwDC.LineTo((int)(detaX*length-8),4);
pLinwDC.MoveTo(0,rect.bottom/2-10);
pLinwDC.LineTo(0,-1*(rect.bottom/2-10));
//求最大值的次方数,用于标注10的几次方
//之后要创建字体
CString str;
pOldFont = pLinwDC.SelectObject(&bigFont);
str.Format("%d",10);
pLinwDC.TextOut(0,-1*(rect.bottom/2-2),str);
pLinwDC.SelectObject(&smallFont);
int yymax =(int)log10(max);
str.Format("%d",yymax);
pLinwDC.TextOut(0+14,-1*(rect.bottom/2),str);
//绘制线段
pLinwDC.SelectObject(&pointPen);
pLinwDC.SelectObject(pOldFont);
int i,x,y;
float y1;
for (i=1; i<length; i++)
{
if (i % xbiaozhu == 0 && i !=0)
{
str.Format("%d",i);
pLinwDC.TextOut((int)(i * detaX - 4) , 3, str);
}
x = (int)(i * detaX);
y1 = num[i];
y = (int)(y1 * detaY);
//第一个点
if (i == 0)
{
CPoint firstPt(x,-y);
pLinwDC.SetPixel(firstPt,RGB(255,0,0));
// pLinwDC.Ellipse(x-2,-2,x+2,2);
}
else
{
// pLinwDC.MoveTo(x,0);
pLinwDC.LineTo(x,-y);
// pLinwDC.Ellipse(x-2,-y-2,x+2,-y+2);
}
}
pLinwDC.SelectObject(pOldPen);
// pLinwDC.SelectObject(pOldFont);
axisPen.DeleteObject();
pointPen.DeleteObject();
bigFont.DeleteObject();
smallFont.DeleteObject();
}
//函数重载
//最原始的画图函数
void CWindowFilterView::Plot(int n, int length, float max,float *num,
float ymin, float ymax)
{
float detaX ,detaY;
CRect rect;
CStatic *pWndLine;
//目前只标注5个点。
int biaozhunum = 5;
int xbiaozhu = length / biaozhunum;
//得到对应的画板
switch (n)
{
case 1:
pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE1);
break;
case 2:
pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE2);
break;
case 3:
pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE3);
break;
}
//得到画板的大小
pWndLine->GetClientRect(&rect);
CClientDC pLinwDC(pWndLine);
pLinwDC.SetBkMode(TRANSPARENT); //设置文字背景颜色
pLinwDC.SetMapMode(MM_TEXT); //Y轴向下,画图时候要加负号
//设置原点
pLinwDC.SetViewportOrg(int(rect.right/(length+2)),int(rect.bottom/2));
detaX = (float)(rect.right/(length+2)); //x轴间距
detaY = (float)(0.5 * (rect.Height()-30) / max); //y轴间距,重新计算,以及y的大小
CPen axisPen, pointPen;
CPen *pOldPen;
CFont bigFont, smallFont;
CFont *pOldFont;
axisPen.CreatePen(PS_SOLID,2,RGB(0,0,0)); //黑线
pointPen.CreatePen(PS_SOLID,1,RGB(255,0,0)); //红线
bigFont.CreatePointFont(100,"Arial",NULL);
smallFont.CreatePointFont(80,"Arial",NULL);
pOldPen = pLinwDC.SelectObject(&axisPen);
//绘制x,y坐标轴
pLinwDC.MoveTo(0,0);
pLinwDC.LineTo((int)(detaX*length),0);
pLinwDC.MoveTo((int)(detaX*length),0);
pLinwDC.LineTo((int)(detaX*length-8),-4);
pLinwDC.MoveTo((int)(detaX*length),0);
pLinwDC.LineTo((int)(detaX*length-8),4);
pLinwDC.MoveTo(0,rect.bottom/2-10);
pLinwDC.LineTo(0,-1*(rect.bottom/2-10));
//求最大值的次方数,用于标注10的几次方
//之后要创建字体
CString str;
pOldFont = pLinwDC.SelectObject(&bigFont);
str.Format("%d",10);
pLinwDC.TextOut(0,-1*(rect.bottom/2-2),str);
pLinwDC.SelectObject(&smallFont);
int yymax =(int)log10(max);
str.Format("%d",yymax);
pLinwDC.TextOut(0+14,-1*(rect.bottom/2),str);
//绘制线段
pLinwDC.SelectObject(&pointPen);
pLinwDC.SelectObject(pOldFont);
int i,x,y;
float y1;
for (i=1; i<length; i++)
{
if (i % xbiaozhu == 0 && i !=0)
{
str.Format("%d",i);
pLinwDC.TextOut((int)(i * detaX - 4) , 3, str);
}
x = (int)(i * detaX);
y1 = num[i];
y = (int)(y1 * detaY);
//第一个点
if (i == 0)
{
CPoint firstPt(x,-y);
pLinwDC.SetPixel(firstPt,RGB(255,0,0));
// pLinwDC.Ellipse(x-2,-2,x+2,2);
}
else
{
// pLinwDC.MoveTo(x,0);
pLinwDC.LineTo(x,-y);
// pLinwDC.Ellipse(x-2,-y-2,x+2,-y+2);
}
}
pLinwDC.SelectObject(pOldPen);
// pLinwDC.SelectObject(pOldFont);
axisPen.DeleteObject();
pointPen.DeleteObject();
bigFont.DeleteObject();
smallFont.DeleteObject();
}
//绘图函数
void CWindowFilterView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
if (m_bFirst == FALSE)
{
m_bFirst = TRUE;
}
else
{
if ((m_iFilterType == 2 || m_iFilterType ==3)&& (m_WcHigh == m_WcLow))
{
MessageBox("两个截止频率不能相同!");
}
else
{
CreateHFun(m_iFilterType, m_WindowLength);
m_FFTLength = CreateFFT(XReal, XImag, pReal, pImag, m_WindowLength);
// modify();
CreateAbs(XAbs,XReal,XImag,m_FFTLength);
CreateArg(XArg,XReal,XImag,m_FFTLength);
MaxReal = mymax(pReal,m_WindowLength);
MaxXAbs = mymax(XAbs, m_FFTLength);
MaxXArg = mymax(XArg, m_FFTLength);
Stem(1,m_WindowLength,MaxReal,pReal);
Plot(2,m_FFTLength/2,MaxXAbs,XAbs,1,-80,0); //只需要画出一半即可,0-PI
Plot(3,m_FFTLength/2,MaxXArg,XArg,1);
}
}
}
void CWindowFilterView::OnBtnDraw()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_bFirst = TRUE;
Invalidate();
}
void CWindowFilterView::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
if (m_bFirst == TRUE)
{
if ((m_iFilterType == 2 || m_iFilterType ==3)&& (m_WcHigh == m_WcLow))
{
MessageBox("两个截止频率不能相同!");
}
else
{
CreateHFun(m_iFilterType, m_WindowLength);
m_FFTLength = CreateFFT(XReal, XImag, pReal, pImag, m_WindowLength);
// modify();
CreateAbs(XAbs,XReal,XImag,m_FFTLength);
CreateArg(XArg,XReal,XImag,m_FFTLength);
MaxReal = mymax(pReal,m_WindowLength);
MaxXAbs = mymax(XAbs, m_FFTLength);
MaxXArg = mymax(XArg, m_FFTLength);
Stem(1,m_WindowLength,MaxReal,pReal);
Plot(2,m_FFTLength/2,MaxXAbs,XAbs,1,-80,0); //只需要画出一半即可,0-PI
Plot(3,m_FFTLength/2,MaxXArg,XArg,1);
}
}
}
void CWindowFilterView::modify()
{
int i;
for (i=0; i<m_FFTLength; i++)
{
if (fabs(XReal[i]) < 1e-6)
{
XReal[i] = 0.0;
}
if (fabs(XImag[i]) < 1e-6)
{
XImag[i] = 0.0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -