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

246 lines
9.0 KiB
C++

#include <vidcap/mainwnd.hpp>
#include <vidcap/rsrc.hpp>
#include <vidcap/entrydlg.hpp>
#include <vidcap/srcdlg.hpp>
#include <vidcap/vidreg.hpp>
#include <common/assert.hpp>
#include <common/profile.hpp>
char MainWindow::szClassName[]="Video Capture";
char MainWindow::szMenuName[]="CAPMENU";
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),
mhInstance(hInstance)
{
insertHandlers();
registerClass();
::CreateWindow(szClassName,szClassName,
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_DLGFRAME|WS_CLIPCHILDREN|WS_SIZEBOX,
CW_USEDEFAULT,CW_USEDEFAULT,
DefaultWidth,DefaultHeight,
NULL,NULL,mhInstance,(LPSTR)this);
mStatusBar=new StatusBarEx(*this,StatusBarID);
mStatusBar.disposition(PointerDisposition::Delete);
show(SW_SHOW);
update();
}
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);
}
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);
}
void MainWindow::registerClass(void)const
{
WNDCLASS wndClass;
if(::GetClassInfo(mhInstance,className(),(WNDCLASS FAR*)&wndClass))return;
wndClass.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS|CS_OWNDC;
wndClass.lpfnWndProc =(WNDPROC)Window::WndProc;
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(GRAY_BRUSH);
wndClass.lpszMenuName =szMenuName;
wndClass.lpszClassName =szClassName;
::RegisterClass(&wndClass);
assert(0!=::GetClassInfo(mhInstance,className(),(WNDCLASS FAR*)&wndClass));
}
CallbackData::ReturnType MainWindow::createHandler(CallbackData &/*someCallbackData*/)
{
mMainMenu=new PureMenu(::GetMenu(*this));
mMainMenu.disposition(PointerDisposition::Delete);
return (CallbackData::ReturnType)FALSE;
}
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*/)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MainWindow::timerHandler(CallbackData &/*someCallbackData*/)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MainWindow::commandHandler(CallbackData &someCallbackData)
{
switch(someCallbackData.wmCommandID())
{
case FILE_EXIT :
close();
destroy();
break;
case FILE_OPEN :
handleFileOpen();
break;
case FILE_CLOSE :
handleFileClose();
break;
case CAPMENU_OPTIONS_SAVE_FRAMES :
handleSaveFrames();
break;
case CAPMENU_OPTIONS_PREVIEW :
handlePreview();
break;
case CAPMENU_OPTIONS_GRABFRAME :
mBitmapCapture->grabFrame();
break;
case CAPMENU_OPTIONS_GRABFRAMENOSTOP :
mBitmapCapture->grabFrameNoStop();
break;
case CAPMENU_DIALOGVIDEODISPLAY :
mBitmapCapture->dialogVideoDisplay();
break;
case CAPMENU_DIALOGVIDEOSOURCE :
mBitmapCapture->dialogVideoSource();
break;
case CAPMENU_DIALOGVIDEOFORMAT :
mBitmapCapture->dialogVideoFormat();
break;
case CAPMENU_SETTINGS :
handleSettings();
break;
}
return (CallbackData::ReturnType)FALSE;
}
void MainWindow::checkDriverOptions(void)
{
DriverCaps driverCaps;
mBitmapCapture->getDriverCaps(driverCaps);
if(!driverCaps.hasDlgVideoDisplay())mMainMenu->checkMenuItem(CAPMENU_DIALOGVIDEODISPLAY,MF_BYCOMMAND|MF_GRAYED);
else mMainMenu->enableMenuItem(CAPMENU_DIALOGVIDEODISPLAY,PureMenu::ByCommand,PureMenu::ItemEnabled);
if(!driverCaps.hasDlgVideoFormat())mMainMenu->checkMenuItem(CAPMENU_DIALOGVIDEOFORMAT,MF_BYCOMMAND|MF_GRAYED);
else mMainMenu->enableMenuItem(CAPMENU_DIALOGVIDEOFORMAT,PureMenu::ByCommand,PureMenu::ItemEnabled);
if(!driverCaps.hasDlgVideoSource())mMainMenu->checkMenuItem(CAPMENU_DIALOGVIDEOSOURCE,MF_BYCOMMAND|MF_GRAYED);
else mMainMenu->enableMenuItem(CAPMENU_DIALOGVIDEOSOURCE,PureMenu::ByCommand,PureMenu::ItemEnabled);
}
void MainWindow::handleFileOpen(void)
{
LRESULT driverIndex;
SourceDialog sourceDialog(*this);
driverIndex=sourceDialog.perform();
if(-1!=driverIndex)
{
if(mBitmapCapture.isOkay())mBitmapCapture.destroy();
mBitmapCapture=new BmpCap(*this,driverIndex); //,vidReg.getPreviewWidth(),vidReg.getPreviewHeight(),vidReg.getCaptureWidth(),vidReg.getCaptureHeight(),vidReg.getCaptureFile());
mBitmapCapture.disposition(PointerDisposition::Delete);
if(!mBitmapCapture->isConnected()){::MessageBox(*this,"Failed to connect to device","Device Connect",MB_ICONSTOP);return;}
else
{
mMainMenu->enableMenuItem(FILE_CLOSE,PureMenu::ByCommand,PureMenu::ItemEnabled);
mMainMenu->enableMenuItem(CAPMENU_OPTIONS_SAVE_FRAMES,PureMenu::ByCommand,PureMenu::ItemEnabled);
mMainMenu->checkMenuItem(CAPMENU_OPTIONS_SAVE_FRAMES,MF_BYPOSITION|MF_UNCHECKED);
mMainMenu->enableMenuItem(CAPMENU_OPTIONS_GRABFRAME,PureMenu::ByCommand,PureMenu::ItemEnabled);
mMainMenu->enableMenuItem(CAPMENU_OPTIONS_GRABFRAMENOSTOP,PureMenu::ByCommand,PureMenu::ItemEnabled);
mMainMenu->enableMenuItem(CAPMENU_OPTIONS_PREVIEW,PureMenu::ByCommand,PureMenu::ItemEnabled);
checkDriverOptions();
}
}
}
void MainWindow::handleFileClose(void)
{
if(mBitmapCapture.isOkay())mBitmapCapture.destroy();
mMainMenu->enableMenuItem(FILE_CLOSE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
mMainMenu->enableMenuItem(CAPMENU_DIALOGVIDEODISPLAY,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
mMainMenu->enableMenuItem(CAPMENU_DIALOGVIDEOFORMAT,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
mMainMenu->enableMenuItem(CAPMENU_DIALOGVIDEOSOURCE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
mMainMenu->enableMenuItem(CAPMENU_OPTIONS_SAVE_FRAMES,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
mMainMenu->checkMenuItem(CAPMENU_OPTIONS_SAVE_FRAMES,MF_BYCOMMAND|MF_UNCHECKED);
mMainMenu->enableMenuItem(CAPMENU_OPTIONS_GRABFRAME,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
mMainMenu->enableMenuItem(CAPMENU_OPTIONS_GRABFRAMENOSTOP,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
mMainMenu->enableMenuItem(CAPMENU_OPTIONS_PREVIEW,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
mMainMenu->checkMenuItem(CAPMENU_OPTIONS_PREVIEW,MF_BYCOMMAND|MF_UNCHECKED);
}
void MainWindow::handleSaveFrames(void)
{
if(!mBitmapCapture->isConnected())return;
if(MF_CHECKED==mMainMenu->getMenuState(CAPMENU_OPTIONS_SAVE_FRAMES,PureMenu::ByCommand))
{
mBitmapCapture->saveFrames(false);
mMainMenu->checkMenuItem(CAPMENU_OPTIONS_SAVE_FRAMES,MF_BYCOMMAND|MF_UNCHECKED);
}
else
{
mBitmapCapture->saveFrames(true);
mMainMenu->checkMenuItem(CAPMENU_OPTIONS_SAVE_FRAMES,MF_BYCOMMAND|MF_CHECKED);
}
}
void MainWindow::handlePreview(void)
{
if(!mBitmapCapture->isConnected())return;
if(MF_CHECKED==mMainMenu->getMenuState(CAPMENU_OPTIONS_PREVIEW,PureMenu::ByCommand))
{
mMainMenu->checkMenuItem(CAPMENU_OPTIONS_PREVIEW,MF_BYCOMMAND|MF_UNCHECKED);
mBitmapCapture->preview(false);
}
else
{
VidReg vidReg;
mMainMenu->checkMenuItem(CAPMENU_OPTIONS_PREVIEW,MF_BYCOMMAND|MF_CHECKED);
mBitmapCapture->setPreviewRate(vidReg.getPreviewRate());
mBitmapCapture->preview(true);
}
}
void MainWindow::handleSettings()
{
EntryDialog entryDialog(*this);
entryDialog.perform();
}