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

📄 fileterview.cpp

📁 这个我写的一个计算LC滤波器的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -