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

📄 mainfrm.cpp

📁 FFT算法进行FFT 、IFFT、功率谱计算
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "FFT.h"

#include "MainFrm.h"
#include "TimeView.h"
#include "Splash.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_KEYDOWN()
	ON_WM_TIMER()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_OUTBAR_NOTIFY, OnOutbarNotify)
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_SHIFT,OnUpdateKeyShift)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_SEPARATOR,			//频率,高度
	ID_SEPARATOR,			//time
	ID_INDICATOR_SHIFT,          //显示Shift键的状态
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}
    
	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);
    m_animIcon.SetImageList(IDB_ANIM_IMGLIST2,4,RGB(0,0,0));
	// set the timer to fire every .5 seconds
	m_timerID = this->SetTimer(99,100,NULL);
	// CG: The following line was added by the Splash Screen component.	CSplashWnd::ShowSplashScreen(this);
	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
    if(!wndSplitter.CreateStatic(this,1,2))return false;
	if(!m_wndSplitter2.CreateStatic(&wndSplitter,2,1,
                WS_CHILD | WS_VISIBLE, wndSplitter.IdFromRowCol(0, 1)))return false;
    //创建标准视图,时域波形视图
	m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CTimeView),
                CSize(0, 200), pContext);
    //创建标准视图,频域波形视图
    m_wndSplitter2.CreateView(1, 0, pContext->m_pNewViewClass,
                CSize(0, 0), pContext);
	CRect r;
	int w1,w2;
	

//	CView * m_view=pContext->m_pLastView;
	pDoc=(CFFTDoc*)pContext->m_pCurrentDoc;
/*	
	if(!wndSplitter.CreateView(0,1,pContext->m_pNewViewClass,
		CSize(0,0),pContext))return false;*/
    //创建outbar控件
	wndBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),&wndSplitter,
		wndSplitter.IdFromRowCol(0,0));
	//令控件的消息发送至mainframe而不是其父窗口splitter
	wndBar.SetOwner(this);
	//创建控制图形列表
	imaLarge.Create(IDB_IMAGELIST,32,0,RGB(128,128,128));//4
	imaSmall.Create(IDB_SMALL_IMAGELIST,16,0,RGB(0,128,128));
	//将图像与控件相链接
	wndBar.SetImageList(&imaLarge,CGfxOutBarCtrl::fLargeIcon);
	wndBar.SetImageList(&imaSmall,CGfxOutBarCtrl::fSmallIcon);

	wndBar.SetAnimationTickCount(20);wndBar.SetAnimSelHighlight(200);//...
    //加入文件夹
	wndBar.AddFolder("窗函数选择",0);
	wndBar.AddFolder("噪声选择",1);
	wndBar.AddFolder("傅立叶变换输入函数",2);
	wndBar.AddFolder("功率谱分析",3);
	//加入item
	wndBar.InsertItem(0,0,"Hamming",0,0);
	wndBar.InsertItem(0,1,"Hanning",1,0);
	wndBar.InsertItem(0,2,"triangle",2,0);
	wndBar.InsertItem(0,3,"Blackman",4,0);
	wndBar.InsertItem(0,4,"4 term Blackman-Harris",0,0);
    wndBar.InsertItem(1,0,"无噪声",5,0);
	wndBar.InsertItem(1,1,"高斯噪声",6,0);
	wndBar.InsertItem(1,2,"均匀噪声",4,0);
	wndBar.InsertItem(2,0,"正弦波",0,0);
	wndBar.InsertItem(2,1,"方波",1,0);
	wndBar.InsertItem(2,2,"复合波",2,0);
	wndBar.InsertItem(3,0,"复合波",3,0);
	wndBar.InsertItem(3,1,"打开文件",2,0);
	wndBar.InsertItem(3,2,"关闭文件",1,0);
	wndBar.SetSelFolder(3);
	
	GetClientRect(&r);
	w1=r.Width()/5;
	w2=r.Width()/4;
	wndSplitter.SetColumnInfo(0,w1,0);
	wndSplitter.SetColumnInfo(1,w2,0);
	wndSplitter.RecalcLayout();

	w1=r.Height()*2/3;
	w2=r.Height()/3;
	m_wndSplitter2.SetRowInfo(1,w2,0);
	m_wndSplitter2.SetRowInfo(0,w1,0);
	m_wndSplitter2.RecalcLayout();

 //   SetActiveView(CTimeView);
	return true;
	//return CFrameWnd::OnCreateClient(lpcs, pContext);
}
long CMainFrame::OnOutbarNotify(WPARAM wParam, LPARAM lParam)
{   // CFFTDoc* pDoc = (CFFTDoc*)GetActiveDocument();//当前并无活动的Document
	switch (wParam)
	{
		case NM_OB_ITEMCLICK:
		// cast the lParam to an integer to get the clicked item
			{
				int index = (int) lParam;
				int folder=wndBar.GetFolderData();
				CString cs, cs1;
				cs1 = wndBar.GetItemText(index);
				cs.Format("Clicked on %d - <%s>", (int)lParam, cs1);
//				AfxMessageBox(cs);
				SetActiveView(NULL);
//				BOOL  sendresult=SendMessage(WM_MSG_WAVE,folder,lParam);
//				pDoc->M=folder;
					//SendMessage(WM_MSG_WAVE,folder,lParam);
				//GetOwner()->SendMessage(WM_MSG_WAVE,folder,lParam);
				switch(folder)
				{case 0:pDoc->wtype=index;if(pDoc->m_fop)pDoc->OnFileOpen();break;
				 case 1:pDoc->ntype=index;break;
				 case 2:pDoc->m_bPower=false;
				        switch(index)
						{case 0:pDoc->Square();break;
						 case 1:pDoc->SinWave();break;
						 case 2:pDoc->fSigFloat();break;
						 default:break;
						};
				        break;
				case 3: pDoc->m_bPower=true;
					    switch(index)
						{case 0:pDoc->fSigFloat();break;
						 case 1:pDoc->OnFileOpen();break;
						 case 2:pDoc->Closefp();break;
						};break;
				default:break;
				};
			}
		return 0;

		case NM_OB_ONLABELENDEDIT:
		// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited item
		// return 1 to do the change and 0 to cancel it
			{
				OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;
				TRACE2("Editing item %d, new text:%s\n", pOI->index, pOI->cText);
			}
		return 1;

		case NM_OB_ONGROUPENDEDIT:
		// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited folder
		// return 1 to do the change and 0 to cancel it
			{
				OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;
				TRACE2("Editing folder %d, new text:%s\n", pOI->index, pOI->cText);
			}
		return 1;

		case NM_OB_DRAGITEM:
		// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the dragged items
		// return 1 to do the change and 0 to cancel it
			{
				OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;
				TRACE2("Drag item %d at position %d\n", pOI->iDragFrom, pOI->iDragTo);
			}
		return 1;
	}
	return 0;
}

CDocument* CMainFrame::GetActiveDocument() 
{
	
	return (CFrameWnd::GetActiveDocument());
}

void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	CDocument* pDoc = GetActiveDocument();
	CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CMainFrame::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CTime t = CTime::GetCurrentTime();
	CString str;
	str.Format("%d年%d月%d日 %d:%d:%d",t.GetYear(),t.GetMonth(),t.GetDay(),
		t.GetHour(),t.GetMinute(),t.GetSecond());
	m_wndStatusBar.SetPaneText(2,str);
    str.Format("中心频率:%fKHz; 高度:%d dm",pDoc->m_cfreq,pDoc->m_chigh);
    m_wndStatusBar.SetPaneText(1,str);
	m_animIcon.ShowNextImage();
	CFrameWnd::OnTimer(nIDEvent);
}

void CMainFrame::OnDestroy() 
{
	CFrameWnd::OnDestroy();
	// TODO: Add your message handler code here
	if(m_timerID != 0)
		KillTimer(m_timerID);
}
void CMainFrame::OnUpdateKeyShift(CCmdUI *pCmdUI)
{
	pCmdUI->Enable(::GetKeyState(VK_SHIFT)<0);
}

⌨️ 快捷键说明

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