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

📄 linedlg.cpp

📁 数字信号处理试验
💻 CPP
字号:
// LineDlg.cpp : implementation file
//

#include "stdafx.h"
#include "FFT.h"
//#include "FFT.cpp"
#include "LineDlg.h"
#include "math.h"
// #include "MainFrm.h"
// #include "FFTView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLineDlg dialog


CLineDlg::CLineDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CLineDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CLineDlg)
	index = 0;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	//}}AFX_DATA_INIT
}


void CLineDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLineDlg)
	DDX_Control(pDX, IDC_SHOWBITMPA, m_ShowPic);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CLineDlg, CDialog)
	//{{AFX_MSG_MAP(CLineDlg)
	ON_WM_PAINT()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLineDlg message handlers

void CLineDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting	
	CString temp;
	switch (index2)
	{
	case 1:
		SetDlgItemText(IDC_DFFT,"DFT");
		break;
	case 2:
		SetDlgItemText(IDC_DFFT,"FFT");
		break;
	}
	switch (index)
	{
	case 1:
		SetDlgItemText(IDC_TIP,"高斯序列");
		temp.Format("p值:%.2f",para1);
		SetDlgItemText(IDC_PARA1,temp);
		temp.Format("q值:%.2f",para2);
		SetDlgItemText(IDC_PARA2,temp);
		m_ShowPic.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1)));
		break;
	case 2:
		SetDlgItemText(IDC_TIP,"衰减正弦序列");
		temp.Format("a值:%.2f",para1);
		SetDlgItemText(IDC_PARA1,temp);
		temp.Format("f值:%.4f",para2);
		SetDlgItemText(IDC_PARA2,temp);		
		m_ShowPic.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP2)));
		break;
	case 3:
		SetDlgItemText(IDC_TIP,"三角波序列");
		GetDlgItem(IDC_PARA1)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_PARA2)->ShowWindow(SW_HIDE);
		m_ShowPic.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP3)));
		break;
	case 4:
		SetDlgItemText(IDC_TIP,"反三角序列序列");
		GetDlgItem(IDC_PARA1)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_PARA2)->ShowWindow(SW_HIDE);
		m_ShowPic.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP4)));
		break;
	}
	CString str;
	str.Format("序列长度: %d",LineCount);
	SetDlgItemText(IDC_STATIC_COUNT,str);	
	//在相应的图标框上左图
	DrawLine(1, xMaxreal, xPreal);
	DrawLine(2, xMaximg, xPimg);
 	DrawLine(3, XMaxAbs, XPabs);
 	DrawLine(4, XMaxArg, XParg);
 	DrawLine(5, XMaxreal, XPreal);
 	DrawLine(6, XMaximg, XPimg);
	// Do not call CDialog::OnPaint() for painting messages
//	AddList();
}

BOOL CLineDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	// TODO: Add extra initialization here
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE	
}

int CLineDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;	
	
	// TODO: Add your specialized creation code here	
	return 0;
}

//专门在控件上画线的函数
//参数 n为索引,max为相应的y最大值,num为相应的y的数列
void CLineDlg::DrawLine(int n, double max,double *num)
{
	double 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;
	case 4:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE4);
		break;
	case 5:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE5);
		break;
	case 6:
		pWndLine = (CStatic *)GetDlgItem(IDC_PALETTE6);
		break;
	}	
	//得到画板的大小
	pWndLine->GetClientRect(&rect);
	CClientDC pLinwDC(pWndLine);
	pLinwDC.SetBkMode(TRANSPARENT);                //设置文字背景颜色
	pLinwDC.SetMapMode(MM_TEXT);                   //Y轴向下,画图时候要加负号
	//设置原点
	pLinwDC.SetViewportOrg(int(rect.right/(LineCount+2)),int(rect.bottom/2));
	detaX = (double)(rect.right/(LineCount+2));               //x轴间距
	detaY = (double)(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*LineCount),0);
	pLinwDC.MoveTo((int)(detaX*LineCount),0);
	pLinwDC.LineTo((int)(detaX*LineCount-8),-4);
	pLinwDC.MoveTo((int)(detaX*LineCount),0);
	pLinwDC.LineTo((int)(detaX*LineCount-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 (LineCount < 10)
	{
		interBiaozhu = 5;
	} 
	else
	{
		interBiaozhu = log10(LineCount);
		interBiaozhu = pow(10.0,interBiaozhu)/2;
	} 
	double y1;
	for (i=0; i<LineCount; 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();
}

void CLineDlg::PostNcDestroy() 
{
	// TODO: Add your specialized code here and/or call the base class
//	
//	extern gloabCount;
// 	CMainFrame *pFrame = 
// 		(CMainFrame*)AfxGetApp()->m_pMainWnd;
// 	CFFTView *pView = (CFFTView *)pFrame->GetActiveView();
// 	int num = pView->m_iDlgNum;

	delete []XPreal;
	delete []XPimg;
	delete []XPabs;
	delete []XParg;
	delete []xPimg;
	delete []xPreal;
	delete this;

	CDialog::PostNcDestroy();
}

void CLineDlg::OnOK() 
{
	// TODO: Add extra validation here
	DestroyWindow();
//	CDialog::OnOK();
}

void CLineDlg::AddList()
{
//	static m_bool = FALSE;
//	if (!m_bool)
	{
		CListBox *list;
		CString str;
		int i;
		list = (CListBox *)GetDlgItem(IDC_LIST1);		
		for (i=0; i<LineCount; i++)
		{
			str.Format("%2d   %f",i,xPreal[i]);
			list->AddString(str);
		}
		list = (CListBox *)GetDlgItem(IDC_LIST2);
		for (i=0; i<LineCount; i++)
		{
			str.Format("%2d   %f",i,xPimg[i]);
			list->AddString(str);
		}
		list = (CListBox *)GetDlgItem(IDC_LIST3);
		for (i=0; i<LineCount; i++)
		{
			str.Format("%2d   %f",i,XPabs[i]);
			list->AddString(str);
		}
		list = (CListBox *)GetDlgItem(IDC_LIST4);
		for (i=0; i<LineCount; i++)
		{
			str.Format("%2d   %f",i,XParg[i]);
			list->AddString(str);
		}
		list = (CListBox *)GetDlgItem(IDC_LIST5);
		for (i=0; i<LineCount; i++)
		{ 
			str.Format("%2d   %f",i,XPreal[i]);
			list->AddString(str);
		}
		list = (CListBox *)GetDlgItem(IDC_LIST6);
		for (i=0; i<LineCount; i++)
		{
			str.Format("%2d   %f",i,XPimg[i]);
			list->AddString(str);
		}
	}
//	m_bool = TRUE;	
}

BOOL CLineDlg::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class

	return CDialog::PreCreateWindow(cs);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -