📄 filterdlg.cpp
字号:
// FilterDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RSIP.h"
#include "FilterDlg.h"
#include "math.h"
#define FILTERPAR1 0.414
#define FILTERPAR2 -0.347
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFilterDlg dialog
CFilterDlg::CFilterDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFilterDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFilterDlg)
m_nFilterType = 0;
m_nFilterWndSize = 0;
//}}AFX_DATA_INIT
}
void CFilterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFilterDlg)
DDX_Radio(pDX, ID_FILTER_MEAN, m_nFilterType);
DDX_CBIndex(pDX, IDC_FILTERSIZE_COMBO, m_nFilterWndSize);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFilterDlg, CDialog)
//{{AFX_MSG_MAP(CFilterDlg)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFilterDlg message handlers
/////////////////////////////////////////////////////////////////////////////
// CFrequencyFilterDlg dialog
CFrequencyFilterDlg::CFrequencyFilterDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFrequencyFilterDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFrequencyFilterDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CFrequencyFilterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFrequencyFilterDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFrequencyFilterDlg, CDialog)
//{{AFX_MSG_MAP(CFrequencyFilterDlg)
ON_BN_CLICKED(IDC_HIGHPASS, OnHighpass)
ON_BN_CLICKED(IDC_LOWPASS, OnLowpass)
ON_BN_CLICKED(IDC_BANDPASS, OnBandpass)
ON_BN_CLICKED(IDC_RECTANGLE, OnRectangle)
ON_BN_CLICKED(IDC_CIRCLE, OnCircle)
ON_BN_CLICKED(IDC_BUTTERWORTH, OnButterworth)
ON_BN_CLICKED(IDC_EXPONENTIAL, OnExponential)
ON_EN_CHANGE(IDC_R1, OnChangeR1)
ON_EN_CHANGE(IDC_R2, OnChangeR2)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFrequencyFilterDlg message handlers
void CFrequencyFilterDlg::OnHighpass()
{
if(m_nFilterType == 0)
return;
m_nFilterType = 0;
GetDlgItem(IDC_BUTTERWORTH)->EnableWindow(TRUE);
GetDlgItem(IDC_EXPONENTIAL)->EnableWindow(TRUE);
GetDlgItem(IDC_R2)->EnableWindow(FALSE);
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
void CFrequencyFilterDlg::OnLowpass()
{
if(m_nFilterType == 1)
return;
m_nFilterType = 1;
GetDlgItem(IDC_BUTTERWORTH)->EnableWindow(TRUE);
GetDlgItem(IDC_EXPONENTIAL)->EnableWindow(TRUE);
GetDlgItem(IDC_R2)->EnableWindow(FALSE);
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
void CFrequencyFilterDlg::OnBandpass()
{
if(m_nFilterType == 2)
return;
m_nFilterType = 2;
GetDlgItem(IDC_BUTTERWORTH)->EnableWindow(FALSE);
GetDlgItem(IDC_EXPONENTIAL)->EnableWindow(FALSE);
CheckRadioButton(IDC_RECTANGLE,IDC_EXPONENTIAL,IDC_RECTANGLE);
m_nFilterFunction = 0;
GetDlgItem(IDC_R2)->EnableWindow(TRUE);
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
void CFrequencyFilterDlg::OnRectangle()
{
if(m_nFilterFunction == 0)
return;
m_nFilterFunction = 0;
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
void CFrequencyFilterDlg::OnCircle()
{
if(m_nFilterFunction == 1)
return;
m_nFilterFunction = 1;
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
void CFrequencyFilterDlg::OnButterworth()
{
if(m_nFilterFunction == 2)
return;
m_nFilterFunction = 2;
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
void CFrequencyFilterDlg::OnExponential()
{
if(m_nFilterFunction == 3)
return;
m_nFilterFunction = 3;
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
void CFrequencyFilterDlg::OnChangeR1()
{
m_nRadias1 = GetDlgItemInt(IDC_R1);
if(m_nRadias1<=0 || m_nRadias1>m_nSize/2)
return;
if(m_nRadias1 < m_nRadias2)
{
int nTemp;
nTemp = m_nRadias1;
m_nRadias1 = m_nRadias2;
m_nRadias2 = nTemp;
}
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
void CFrequencyFilterDlg::OnChangeR2()
{
m_nRadias2 = GetDlgItemInt(IDC_R2);
if(m_nRadias2<=0 || m_nRadias2>m_nSize/2)
return;
if(m_nRadias1 < m_nRadias2)
{
int nTemp;
nTemp = m_nRadias1;
m_nRadias1 = m_nRadias2;
m_nRadias2 = nTemp;
}
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
InvalidateRect(&Rect);
}
BOOL CFrequencyFilterDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CheckDlgButton(IDC_HIGHPASS,1);
CheckDlgButton(IDC_RECTANGLE,1);
m_nFilterFunction = 0;
m_nFilterType = 0;
m_nRadias1 = m_nSize/3;
m_nRadias2 = m_nSize/3/2;
SetDlgItemInt(IDC_R1,m_nRadias1);
SetDlgItemInt(IDC_R2,m_nRadias2);
GetDlgItem(IDC_R2)->EnableWindow(FALSE);
return TRUE;
}
void CFrequencyFilterDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
RECT Rect;
SetRect(&Rect,101,66,197,137);
MapDialogRect(&Rect);
if(m_nFilterFunction == 0) //Rect
{
int CenterX = (Rect.left+Rect.right)/2;
int CenterY = (Rect.top+Rect.bottom)/2;
int Width = (Rect.bottom-Rect.top-20)/2;
float Ratio = (float)(Width*2)/m_nSize;
CPen Pen(PS_SOLID,2,RGB(0,0,0));
CPen *pOldPen = dc.SelectObject(&Pen);
dc.MoveTo(CenterX-Width,CenterY-Width);
dc.LineTo(CenterX+Width,CenterY-Width);
dc.LineTo(CenterX+Width,CenterY+Width);
dc.LineTo(CenterX-Width,CenterY+Width);
dc.LineTo(CenterX-Width,CenterY-Width);
dc.SelectObject(pOldPen);
Pen.DeleteObject();
if(m_nFilterType==0||m_nFilterType==1)
{
Pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
pOldPen=dc.SelectObject(&Pen);
dc.MoveTo(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
dc.LineTo(int(CenterX+m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
dc.LineTo(int(CenterX+m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio));
dc.LineTo(int(CenterX-m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio));
dc.LineTo(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
dc.SelectObject(pOldPen);
Pen.DeleteObject();
}
else
{
Pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
pOldPen=dc.SelectObject(&Pen);
dc.MoveTo(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
dc.LineTo(int(CenterX+m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
dc.LineTo(int(CenterX+m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio));
dc.LineTo(int(CenterX-m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio));
dc.LineTo(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio));
dc.SelectObject(pOldPen);
Pen.DeleteObject();
Pen.CreatePen(PS_DOT,1,RGB(0,0,0));
pOldPen=dc.SelectObject(&Pen);
dc.MoveTo(int(CenterX-m_nRadias2*Ratio),int(CenterY-m_nRadias2*Ratio));
dc.LineTo(int(CenterX+m_nRadias2*Ratio),int(CenterY-m_nRadias2*Ratio));
dc.LineTo(int(CenterX+m_nRadias2*Ratio),int(CenterY+m_nRadias2*Ratio));
dc.LineTo(int(CenterX-m_nRadias2*Ratio),int(CenterY+m_nRadias2*Ratio));
dc.LineTo(int(CenterX-m_nRadias2*Ratio),int(CenterY-m_nRadias2*Ratio));
dc.SelectObject(pOldPen);
Pen.DeleteObject();
}
}
else if(m_nFilterFunction == 1)//Circle
{
int CenterX = (Rect.left+Rect.right)/2;
int CenterY = (Rect.top+Rect.bottom)/2;
int Width = (Rect.bottom-Rect.top-20)/2;
float Ratio = (float)(Width*2)/m_nSize;
CPen Pen(PS_SOLID,2,RGB(0,0,0));
CPen *pOldPen = dc.SelectObject(&Pen);
dc.MoveTo(CenterX-Width,CenterY-Width);
dc.LineTo(CenterX+Width,CenterY-Width);
dc.LineTo(CenterX+Width,CenterY+Width);
dc.LineTo(CenterX-Width,CenterY+Width);
dc.LineTo(CenterX-Width,CenterY-Width);
dc.SelectObject(pOldPen);
Pen.DeleteObject();
if(m_nFilterType==0 || m_nFilterType==1)
{
Pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
pOldPen=dc.SelectObject(&Pen);
dc.Arc(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio),
int(CenterX+m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio),
int(CenterX+m_nRadias1*Ratio),CenterY,
int(CenterX+m_nRadias1*Ratio),CenterY+1);
dc.SelectObject(pOldPen);
Pen.DeleteObject();
}
else
{
Pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
pOldPen=dc.SelectObject(&Pen);
dc.Arc(int(CenterX-m_nRadias1*Ratio),int(CenterY-m_nRadias1*Ratio),
int(CenterX+m_nRadias1*Ratio),int(CenterY+m_nRadias1*Ratio),
int(CenterX+m_nRadias1*Ratio),CenterY,
int(CenterX+m_nRadias1*Ratio),CenterY+1);
dc.SelectObject(pOldPen);
Pen.DeleteObject();
Pen.CreatePen(PS_DOT,1,RGB(0,0,0));
pOldPen=dc.SelectObject(&Pen);
dc.Arc(int(CenterX-m_nRadias2*Ratio),int(CenterY-m_nRadias2*Ratio),
int(CenterX+m_nRadias2*Ratio),int(CenterY+m_nRadias2*Ratio),
int(CenterX+m_nRadias2*Ratio),CenterY,
int(CenterX+m_nRadias2*Ratio),CenterY+1);
dc.SelectObject(pOldPen);
Pen.DeleteObject();
}
}
else if(m_nFilterFunction == 2)//ButterWorth
{
int CenterX = (Rect.left+Rect.right)/2;
int Width = (Rect.right-Rect.left-20)/2;
float Ratio = (float)(Width*2)/m_nSize;
int Height = Rect.bottom-Rect.top-20;
float ThisR = m_nRadias1*Ratio;
CPen Pen(PS_SOLID,1,RGB(0,0,0));
CPen *pOldPen = dc.SelectObject(&Pen);
//Draw Axis
dc.MoveTo(CenterX-Width,Rect.bottom-10);
dc.LineTo(CenterX+Width,Rect.bottom-10);
dc.MoveTo(CenterX,Rect.bottom-10);
dc.LineTo(CenterX,Rect.bottom-10-Height);
if(m_nFilterType==1)//LowPass
{
dc.MoveTo(CenterX-Width,
int(Rect.bottom-10-Height/(1+FILTERPAR1*Width*Width/ThisR/ThisR)));
for(int i=-Width;i<=Width;i++)
dc.LineTo(CenterX+i,
int(Rect.bottom-10-Height/(1+FILTERPAR1*fabs(i)*fabs(i)/ThisR/ThisR)));
}
else//HighPass
{
dc.MoveTo(CenterX-Width,
int(Rect.bottom-10-Height/(1+FILTERPAR1/Width/Width*ThisR*ThisR)));
for(int i=-Width;i<=Width;i++)
dc.LineTo(CenterX+i,
int(Rect.bottom-10-Height/(1+FILTERPAR1/(fabs(i)+0.1)/(fabs(i)+0.1)*ThisR*ThisR)));
}
dc.SelectObject(pOldPen);
Pen.DeleteObject();
}
else//Exp
{
int CenterX = (Rect.left+Rect.right)/2;
int Width = (Rect.right-Rect.left-20)/2;
float Ratio = (float)(Width*2)/m_nSize;
int Height = Rect.bottom-Rect.top-20;
float ThisR = m_nRadias1*Ratio;
CPen Pen(PS_SOLID,1,RGB(0,0,0));
CPen *pOldPen = dc.SelectObject(&Pen);
//Draw Axis
dc.MoveTo(CenterX-Width,Rect.bottom-10);
dc.LineTo(CenterX+Width,Rect.bottom-10);
dc.MoveTo(CenterX,Rect.bottom-10);
dc.LineTo(CenterX,Rect.bottom-10-Height);
if(m_nFilterType==1)//LowPass
{
dc.MoveTo(CenterX-Width,
int(Rect.bottom-10-Height*exp(FILTERPAR2*Width*Width/ThisR/ThisR)));
for(int i=-Width;i<=Width;i++)
dc.LineTo(CenterX+i,
int(Rect.bottom-10-Height*exp(FILTERPAR2*fabs(i)*fabs(i)/ThisR/ThisR)));
}
else//HighPass
{
dc.MoveTo(CenterX-Width,
int(Rect.bottom-10-Height*exp(FILTERPAR2/Width/Width*ThisR*ThisR)));
for(int i=-Width;i<=Width;i++)
dc.LineTo(CenterX+i,
int(Rect.bottom-10-Height*exp(FILTERPAR2/(fabs(i)+0.1)/(fabs(i)+0.1)*ThisR*ThisR)));
}
dc.SelectObject(pOldPen);
Pen.DeleteObject();
}
}
void CFrequencyFilterDlg::OnOK()
{
if(m_nRadias1<=0 || m_nRadias1>m_nSize/2 ||
m_nRadias2<=0 || m_nRadias2>m_nSize/2)
{
MessageBox("输入值错误!");
return;
}
CDialog::OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -