/****************************************************************************/ /* */ /* Copyright (C) 1987-1996 Microsoft Corp. */ /* All Rights Reserved */ /* */ /****************************************************************************/ /****************************** Module Header ******************************* * Module Name: menucmd.c * * Contains routines to dispatch the menu commands. * * History: * ****************************************************************************/ #include "imagedit.h" #include "dialogs.h" #include "ids.h" #include #include STATICFN INT GetHelpContext(INT idSubject, PHELPMAP phmap); /************************************************************************ * InitMenu * * This function grays/enables and checks/unchecks the menu items * appropriately for the given state. * * Arguments: * HMENU hMenu - The menu handle. * * History: * ************************************************************************/ VOID InitMenu( HMENU hMenu) { BOOL fEnable; INT i; MyEnableMenuItem(hMenu, MENU_FILE_SAVE, fImageDirty || fFileDirty); MyEnableMenuItem(hMenu, MENU_FILE_SAVEAS, gpImageHead); MyEnableMenuItem(hMenu, MENU_FILE_LOADCOLORS, gnColors != 2); MyEnableMenuItem(hMenu, MENU_FILE_SAVECOLORS, gnColors != 2); /* * Only enable the option to restore the default colors if this * is not a monochrome palette and at least one of the colors * has been changed. */ fEnable = FALSE; if (gnColors != 2) { for (i = 0; i < COLORSMAX; i++) { if (gargbColor[i] != gargbDefaultColor[i]) { fEnable = TRUE; break; } } } MyEnableMenuItem(hMenu, MENU_FILE_DEFAULTCOLORS, fEnable); MyEnableMenuItem(hMenu, MENU_EDIT_UNDO, ghbmUndo); MyEnableMenuItem(hMenu, MENU_EDIT_RESTORE, gpImageCur && gpImageCur->DIBPtr && fImageDirty); MyEnableMenuItem(hMenu, MENU_EDIT_COPY, gpImageCur); MyEnableMenuItem(hMenu, MENU_EDIT_PASTE, gpImageCur && IsClipboardFormatAvailable(CF_BITMAP)); MyEnableMenuItem(hMenu, MENU_EDIT_CLEAR, gpImageCur); /* * We can add new images if the current image is not a bitmap, * and we have possible new images to add, and there is a current * file being edited. This last case is checked by looking to * see that there is either a current file name, or there is a * current image (the case for new files). */ MyEnableMenuItem(hMenu, MENU_EDIT_NEWIMAGE, giType != FT_BITMAP && ((giType == FT_ICON) ? (gnImages < gnIconDevices) : (gnImages < gnCursorDevices)) && (gpImageCur || gpszFileName)); MyEnableMenuItem(hMenu, MENU_EDIT_SELECTIMAGE, giType != FT_BITMAP && gnImages > 0); MyEnableMenuItem(hMenu, MENU_EDIT_DELETEIMAGE, giType != FT_BITMAP && gnImages > 0); MyCheckMenuItem(hMenu, MENU_OPTIONS_GRID, gfGrid); MyCheckMenuItem(hMenu, MENU_OPTIONS_BRUSH2, gnBrushSize == 2); MyCheckMenuItem(hMenu, MENU_OPTIONS_BRUSH3, gnBrushSize == 3); MyCheckMenuItem(hMenu, MENU_OPTIONS_BRUSH4, gnBrushSize == 4); MyCheckMenuItem(hMenu, MENU_OPTIONS_BRUSH5, gnBrushSize == 5); MyCheckMenuItem(hMenu, MENU_OPTIONS_SHOWCOLOR, gfShowColor); MyCheckMenuItem(hMenu, MENU_OPTIONS_SHOWVIEW, gfShowView); MyCheckMenuItem(hMenu, MENU_OPTIONS_SHOWTOOLBOX, gfShowToolbox); } /************************************************************************ * MenuCmd * * Dispatches all the menu commands. * * Arguments: * * History: * ************************************************************************/ VOID MenuCmd( INT item) { switch (item) { /* * File menu ---------------------------------------------------- */ case MENU_FILE_OPEN: if (VerifySaveFile()) OpenAFile(); break; case MENU_FILE_NEW: if (VerifySaveFile()) { if (DlgBox(DID_RESOURCETYPE, (WNDPROC)ResourceTypeDlgProc) == IDOK) { /* * Clear out the current resource. */ ClearResource(); if (iNewFileType == FT_BITMAP) DlgBox(DID_BITMAPSIZE, (WNDPROC)BitmapSizeDlgProc); else ImageNewDialog(iNewFileType); } } break; case MENU_FILE_SAVE: SaveFile(FALSE); break; case MENU_FILE_SAVEAS: SaveFile(TRUE); break; case MENU_FILE_LOADCOLORS: LoadColorFile(); break; case MENU_FILE_SAVECOLORS: SaveColorFile(); break; case MENU_FILE_DEFAULTCOLORS: RestoreDefaultColors(); break; case MENU_FILE_EXIT: SendMessage(ghwndMain, WM_SYSCOMMAND, SC_CLOSE, 0L); break; /* * Edit menu ---------------------------------------------------- */ case MENU_EDIT_UNDO: ImageUndo(); break; case MENU_EDIT_RESTORE: /* * Reopen the most recently retained image (without * prompting for a save). */ ImageOpen2(gpImageCur); break; case MENU_EDIT_COPY: CopyImageClip(); break; case MENU_EDIT_PASTE: PasteImageClip(); break; case MENU_EDIT_CLEAR: ImageUpdateUndo(); ImageDCClear(); ViewUpdate(); break; case MENU_EDIT_NEWIMAGE: ImageNewDialog(giType); break; case MENU_EDIT_SELECTIMAGE: ImageSelectDialog(); break; case MENU_EDIT_DELETEIMAGE: ImageDelete(); break; /* * Options menu ------------------------------------------------- */ case MENU_OPTIONS_GRID: /* * Toggle the grid state. */ gfGrid ^= TRUE; /* * Repaint the workspace window to show/remove the grid. */ WorkUpdate(); break; case MENU_OPTIONS_BRUSH2: case MENU_OPTIONS_BRUSH3: case MENU_OPTIONS_BRUSH4: case MENU_OPTIONS_BRUSH5: switch (item) { case MENU_OPTIONS_BRUSH2: gnBrushSize = 2; break; case MENU_OPTIONS_BRUSH3: gnBrushSize = 3; break; case MENU_OPTIONS_BRUSH4: gnBrushSize = 4; break; case MENU_OPTIONS_BRUSH5: gnBrushSize = 5; break; } break; case MENU_OPTIONS_SHOWCOLOR: /* * Toggle the state of the color palette. */ gfShowColor = gfShowColor ? FALSE : TRUE; ColorShow(gfShowColor); break; case MENU_OPTIONS_SHOWVIEW: /* * Toggle the state of the view window. */ gfShowView = gfShowView ? FALSE : TRUE; ViewShow(gfShowView); break; case MENU_OPTIONS_SHOWTOOLBOX: /* * Toggle the state of the Toolbox. */ gfShowToolbox = gfShowToolbox ? FALSE : TRUE; ToolboxShow(gfShowToolbox); break; /* * Help menu ---------------------------------------------------- */ case MENU_HELP_CONTENTS: WinHelp(ghwndMain, gszHelpFile, HELP_CONTENTS, 0L); break; case MENU_HELP_SEARCH: /* * Tell winhelp to be sure this app's help file is current, * then invoke a search with an empty starting key. */ WinHelp(ghwndMain, gszHelpFile, HELP_FORCEFILE, 0); WinHelp(ghwndMain, gszHelpFile, HELP_PARTIALKEY, (DWORD)(LPSTR)""); break; case MENU_HELP_ABOUT: DlgBox(DID_ABOUT, (WNDPROC)AboutDlgProc); break; /* * Hidden menu commands (accessed by accelerators) -------------- */ case MENU_HIDDEN_TOCOLORPAL: if (IsWindowVisible(ghwndColor)) SetFocus(ghwndColor); break; case MENU_HIDDEN_TOVIEW: if (IsWindowVisible(ghwndView)) SetFocus(ghwndView); break; case MENU_HIDDEN_TOTOOLBOX: if (IsWindowVisible(ghwndToolbox)) SetFocus(ghwndToolbox); break; case MENU_HIDDEN_TOPROPBAR: SetFocus(ghwndPropBar); break; } } /************************************************************************ * MsgFilterHookFunc * * This is the exported message filter function that is hooked into * the message stream for detecting the pressing of the F1 key, at * which time it calls up the appropriate help. * * Arguments: * * History: * ************************************************************************/ DWORD APIENTRY MsgFilterHookFunc( INT nCode, WPARAM wParam, LPMSG lpMsg) { if ((nCode == MSGF_MENU || nCode == MSGF_DIALOGBOX) && (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F1)) { /* * Display help. */ ShowHelp((nCode == MSGF_MENU) ? TRUE : FALSE); /* * Tell Windows to swallow this message. */ return 1; } return DefHookProc(nCode, wParam, (LONG)lpMsg, &ghhkMsgFilter); } /************************************************************************ * ShowHelp * * This function is called when the user has requested help. It will * look at the menu state (if fMenuHelp is TRUE) or which dialog * is currently up to determine the help topic, then it calls WinHelp. * * Arguments: * BOOL fMenuHelp - TRUE if this help is for a menu (help was requested * in the menu modal loop). If FALSE, general help * or help for a dialog is assumed. * * History: * ************************************************************************/ VOID ShowHelp( BOOL fMenuHelp) { INT nHelpContext = 0; HWND hwndFocus; if (fMenuHelp) { nHelpContext = GetHelpContext(gMenuSelected, gahmapMenu); } else { /* * Look for help for the current dialog. */ if (gidCurrentDlg) { nHelpContext = GetHelpContext(gidCurrentDlg, gahmapDialog); } else { /* * There is no current dialog. Is the window with the * focus a control on the Properties Bar? */ if ((hwndFocus = GetFocus()) && IsChild(ghwndPropBar, hwndFocus)) nHelpContext = GetHelpContext(DID_PROPBAR, gahmapDialog); } } /* * If there is help context, display it. Otherwise display * the Contents screen. */ if (nHelpContext) WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT, nHelpContext); else WinHelp(ghwndMain, gszHelpFile, HELP_CONTENTS, 0L); } /************************************************************************ * GetHelpContext * * This function takes a subject and returns its matching help * context id from the given HELPMAP table. * * Arguments: * INT idSubject - ID of the subject to find the help context for. * PHELPMAP phmap - The help map table. It is assumed that the * last entry in the table has a NULL subject id. * * History: * ************************************************************************/ STATICFN INT GetHelpContext( INT idSubject, PHELPMAP phmap) { while (phmap->idSubject) { if (phmap->idSubject == idSubject) return phmap->HelpContext; phmap++; } return 0; } /************************************************************************ * AboutDlgProc * * This is the About Box dialog procedure. * * History: * ************************************************************************/ DIALOGPROC AboutDlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { CHAR szVersion[CCHTEXTMAX]; strcpy(szVersion, ids(IDS_VERSION)); strcat(szVersion, ids(IDS_VERSIONMINOR)); #ifdef DBG strcat(szVersion, " (debug)"); #endif SetDlgItemText(hwnd, DID_ABOUTVERSION, szVersion); CenterWindow(hwnd); } return TRUE; case WM_COMMAND: EndDialog(hwnd, IDOK); return TRUE; default: return FALSE; } }