Files
Work/wave/MAINWND.CPP
2024-08-07 09:16:27 -04:00

195 lines
6.5 KiB
C++

#include <wave/mainwnd.hpp>
#include <wave/wave.hpp>
#include <common/opendlg.hpp>
#include <common/pen.hpp>
#include <common/purehdc.hpp>
#include <sample/puresmpl.hpp>
#include <sample/wave.hpp>
#include <sample/purewave.hpp>
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);
}