// ZDSPCTestDlg.cpp : implementation file // #include "stdafx.h" #include "ZDSPCTest.h" #include "ZDSPCTestDlg.h" #include "Zdspcdll.h" #include "mmsystem.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CZDSPCTestDlg dialog CZDSPCTestDlg::CZDSPCTestDlg(CWnd* pParent /*=NULL*/) : CDialog(CZDSPCTestDlg::IDD, pParent) { //{{AFX_DATA_INIT(CZDSPCTestDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CZDSPCTestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CZDSPCTestDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CZDSPCTestDlg, CDialog) //{{AFX_MSG_MAP(CZDSPCTestDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_BN_CLICKED(IDC_BUTTON3, OnButton3) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CZDSPCTestDlg message handlers BOOL CZDSPCTestDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon MessageBox("Just to warn you, in the project settings, you have to link to winmm.lib in order to get the retunred errors from the device. If you don't, you will get compile errors until you get rid of the mmsystem shit for returning errors. Other than that, you can put it into your own project without any trouble. But remember to put it in if you don't want the errors. :) Just press Play to start."); m_Playing = 0; return TRUE; // return TRUE unless you set the focus to a control } void CZDSPCTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CZDSPCTestDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CZDSPCTestDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CZDSPCTestDlg::OnButton1() // Play the SPC { static char BASED_CODE szFilter[]="SPC Music Files|*.spc;*.sp1;*.sp2;*.sp3;*.sp4;*.sp5;*.sp6;*.sp7;*.sp8;*.sp9|All Files (*.*)|*.*||"; CFileDialog fileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFilter,this); CFile file; fileDlg.m_ofn.lpstrTitle = "Please select an SPC file."; if(fileDlg.DoModal()==IDOK){ CString cstrFName=fileDlg.GetFileName(); m_Paused = 0; MMRESULT mmResult; int iChan=2,iBits=16,iFreq=32000,iVM=4; //Default, you can change if you want. if((mmResult=InitialiseSPC(SPC_SND|SPC_APU,iChan,iBits,iFreq,iVM))!=MMSYSERR_NOERROR) { //Oops, The soundcard is in use. char szBuffer[MAXERRORLENGTH]; waveOutGetErrorText(mmResult,szBuffer,MAXERRORLENGTH); MessageBox(szBuffer,"Failed to initialize ZD-SPC DLL..."); return; }else{ if((LoadSPC(cstrFName))==0){ PlaySPC(); m_Playing = 1; } } } } void CZDSPCTestDlg::OnButton2() //Pause the SPC { if(m_Paused){ PlaySPC(); m_Paused = 0; }else{ PauseSPC(); m_Paused = 1; } } void CZDSPCTestDlg::OnButton3() //Stop the SPC { if(m_Playing){ PauseSPC(); RestoreSPC(); DeinitialiseSPC(SPC_SND|SPC_APU); m_Playing = 0; } } BOOL CZDSPCTestDlg::DestroyWindow() { OnButton3(); return CDialog::DestroyWindow(); }