#include #include #include #include #include #include #include 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 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;iGetHandle(),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 _export 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 *lpDataBlock=new Block; size_t size((int)mViewWindow.size()); size_t ownerIndex(0); for(int i=0;i=size)return; for(i=0;iinsert(&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