Files
Work/mdiwin/SLIDE.CPP
2024-08-07 09:16:27 -04:00

210 lines
6.3 KiB
C++

#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <mdiwin/slide.hpp>
#include <mdiwin/main.hpp>
#include <mdiwin/mdiwin.h>
char SlideWindow::szClassName[]="SlideShow";
char SlideWindow::szMenuName[]="";
HINSTANCE SlideWindow::smhInstance=0;
SlideWindow::SlideWindow()
: mhClientWindow(0), mhFrameWindow(0), mIsDestroyed(0), mpStatusBar(0),
mhSystemMenu(0), mhFrameMenu(0), mhSlideMenu(0), mlpToolBar(0),
mCurrentFrame(0), mToolbarVisibility(TRUE), mIsRunning(TRUE)
{
}
SlideWindow::SlideWindow(const SlideWindow &/*someViewWindow*/)
: mhClientWindow(0), mhFrameWindow(0), mIsDestroyed(0), mpStatusBar(0),
mhSystemMenu(0), mhFrameMenu(0), mhSlideMenu(0), mlpToolBar(0),
mCurrentFrame(0), mToolbarVisibility(TRUE), mIsRunning(TRUE)
{
}
SlideWindow::~SlideWindow()
{
if(mhSlideMenu)::DestroyMenu(mhSlideMenu);
if(!mIsDestroyed&&GetHandle())
::SendMessage(mhClientWindow,WM_MDIDESTROY,(WPARAM)GetHandle(),0L);
if(mlpToolBar)delete mlpToolBar;
}
void SlideWindow::Register(HINSTANCE hInstance)
{
WNDCLASS wndclass;
smhInstance=hInstance;
wndclass.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
wndclass.lpfnWndProc =(WNDPROC)MDIWindow::MDIWndProc;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =sizeof(SlideWindow*);
wndclass.hInstance =hInstance;
wndclass.hIcon =::LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor =::LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground =(HBRUSH)::GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName =szMenuName;
wndclass.lpszClassName =szClassName;
::RegisterClass(&wndclass);
}
void SlideWindow::showWindow(HWND hClientWindow,Block<String> &pathFileNames,BWindow *statusBar,HMENU hFrameMenu)
{
size_t size((int)pathFileNames.size());
mBitmaps.size(size);
waitCursor(TRUE);
for(int i=0;i<size;i++)mBitmaps[i]=pathFileNames[i];
waitCursor(FALSE);
mhFrameMenu=hFrameMenu;
mhSlideMenu=::LoadMenu(smhInstance,(LPSTR)"slideMenu");
mhClientWindow=hClientWindow;
mhFrameWindow=::GetParent(mhClientWindow);
mpStatusBar=statusBar;
createMDIChildWindow();
createToolBarWindow();
}
void SlideWindow::createMDIChildWindow(void)
{
MDICREATESTRUCT createStruct;
createStruct.szClass=(LPSTR)szClassName;
createStruct.szTitle=(LPSTR)szClassName;
createStruct.hOwner=smhInstance;
createStruct.x=CW_USEDEFAULT;
createStruct.y=CW_USEDEFAULT;
createStruct.cx=CW_USEDEFAULT;
createStruct.cy=CW_USEDEFAULT;
createStruct.style=WS_SYSMENU|WS_CAPTION|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE|WS_CLIPCHILDREN;
createStruct.lParam=(LONG)this;
::SendMessage(mhClientWindow,WM_MDICREATE,0,(LONG)(LPMDICREATESTRUCT)&createStruct);
Show(SW_SHOW);
Update();
}
void SlideWindow::createToolBarWindow(void)
{
mlpToolBar=new ToolBar(GetHandle(),String(STRING_LITERALTOOLBAR,Main::processInstance()));
mlpToolBar->addBitmap(String(STRING_LITERALEJECT,Main::processInstance()),WM_COMMAND,MENU_TBEJECT,0L);
mlpToolBar->addBitmap(String(STRING_LITERALPAUSE,Main::processInstance()),WM_COMMAND,MENU_TBPAUSE,0L);
mlpToolBar->addBitmap(String(STRING_LITERALPLAY,Main::processInstance()),WM_COMMAND,MENU_TBPLAY,0L);
mlpToolBar->addBitmap(String(STRING_LITERALTIME,Main::processInstance()),WM_COMMAND,MENU_TBTIME,0L);
mlpToolBar->showWindow();
}
void SlideWindow::handleDestroyEvent()
{
mIsDestroyed=TRUE;
return;
}
void SlideWindow::handleActivateEvent(WPARAM wParam,LPARAM /*lParam*/)
{
if(wParam)
{
::SetTimer(GetHandle(),idTimer,TimeOut,0);
::SendMessage(mhClientWindow,WM_MDISETMENU,FALSE,MAKELONG(mhSlideMenu,::GetSubMenu(mhSlideMenu,0)));
if(mToolbarVisibility && mlpToolBar && !mlpToolBar->isVisible())mlpToolBar->showWindow();
else if(!mToolbarVisibility && mlpToolBar && mlpToolBar->isVisible())mlpToolBar->showWindow(FALSE);
::SendMessage(mhFrameWindow,WM_COMMAND,IDM_INVALIDATEMDIWINDOWS,MAKELPARAM(GetHandle(),0));
}
else
{
::KillTimer(GetHandle(),idTimer);
if(mlpToolBar && mlpToolBar->isVisible())mlpToolBar->showWindow(FALSE);
::SendMessage(mhClientWindow,WM_MDISETMENU,FALSE,MAKELONG(mhFrameMenu,0));
}
::DrawMenuBar(mhFrameWindow);
return;
}
long SlideWindow::WndProc(UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CREATE :
return FALSE;
case WM_TIMER :
handleTimerEvent();
return FALSE;
case WM_PAINT :
Paint();
return FALSE;
case WM_MDIACTIVATE :
handleActivateEvent(wParam,lParam);
return FALSE;
case WM_QUERYENDSESSION :
break;
case WM_DESTROY :
handleDestroyEvent();
return FALSE;
case WM_COMMAND :
switch(GET_WM_COMMAND_ID(wParam,lParam))
{
case IDM_TOOLBAR :
handleToolbarToggle();
return FALSE;
case MENU_TBEJECT :
::SendMessage(GetHandle(),WM_CLOSE,0,0L);
return FALSE;
case MENU_TBPAUSE :
mIsRunning=FALSE;
return FALSE;
case MENU_TBPLAY :
mIsRunning=TRUE;
return FALSE;
case MENU_TBTIME :
return FALSE;
default :
break;
}
}
return ::DefMDIChildProc(GetHandle(),message,wParam,lParam);
}
void SlideWindow::handleToolbarToggle(void)
{
String showToolbarString(STRING_SHOWTOOLBAR,Main::processInstance());
String hideToolbarString(STRING_HIDETOOLBAR,Main::processInstance());
String menuString;
::GetMenuString(mhSlideMenu,IDM_TOOLBAR,menuString,String::MaxString,MF_BYCOMMAND);
if(showToolbarString==menuString)
{
::ModifyMenu(mhSlideMenu,IDM_TOOLBAR,MF_STRING|MF_ENABLED,IDM_TOOLBAR,(LPSTR)hideToolbarString);
mlpToolBar->showWindow(TRUE);
mToolbarVisibility=TRUE;
}
else
{
::ModifyMenu(mhSlideMenu,IDM_TOOLBAR,MF_STRING|MF_ENABLED,IDM_TOOLBAR,(LPSTR)showToolbarString);
mlpToolBar->showWindow(FALSE);
mToolbarVisibility=FALSE;
}
::DrawMenuBar(GetHandle());
}
void SlideWindow::Paint(void)
{
PAINTSTRUCT ps;
int isActiveWindow;
::BeginPaint(GetHandle(),&ps);
isActiveWindow=GetHandle()==(HWND)LOWORD(::SendMessage(mhClientWindow,WM_MDIGETACTIVE,0,0L));
isActiveWindow=FALSE;
mBitmaps[mCurrentFrame].displayBitmap(GetHandle(),0,isActiveWindow,FALSE);
::EndPaint(GetHandle(),&ps);
}
void SlideWindow::handleTimerEvent(void)
{
if(mIsRunning)
{
int isActiveWindow(GetHandle()==(HWND)LOWORD(::SendMessage(mhClientWindow,WM_MDIGETACTIVE,0,0L)));
isActiveWindow=FALSE;
mBitmaps[mCurrentFrame++].displayBitmap(GetHandle(),0,isActiveWindow,FALSE);
if(mCurrentFrame>=mBitmaps.size())mCurrentFrame=0;
}
}