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

316 lines
8.8 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <mdiwin/filehelp.hpp>
#include <mdiwin/main.hpp>
#include <mdiwin/view.hpp>
#include <mdiwin/viewcntr.hpp>
#include <mdiwin/slidesel.hpp>
#include <mdiwin/frame.hpp>
#include <mdiwin/mdiwin.h>
char Frame::szClassName[]="Windows Graphic View";
char Frame::szMenuName[]="mdiMainMenu";
HINSTANCE Frame::smhInstance=0;
Frame::Frame()
: mhClientWindow(0), mhAccelerator(0), mhMainMenu(0)
{
mhMainMenu=::LoadMenu(smhInstance,(LPSTR)szMenuName);
::CreateWindow(szClassName,szClassName, // since I am assigning mhMainMenu to
WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN, // the frame window, It is not necessary
CW_USEDEFAULT,CW_USEDEFAULT, // to destroy it. However, I am inclined
CW_USEDEFAULT,CW_USEDEFAULT, // to perform the check in DTOR anyway.
NULL,mhMainMenu,smhInstance,(LPSTR)this);
Show(SW_SHOW);
Update();
Main::smlpStatusBar=new BWindow(GetHandle());
}
Frame::~Frame()
{
if(mhMainMenu&&::IsMenu(mhMainMenu))::DestroyMenu(mhMainMenu);
if(Main::smlpStatusBar)delete Main::smlpStatusBar;
}
void Frame::Register(HINSTANCE hInstance)
{
WNDCLASS wndClass;
smhInstance=hInstance;
wndClass.style =CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc =(WNDPROC)FrameWindow::FrameWndProc;
wndClass.cbClsExtra =0;
wndClass.cbWndExtra =sizeof(Frame*);
wndClass.hInstance =hInstance;
wndClass.hIcon =::LoadIcon(hInstance,String(STRING_LITERAL944,hInstance));
wndClass.hCursor =::LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground =(HBRUSH)(COLOR_APPWORKSPACE+1);
wndClass.lpszMenuName =0;
wndClass.lpszClassName =szClassName;
::RegisterClass(&wndClass);
}
int Frame::messageLoop(void)
{
MSG msg;
while(::GetMessage(&msg,NULL,0,0))
{
if(!::TranslateMDISysAccel(getClientHandle(),&msg) &&
!::TranslateAccelerator(GetHandle(),mhAccelerator,&msg))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
return msg.wParam;
}
void Frame::createMDIClientWindow(void)
{
CLIENTCREATESTRUCT clientCreate;
if(getClientHandle())return;
clientCreate.hWindowMenu=::GetSubMenu(mhMainMenu,0);
clientCreate.idFirstChild=idFirstMDIChild;
setClientHandle(::CreateWindow((LPSTR)"MDICLIENT",
NULL,WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE|MDIS_ALLCHILDSTYLES,
0,0,0,0,GetHandle(),(HMENU)1,
smhInstance,(CLIENTCREATESTRUCT FAR *)&clientCreate));
}
void Frame::selectViewItem(int itemType)
{
int size;
String gifExtensionString(STRING_ASTERISKDOTGIF,Main::processInstance());
String bmpExtensionString(STRING_ASTERISKDOTBMP,Main::processInstance());
char pathFileName[MaxFileName];
SelectFile selector(GetHandle(),SelectFile::Read);
switch(itemType)
{
case MENU_LOAD_GIF :
selector.SetFileSpec(gifExtensionString);
break;
case MENU_LOAD_BITMAP :
selector.SetFileSpec(bmpExtensionString);
break;
}
if(selector.GetFileName(pathFileName,sizeof(pathFileName)))
{
size=(int)mViewWindow.size();
mViewWindow.insert(&ViewWindow());
mViewWindow[size].showWindow(getClientHandle(),pathFileName,Main::smlpStatusBar,mhMainMenu);
}
if(1==mViewWindow.size())updateMenu();
}
void Frame::selectSlideItem(void)
{
Block<String> pathFileNames;
size_t size;
SlideSelect slideSelect(GetHandle());
if(slideSelect.selectSlides(pathFileNames))
{
size=(int)mSlideWindow.size();
mSlideWindow.insert(&SlideWindow());
mSlideWindow[size].showWindow(getClientHandle(),pathFileNames,Main::smlpStatusBar,mhMainMenu);
}
if(1==mSlideWindow.size())updateMenu();
}
void Frame::watchDocumentWindows(void)
{
WORD size;
size=(int)mViewWindow.size();
for(int i=0;i<size;i++)
{
if(mViewWindow[i].isDestroyed())
{
mViewWindow.remove(i);
size=(int)mViewWindow.size();
i=0;
}
}
size=(int)mSlideWindow.size();
if(!size)return;
for(i=0;i<size;i++)
{
if(mSlideWindow[i].isDestroyed())
{
mSlideWindow.remove(i);
size=(int)mSlideWindow.size();
i=0;
}
}
}
void Frame::setAcceleratorTable(char *accelerator)
{
if(!accelerator)return;
mhAccelerator=::LoadAccelerators(smhInstance,(LPSTR)accelerator);
}
WORD Frame::processCommand(WPARAM wParam,LPARAM lParam)
{
HWND hChildWindow;
hChildWindow=(HWND)LOWORD(::SendMessage(getClientHandle(),WM_MDIGETACTIVE,0,0L));
if(::IsWindow(hChildWindow))::SendMessage(hChildWindow,WM_COMMAND,wParam,lParam);
return FALSE;
}
void Frame::paint(void)
{
PAINTSTRUCT ps;
::InvalidateRect(GetHandle(),NULL,TRUE);
::BeginPaint(GetHandle(),&ps);
::EndPaint(GetHandle(),&ps);
}
long Frame::WndProc(UINT message,WPARAM wParam,LPARAM lParam)
{
watchDocumentWindows();
switch(message)
{
case WM_REACTIVATE :
if(::IsIconic(GetHandle()))::ShowWindow(GetHandle(),SW_RESTORE);
else ::SetActiveWindow(GetHandle());
return 0;
case WM_CREATE :
createMDIClientWindow();
updateMenu();
return FALSE;
case WM_SIZE :
if(Main::smlpStatusBar)
::SendMessage(Main::smlpStatusBar->GetHandle(),WM_SIZE,wParam,lParam);
break;
case WM_PAINT :
paint();
if(Main::smlpStatusBar)
::SendMessage(Main::smlpStatusBar->GetHandle(),WM_PAINT,wParam,lParam);
break;
case WM_QUERYENDSESSION :
case WM_CLOSE :
::SendMessage(GetHandle(),WM_COMMAND,IDM_CLOSEALL,0L);
if(0!=::GetWindow(getClientHandle(),GW_CHILD))return FALSE;
break;
case WM_DESTROY :
::PostQuitMessage(0);
return FALSE;
case WM_COMMAND :
switch(GET_WM_COMMAND_ID(wParam,lParam))
{
case IDM_CASCADE :
::SendMessage(getClientHandle(),WM_MDICASCADE,0,0L);
return FALSE;
case IDM_TILE :
::SendMessage(getClientHandle(),WM_MDITILE,0,0L);
return FALSE;
case IDM_ARRANGE :
::SendMessage(getClientHandle(),WM_MDIICONARRANGE,0,0L);
return FALSE;
case IDM_CLOSEALL :
::EnumChildWindows(getClientHandle(),(WNDENUMPROC)enumerateProcedure,MAKELONG(IDM_CLOSEALL,0));
return FALSE;
case IDM_MINIMIZEALL :
::EnumChildWindows(getClientHandle(),(WNDENUMPROC)enumerateProcedure,MAKELONG(IDM_MINIMIZEALL,0));
::SendMessage(getClientHandle(),WM_MDIICONARRANGE,0,0L);
return FALSE;
case IDM_RESTOREALL :
::EnumChildWindows(getClientHandle(),(WNDENUMPROC)enumerateProcedure,MAKELONG(IDM_RESTOREALL,0));
::SendMessage(getClientHandle(),WM_MDICASCADE,0,0L);
return FALSE;
case IDM_GETWINLIST :
handleWindowListRequest((HWND)LOWORD(lParam));
break;
case IDM_INVALIDATEMDIWINDOWS :
handleInvalidateRequest((HWND)LOWORD(lParam));
break;
case MENU_LOAD_GIF :
case MENU_LOAD_BITMAP :
selectViewItem(GET_WM_COMMAND_ID(wParam,lParam));
return FALSE;
case MENU_SLIDE_SELECT :
selectSlideItem();
return FALSE;
case MENU_FILE_EXIT :
::SendMessage(GetHandle(),WM_CLOSE,0,0L);
return FALSE;
default :
processCommand(wParam,lParam);
break;
}
}
return ::DefFrameProc(GetHandle(),getClientHandle(),message,wParam,lParam);
}
int FAR PASCAL Frame::enumerateProcedure(HWND hWnd,LPARAM lParam)
{
if(::GetWindow(hWnd,GW_OWNER))return 1;
switch(LOWORD(lParam))
{
case IDM_CLOSEALL :
::SendMessage(::GetParent(hWnd),WM_MDIRESTORE,(WPARAM)hWnd,0L);
if(!::SendMessage(hWnd,WM_QUERYENDSESSION,0,0L))return 1;
::SendMessage(::GetParent(hWnd),WM_MDIDESTROY,(WPARAM)hWnd,0L);
break;
case IDM_RESTOREALL :
if(::IsIconic(hWnd)||::IsZoomed(hWnd))
::ShowWindow(hWnd,SW_RESTORE);
break;
case IDM_MINIMIZEALL :
if(!::IsIconic(hWnd))::ShowWindow(hWnd,SW_SHOWMINIMIZED);
break;
}
return 1;
}
void Frame::handleWindowListRequest(HWND hOwnerWindow)
{
Block<ViewContainer> *lpDataBlock=new Block<ViewContainer>;
size_t size((int)mViewWindow.size());
size_t ownerIndex(0);
for(int i=0;i<size;i++)
if(hOwnerWindow==mViewWindow[i].handle()){ownerIndex=i;break;}
if(i>=size)return;
for(i=0;i<size;i++)
{
if(i==ownerIndex)continue;
if(mViewWindow[ownerIndex].width()!=mViewWindow[i].width())continue;
if(mViewWindow[ownerIndex].height()!=mViewWindow[i].height())continue;
if(mViewWindow[i].hasMesh())lpDataBlock->insert(&ViewContainer(&mViewWindow[i]));
}
::PostMessage(hOwnerWindow,WM_COMMAND,IDM_WINLIST,(LPARAM)(lpDataBlock));
}
void Frame::handleInvalidateRequest(HWND hExcludeWnd)
{
size_t size((int)mViewWindow.size());
HDC hDC;
for(int i=0;i<size;i++)
{
if(::IsWindow(mViewWindow[i].handle())&&mViewWindow[i].handle()!=hExcludeWnd)
{
hDC=::GetDC(mViewWindow[i].handle());
::SendMessage(mViewWindow[i].handle(),WM_ERASEBKGND,(WPARAM)hDC,0L);
::ReleaseDC(mViewWindow[i].handle(),hDC);
::InvalidateRect(mViewWindow[i].handle(),0,FALSE);
mViewWindow[i].showMesh();
}
}
size=(int)mSlideWindow.size();
for(i=0;i<size;i++)
{
if(::IsWindow(mSlideWindow[i].handle())&&mSlideWindow[i].handle()!=hExcludeWnd)
{
hDC=::GetDC(mSlideWindow[i].handle());
::SendMessage(mSlideWindow[i].handle(),WM_ERASEBKGND,(WPARAM)hDC,0L);
::ReleaseDC(mSlideWindow[i].handle(),hDC);
::InvalidateRect(mSlideWindow[i].handle(),0,FALSE);
}
}
}