📄 fileterview.cpp
字号:
// FileterView.cpp : implementation of the CFileterView class
//
#include "stdafx.h"
#include "Fileter.h"
#include "FileterDoc.h"
#include "FileterView.h"
#include "Complex_num.h"
#include "Filter_Struct.h"
#include "Ft5Dlg.h"
#include "FdB_ExtentDlg.h"
#include "math.h"
#include "lpf.h"
#include "hpf.h"
#include "NewDlg0.h"
#include "NewDlg1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFileterView
IMPLEMENT_DYNCREATE(CFileterView, CScrollView)
BEGIN_MESSAGE_MAP(CFileterView, CScrollView)
//{{AFX_MSG_MAP(CFileterView)
ON_COMMAND(ID_SET_VALUE, OnSetValue)
ON_COMMAND(ID_SET_FDB, OnSetFdb)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_RBUTTONUP()
ON_WM_RBUTTONDBLCLK()
ON_COMMAND(ID_SET_DBTYPE, OnSetDbtype)
ON_UPDATE_COMMAND_UI(ID_SET_DBTYPE, OnUpdateSetDbtype)
ON_WM_LBUTTONDBLCLK()
ON_COMMAND(ID_SELECT_C1, OnSelectC1)
ON_UPDATE_COMMAND_UI(ID_SELECT_C1, OnUpdateSelectC1)
ON_COMMAND(ID_SELECT_C2, OnSelectC2)
ON_UPDATE_COMMAND_UI(ID_SELECT_C2, OnUpdateSelectC2)
ON_COMMAND(ID_SELECT_C3, OnSelectC3)
ON_UPDATE_COMMAND_UI(ID_SELECT_C3, OnUpdateSelectC3)
ON_COMMAND(ID_SELECT_C4, OnSelectC4)
ON_UPDATE_COMMAND_UI(ID_SELECT_C4, OnUpdateSelectC4)
ON_COMMAND(ID_SELECT_C5, OnSelectC5)
ON_UPDATE_COMMAND_UI(ID_SELECT_C5, OnUpdateSelectC5)
ON_COMMAND(ID_SELECT_L2, OnSelectL2)
ON_UPDATE_COMMAND_UI(ID_SELECT_L2, OnUpdateSelectL2)
ON_COMMAND(ID_SELECT_R2, OnSelectR2)
ON_UPDATE_COMMAND_UI(ID_SELECT_R2, OnUpdateSelectR2)
ON_COMMAND(ID_SELECT_L4, OnSelectL4)
ON_UPDATE_COMMAND_UI(ID_SELECT_L4, OnUpdateSelectL4)
ON_COMMAND(ID_SELECT_RL, OnSelectRl)
ON_UPDATE_COMMAND_UI(ID_SELECT_RL, OnUpdateSelectRl)
ON_COMMAND(ID_SELECT_R4, OnSelectR4)
ON_UPDATE_COMMAND_UI(ID_SELECT_R4, OnUpdateSelectR4)
ON_COMMAND(ID_SET_ADD, OnSetAdd)
ON_UPDATE_COMMAND_UI(ID_SET_ADD, OnUpdateSetAdd)
ON_COMMAND(ID_SET_SUB, OnSetSub)
ON_UPDATE_COMMAND_UI(ID_SET_SUB, OnUpdateSetSub)
ON_COMMAND(ID_SET_RETURN, OnSetReturn)
ON_COMMAND(ID_SET_CLASS, OnSetClass)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CFileterView construction/destruction
CFileterView::CFileterView()
{
// TODO: add construction code here
CSize TotalSize(150,100);
SetScrollSizes(1,TotalSize);
m_DrawRect = CRect(0,0,0,0);
Is = CComplex_num(100,0); //定义输入电流IS
BegindB=-10;
EnddB =70; //开始、终止幅度
BeginF =0;
EndF =10e6; //开始、终止频率
MaxdB=200;
MindB=-20;
MaxF=300e6;
MinF=0;
////////////////
FilterClass = CAUER;
FilterType=0;
pCC= new CCCompnent[10];
pLC= new CLCompnent[10];
pViewFilter=new CCauerLPF;
UpdateViewFilter(FilterClass,FilterType,3.9e6,6e6,50);
//mouse operate
m_Moving=0;
m_hCursor= AfxGetApp()->LoadCursor(IDC_MYPOINTER);
PreCursor= AfxGetApp()->LoadStandardCursor(IDC_ARROW);
//comp
m_Comp=FALSE;
//block write
m_OrgPtSize=CSize(0,0);
m_MovPtSize=CSize(0,0);
m_Distance=5;
Runtimes=0;
//invert ?
m_Invert=FALSE;
//where is edit
m_Who=0;
}
CFileterView::~CFileterView()
{
// delete pCC;
// delete pLC;
// delete pViewFilter;
}
BOOL CFileterView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
// cs.lpszClass=AfxRegisterWndClass(
// CS_HREDRAW|CS_VREDRAW,
// 0,
// (HBRUSH)::GetStockObject(WHITE_BRUSH),
// 0);
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFileterView drawing
void CFileterView::DrawInit(CDC* pDC)
{
int SITELONG=10;
// pDC->SetBkMode(TRANSPARENT); //设置模式为TRANSPARENT
//fill edge
CRect LeftEdgeRect(m_ClientRect.left,m_ClientRect.top,
m_DrawRect.left,m_ClientRect.bottom);
CRect BottomEdgeRect(m_DrawRect.left,m_DrawRect.bottom,
m_ClientRect.right,m_ClientRect.bottom);
if(!m_Comp)
pDC->FillSolidRect(&m_ClientRect,RGB(170,170,170));
pDC->FillSolidRect(&LeftEdgeRect,RGB(150,150,150));
pDC->FillSolidRect(&BottomEdgeRect,RGB(150,150,150));
//ini Pen
CPen *pOldPen,XYPen,SitePen,CrossPen,DotPen;
XYPen.CreatePen(PS_SOLID,3,RGB(0,0,0));
SitePen.CreatePen(PS_SOLID,3,RGB(0,0,0));
CrossPen.CreatePen(PS_SOLID,1,RGB(100,100,100));
DotPen.CreatePen(PS_DASH,1,RGB(255,0,0));
//draw X, Y
pOldPen=pDC->SelectObject(&XYPen);
//Y
pDC->MoveTo(m_DrawRect.left,m_DrawRect.bottom);
pDC->LineTo(m_DrawRect.left, m_ClientRect.top+10);
pDC->LineTo(m_DrawRect.left-5, m_ClientRect.top+10+5);
pDC->MoveTo(m_DrawRect.left, m_ClientRect.top+10);
pDC->LineTo(m_DrawRect.left+5, m_ClientRect.top+10+5);
//X
pDC->MoveTo(m_DrawRect.left,m_DrawRect.bottom);
pDC->LineTo(m_ClientRect.right-10, m_DrawRect.bottom);
pDC->LineTo(m_ClientRect.right-10-5, m_DrawRect.bottom-5);
pDC->MoveTo(m_ClientRect.right-10, m_DrawRect.bottom);
pDC->LineTo(m_ClientRect.right-10-5, m_DrawRect.bottom+5);
pDC->SelectObject(pOldPen);
//fffff draw site
pOldPen=(CPen*)pDC->SelectObject(&SitePen);
int x,y;
double f,db;
CString StrF,StrdB,Str;
CSize StrSize;
double nf=(EndF-BeginF)/m_DrawRect.Width()*40;
if(nf<=5e4) nf=5e4; else
if (nf<=1e5) nf=1e5; else
if(nf<=5e5) nf=5e5; else
if (nf<=1e6) nf=1e6; else
if(nf<=2.5e6) nf=2.5e6; else
if(nf<=5e6) nf=5e6; else
if(nf<7.5e6) nf=7.5e6; else
if(nf<1e7) nf=1e7;
else nf=5e7;
double beginf=int(BeginF/nf)*nf;
for(f=beginf;f<EndF;f+=nf)
{
x=GetX(f);
if(x<m_DrawRect.left) continue;//beyond draw range
//draw site line
pDC->SelectObject(&SitePen);
pDC->MoveTo(x,m_DrawRect.bottom);
pDC->LineTo(x,m_DrawRect.bottom+SITELONG);
//draw cross line
pDC->SelectObject(&CrossPen);
pDC->MoveTo(x,m_DrawRect.bottom);
pDC->LineTo(x,m_DrawRect.top);
//draw string
StrF.Format("%5.1f",f/(1e6));
StrSize=pDC->GetTextExtent(StrF);
pDC->TextOut(x-StrSize.cx/2,m_DrawRect.bottom+SITELONG+2,StrF);
}
//db db draw site
double ndb=(EnddB-BegindB)/m_DrawRect.Height()*20;
if (ndb<=0.5) ndb=0.5; else
if (ndb<=1) ndb=1; else
if(ndb<=2.5) ndb=2.5; else
if (ndb<=5) ndb=5; else
if(ndb<=7.5) ndb=7.5; else
if(ndb<=10) ndb=10;
else ndb=15;
double begindb=int(BegindB/ndb)*ndb;
for(db=begindb;db<EnddB;db+=ndb)
{
y=GetY(db);
if(y>m_DrawRect.bottom||y<m_DrawRect.top) continue; // beyond range
//draw site line
pDC->SelectObject(&SitePen);
pDC->MoveTo(m_DrawRect.left,y);
pDC->LineTo(m_DrawRect.left-SITELONG,y);
//draw cross line
pDC->SelectObject(&CrossPen);
pDC->MoveTo(m_DrawRect.left,y);
pDC->LineTo(m_DrawRect.right,y);
//draw string
StrdB.Format("%3.1f",-db);
StrSize=pDC->GetTextExtent(StrdB);
pDC->TextOut(m_DrawRect.left-StrSize.cx-SITELONG-2,y-StrSize.cy/2,StrdB);
}
pDC->SelectObject(pOldPen);
//write O, X , Y
// pDC->TextOut(m_DrawRect.left-15,m_DrawRect.bottom-10,"O");
pDC->TextOut(m_DrawRect.left+15, m_ClientRect.top+10+10, "幅");
pDC->TextOut(m_DrawRect.left+15, m_ClientRect.top+10+30, "度");
pDC->TextOut(m_DrawRect.left+15, m_ClientRect.top+10+50, "dB");
pDC->TextOut(m_ClientRect.right-10-80,m_DrawRect.bottom-30,"频率(MHz)");
/*
//out the C1,c2,c3,c4,c5,l2,l4,rl value
double c1,c2,c3,c4,c5,l2,r2,l4,r4,rl;
FT->GetVal(c1,c2,c3,c4,c5,l2,r2,l4,r4,rl);
CString strC1,strC2,strC3,strC4,strC5,strL2,strL4,strRL;
strC1.Format("C1: %4.0f",c1);
strC2.Format("C2: %4.0f",c2);
strC3.Format("C3: %4.0f",c3);
strC4.Format("C4: %4.0f",c4);
strC5.Format("C5: %4.0f",c5);
strL2.Format("L2: %4.2f , R2: %3.1f",l2,r2);
strL4.Format("L4: %4.2f , R4: %3.1f",l4,r4);
strRL.Format("RL: %4.0f",rl);
pDC->TextOut(300,20,strC1);
pDC->TextOut(300,40,strC2);
pDC->TextOut(300,60,strC3);
pDC->TextOut(300,80,strC4);
pDC->TextOut(300,100,strC5);
pDC->TextOut(300,120,strL2);
pDC->TextOut(300,140,strL4);
pDC->TextOut(300,160,strRL);
*/
}
void CFileterView::DrawResonance(CDC *pDC)
{
int i,x;
double f;
CString StrF;
CSize StrSize;
int Nums=3;
double *ResDotDim= new double[Nums];
CPen *pOldPen,ResDotPen;
ResDotPen.CreatePen(PS_DASH,1,RGB(200,0,200));
pOldPen=pDC->SelectObject(&ResDotPen);
pViewFilter->GetResonance(ResDotDim,Nums);
for(i=0;i<Nums;i++)
{
f=ResDotDim[i];
x=GetX(f);
pDC->MoveTo(x,m_DrawRect.bottom);
pDC->LineTo(x,m_DrawRect.top);
StrF.Format("%5.1f",f/(1e6));
StrSize=pDC->GetTextExtent(StrF);
pDC->TextOut(x-StrSize.cx/2,m_DrawRect.top,StrF);
}
delete [] ResDotDim;
pDC->SelectObject(pOldPen);
}
void CFileterView::DrawAmp(CDC *pDC)
{
//juge ff and db range
if (BeginF<MinF) BeginF=MinF;
if (EndF>MaxF) EndF=MaxF;
if (BegindB<MindB) BegindB=MindB;
if (EnddB>MaxdB) EnddB=MaxdB;
// ini pen
CPen *pOldPen,DrawPen,dBRangePen;
DrawPen.CreatePen(PS_SOLID,2,RGB(0,0,255));
dBRangePen.CreatePen(PS_DASH,1,RGB(240,0,0));
//draw Point
double OutdB,maxAttdB=0.0;
int x,y;
//the first dot db at left of rect
y=GetY(-pViewFilter->GetAmpOut(GetF(m_DrawRect.left)));
//ini origin point
CPoint PrePoint=CPoint(m_DrawRect.left,y);
//select pen
pOldPen=(CPen *) pDC->SelectObject(&DrawPen);
for(x=m_DrawRect.left;x<m_DrawRect.right;x++)
{
double frequency= GetF(x);
OutdB= - pViewFilter->GetAmpOut(frequency);
//get the max attutend dB
if(maxAttdB<OutdB) maxAttdB=OutdB;
//y size
y = GetY(OutdB);
if (y>m_DrawRect.bottom)
{
PrePoint=CPoint(x,m_DrawRect.bottom);
continue;
}
if (y<m_DrawRect.top)
{
PrePoint=CPoint(x,m_DrawRect.top);
continue;
}
//draw point
pDC->MoveTo(PrePoint);
pDC->LineTo(x,y);
PrePoint= CPoint(x,y);
}
//draw the range line of db
pDC->SelectObject(&dBRangePen);
CString StrdB;
CSize StrSize;
// begin zero line draw
y=GetY(0);
pDC->MoveTo(m_DrawRect.left,y);
pDC->LineTo(m_DrawRect.right,y);
StrdB.Format("%d dB",0);
StrSize=pDC->GetTextExtent(StrdB);
pDC->TextOut(m_DrawRect.right-StrSize.cx,y-StrSize.cy/2,StrdB);
//max db line draw
y = GetY(maxAttdB);
pDC->MoveTo(m_DrawRect.left,y);
pDC->LineTo(m_DrawRect.right,y);
StrdB.Format("%4.1f dB",-maxAttdB);
StrSize=pDC->GetTextExtent(StrdB);
pDC->TextOut(m_DrawRect.right-StrSize.cx,y-StrSize.cy/2,StrdB);
//end draw range line of db
pDC->SelectObject(pOldPen);
}
void CFileterView::OnDraw(CDC* pDC)
{
CFileterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//ini memDC
if(Runtimes==0)
{
memDC.CreateCompatibleDC(pDC);
CBitmap theBitmap;
theBitmap.CreateCompatibleBitmap(pDC,800,600);
memDC.SelectObject(&theBitmap);
memDC.PatBlt(0,0,800,600,WHITENESS);
Runtimes=1;
}
// TODO: add draw code for native data here
GetClientRect(m_ClientRect);
m_DrawRect=m_ClientRect;
m_DrawRect.left=m_ClientRect.left+55;
m_DrawRect.bottom=m_ClientRect.bottom-35;
//ini draw
DrawInit(pDC);
DrawAmp(pDC);
if(FilterClass==CAUER) DrawResonance(pDC);
/* //取得视大小
CRect rcView;
GetClientRect(rcView);
CString str(_T("Some Shadow Text...")); //创建显示字符串
pDC->SetBkMode(TRANSPARENT); //设置模式为TRANSPARENT
//画黑影文本
rcView.OffsetRect(1, 1);
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(str, str.GetLength (), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
//画红色文本
rcView.OffsetRect(-1,-1);
pDC->SetTextColor(RGB(255, 0, 0));
pDC->DrawText(str, str.GetLength(), rcView, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
*/
}
/////////////////////////////////////////////////////////////////////////////
// CFileterView printing
BOOL CFileterView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFileterView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CFileterView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CFileterView diagnostics
#ifdef _DEBUG
void CFileterView::AssertValid() const
{
CScrollView::AssertValid();
}
void CFileterView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CFileterDoc* CFileterView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFileterDoc)));
return (CFileterDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFileterView message handlers
void CFileterView::OnSetValue()
{
// TODO: Add your command handler code here
CClientDC dc(this);
CFt5Dlg FtDlg;
double rl=pViewFilter->GetRL();
pViewFilter->GetVal(pCC,pLC);
FtDlg.SetVal(pCC,pLC,rl);
FtDlg.m_BoolComp=m_Comp;
if(FtDlg.DoModal()==IDOK)
{
FtDlg.GetVal(pCC,pLC,rl);
pViewFilter->SetVal(pCC,pLC);
m_Comp=FtDlg.m_BoolComp;
OnDraw(&dc);
}
}
void CFileterView::OnSetFdb()
{
// TODO: Add your command handler code here
CClientDC dc(this);
CFdB_ExtentDlg FdBDlg;
FdBDlg.SetData(BeginF,EndF,BegindB,EnddB);
int Ret=FdBDlg.DoModal();
if(Ret==IDOK)
{
FdBDlg.GetData(BeginF,EndF,BegindB,EnddB);
OnDraw(&dc);
}
}
void CFileterView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_DrawRect.PtInRect(point))
{
m_OrgPos=point;
m_OldPos=point;
SetCapture();
m_Moving=1;
GetBlock(point.x,point.y);
WriteWord(point.x,point.y);
//no mov out
CRect rect1;
rect1=m_DrawRect;
ClientToScreen(&rect1);
ClipCursor(&rect1); //限制标范围
//write word
}
CScrollView::OnLButtonDown(nFlags, point);
}
void CFileterView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_Moving)
{
SetCursor(m_hCursor);
CClientDC dc(this);
int PreR2=dc.SetROP2(R2_NOT);
//del
dc.MoveTo(m_OrgPos);
dc.LineTo(m_OrgPos.x,m_OldPos.y);
dc.LineTo(m_OldPos);
dc.LineTo(m_OldPos.x,m_OrgPos.y);
dc.LineTo(m_OrgPos);
//block operation
PutBlock(m_OldPos.x,m_OldPos.y);
GetBlock(point.x,point.y);
WriteWord(point.x,point.y);
//redraw
dc.MoveTo(m_OrgPos);
dc.LineTo(m_OrgPos.x,point.y);
dc.LineTo(point);
dc.LineTo(point.x,m_OrgPos.y);
dc.LineTo(m_OrgPos);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -