#include #include #include #include #include #include #include #include char MainWindow::szClassName[]="WaveUtil"; char MainWindow::szMenuName[]="WaveMenu"; MainWindow::MainWindow(HINSTANCE hInstance) : mPaintHandler(this,&MainWindow::paintHandler), mDestroyHandler(this,&MainWindow::destroyHandler), mCommandHandler(this,&MainWindow::commandHandler), mKeyDownHandler(this,&MainWindow::keyDownHandler), mSizeHandler(this,&MainWindow::sizeHandler), mCreateHandler(this,&MainWindow::createHandler), mTimerHandler(this,&MainWindow::timerHandler), mDrawItemHandler(this,&MainWindow::drawItemHandler), mNotifyHandler(this,&MainWindow::notifyHandler), mhInstance(hInstance), mOwnerDraw(OwnerDraw::UseInstance) { insertHandlers(); registerClass(); createWindow(WS_EX_ACCEPTFILES|WS_EX_WINDOWEDGE|WS_EX_LEFT|WS_EX_LTRREADING|WS_EX_RIGHTSCROLLBAR,szClassName,szClassName, WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|WS_CLIPCHILDREN|WS_BORDER|WS_DLGFRAME|WS_SYSMENU|WS_THICKFRAME|WS_GROUP, Rect(CW_USEDEFAULT,CW_USEDEFAULT,InitialWidth,InitialHeight), NULL,NULL,mhInstance,(LPSTR)this); show(SW_SHOW); update(); if(!mTrackBar.createTrackBar(*this,Rect(10,12,348,30),TrackBarID,TRUE))::MessageBeep(0); mTrackBar.setRange(1,100); mTrackBar.setPos(1); mTrackBar.insertHandler(TrackBar::NotifyEndTrack,&mNotifyHandler); mControl.createControl("BUTTON","",WS_VISIBLE|WS_DISABLED|BS_OWNERDRAW,Rect(10,42,16,16),*this,PlayID); } MainWindow::~MainWindow() { destroy(); } void MainWindow::insertHandlers(void) { insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler); insertHandler(VectorHandler::PaintHandler,&mPaintHandler); insertHandler(VectorHandler::CommandHandler,&mCommandHandler); insertHandler(VectorHandler::SizeHandler,&mSizeHandler); insertHandler(VectorHandler::KeyDownHandler,&mKeyDownHandler); insertHandler(VectorHandler::CreateHandler,&mCreateHandler); insertHandler(VectorHandler::TimerHandler,&mTimerHandler); insertHandler(VectorHandler::DrawItemHandler,&mDrawItemHandler); } void MainWindow::removeHandlers(void) { removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler); removeHandler(VectorHandler::PaintHandler,&mPaintHandler); removeHandler(VectorHandler::CommandHandler,&mCommandHandler); removeHandler(VectorHandler::SizeHandler,&mSizeHandler); removeHandler(VectorHandler::KeyDownHandler,&mKeyDownHandler); removeHandler(VectorHandler::CreateHandler,&mCreateHandler); removeHandler(VectorHandler::TimerHandler,&mTimerHandler); removeHandler(VectorHandler::DrawItemHandler,&mDrawItemHandler); } void MainWindow::registerClass(void)const { WNDCLASS wndClass; if(::GetClassInfo(mhInstance,className(),(WNDCLASS FAR*)&wndClass))return; wndClass.style =CS_VREDRAW|CS_HREDRAW||CS_DBLCLKS; wndClass.lpfnWndProc =(WNDPROC)Window::WindowWndProc; wndClass.cbClsExtra =0; wndClass.cbWndExtra =sizeof(MainWindow*); wndClass.hInstance =mhInstance; wndClass.hIcon =::LoadIcon(NULL,IDI_APPLICATION); wndClass.hCursor =::LoadCursor(NULL,IDC_ARROW); wndClass.hbrBackground =(HBRUSH)::GetStockObject(LTGRAY_BRUSH); wndClass.lpszMenuName =szMenuName; wndClass.lpszClassName =szClassName; ::RegisterClass(&wndClass); assert(0!=::GetClassInfo(mhInstance,className(),(WNDCLASS FAR*)&wndClass)); } CallbackData::ReturnType MainWindow::destroyHandler(CallbackData &/*someCallbackData*/) { removeHandlers(); ::PostQuitMessage(0); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::sizeHandler(CallbackData &/*someCallbackData*/) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::keyDownHandler(CallbackData &/*someCallbackData*/) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::paintHandler(CallbackData &someCallbackData) { Rect winRect; Pen whitePen(RGBColor(255,255,255)); PaintInformation &paintInformation=(*((PaintInformation*)someCallbackData.lParam())); windowRect(winRect); ((PureDevice&)paintInformation).line(Point(1,5),Point(winRect.right(),5),whitePen); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::timerHandler(CallbackData &/*someCallbackData*/) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::drawItemHandler(CallbackData &someCallbackData) { if(PlayID==((LPDRAWITEMSTRUCT)someCallbackData.lParam())->CtlID) mOwnerDraw.handleOwnerButton(PlayID,someCallbackData.lParam()); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::createHandler(CallbackData &/*someCallbackData*/) { mOwnerDraw.associate(PlayID,String("PLAY"),String("PLAY"),String("PLAYDN"),String("PLAYDA"),OwnerDraw::NOFOCUS); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::notifyHandler(CallbackData &someCallbackData) { int sliderPos(mTrackBar.getPos()); if(!sliderPos)return (CallbackData::ReturnType)sliderPos; return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::commandHandler(CallbackData &someCallbackData) { switch(someCallbackData.wmCommandID()) { case WAVEMENU_OPEN : handleFileOpenEvent(); break; case WAVEMENU_EXIT : postMessage(*this,WM_CLOSE,0,0L); break; case PlayID : handlePlay(); break; } return (CallbackData::ReturnType)FALSE; } void MainWindow::handleFileOpenEvent(void) { String fileHeading("FILES"); String exeSection("WAV"); OpenDialog openFileName; openFileName.owner(0); openFileName.instance(processInstance()); openFileName.filter("Wav"); openFileName.filterPattern("*.wav"); openFileName.fileName("*.WAV"); openFileName.fileTitle("FOO"); openFileName.initialDirectory("."); openFileName.title("Open File"); openFileName.creationFlags(OpenDialog::EXPLORER); if(!openFileName.getOpenFileName())return; PureWave pureWave(processInstance()); WaveForm waveForm(openFileName.fileName()); if(!waveForm.isOkay()) { ::MessageBox(*this,openFileName.fileName(),(LPSTR)"Unknown format",MB_OK); return; } mPathFileName=openFileName.fileName(); ::EnableWindow(mControl,TRUE); } void MainWindow::handlePlay(void) { if(mPathFileName.isNull())return; PureWave pureWave(processInstance()); WaveForm waveForm(mPathFileName); if(!waveForm.isOkay())return; ((FormatChunk&)waveForm).samplesPerSecond(((FormatChunk&)waveForm).samplesPerSecond()/2); ((FormatChunk&)waveForm).averageBytesPerSecond(((FormatChunk&)waveForm).averageBytesPerSecond()/2); pureWave.play(waveForm,DeviceHandler::Wait); }