Annotation of mstools/samples/sdktools/dlgedit/menu.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: /****************************** Module Header *******************************
                     13: * Module Name: menu.c
                     14: *
                     15: * Contains the main menu switching functions and the clipboard functions.
                     16: *
                     17: * Functions:
                     18: *   DialogMenu()
                     19: *   LoadMenuBitmaps()
                     20: *   FreeMenuBitmaps()
                     21: *   InitMenu()
                     22: *   MsgFilterHookFunc()
                     23: *   ShowHelp()
                     24: *   CopyToClipboard()
                     25: *   DlgInClipboard()
                     26: *   PasteFromClipboard()
                     27: *   GetHelpContext()
                     28: *
                     29: * Comments:
                     30: *
                     31: ****************************************************************************/
                     32: 
                     33: #include "dlgedit.h"
                     34: #include "dlgfuncs.h"
                     35: #include "dlgextrn.h"
                     36: #include "dialogs.h"
                     37: 
                     38: #include <string.h>
                     39: 
                     40: 
                     41: #define MM10PERINCH         254         // Tenths of a millimeter per inch.
                     42: 
                     43: typedef struct {
                     44:     WORD idm;
                     45:     INT idbm;
                     46:     HBITMAP hbm;
                     47: } BITMAPMENU;
                     48: 
                     49: 
                     50: STATICFN VOID CopyToClipboard(VOID);
                     51: STATICFN BOOL DlgInClipboard(VOID);
                     52: STATICFN VOID PasteFromClipboard(VOID);
                     53: STATICFN INT GetHelpContext(INT idSubject, PHELPMAP phmap);
                     54: 
                     55: 
                     56: static BITMAPMENU bmpmenuTable[] = {
                     57:     {MENU_ALIGNLEFT,        IDBM_ALEFT,         NULL },
                     58:     {MENU_ALIGNVERT,        IDBM_AVERT,         NULL },
                     59:     {MENU_ALIGNRIGHT,       IDBM_ARIGHT,        NULL },
                     60:     {MENU_ALIGNTOP,         IDBM_ATOP,          NULL },
                     61:     {MENU_ALIGNHORZ,        IDBM_AHORZ,         NULL },
                     62:     {MENU_ALIGNBOTTOM,      IDBM_ABOTTOM,       NULL },
                     63:     {MENU_SPACEVERT,        IDBM_ASPCVERT,      NULL },
                     64:     {MENU_SPACEHORZ,        IDBM_ASPCHORZ,      NULL },
                     65:     {MENU_ARRSIZEWIDTH,     IDBM_ASZWIDTH,      NULL },
                     66:     {MENU_ARRSIZEHEIGHT,    IDBM_ASZHGHT,       NULL },
                     67:     {MENU_ARRPUSHBOTTOM,    IDBM_APBBOTTM,      NULL },
                     68:     {MENU_ARRPUSHRIGHT,     IDBM_APBRIGHT,      NULL }
                     69: };
                     70: 
                     71: 
                     72: 
                     73: /************************************************************************
                     74: * DialogMenu
                     75: *
                     76: * This is the main switching function to send menu commands to the
                     77: * appropriate function.
                     78: *
                     79: * Arguments:
                     80: *   INT - the menu command
                     81: *
                     82: ************************************************************************/
                     83: 
                     84: VOID DialogMenu(
                     85:     INT cmd)
                     86: {
                     87:     /*
                     88:      * Be sure any outstanding changes get applied without errors.
                     89:      */
                     90:     if (!StatusApplyChanges())
                     91:         return;
                     92: 
                     93:     switch (cmd) {
                     94: 
                     95:         /*
                     96:          * File menu ----------------------------------------------------
                     97:          */
                     98: 
                     99:         case MENU_NEWRES:
                    100:             if (DoWeSave(FILE_INCLUDE) == IDCANCEL ||
                    101:                     DoWeSave(FILE_RESOURCE) == IDCANCEL)
                    102:                 break;
                    103: 
                    104:             FreeInclude();
                    105:             FreeRes();
                    106:             AddNewDialog();
                    107:             ShowFileStatus(TRUE);
                    108:             break;
                    109: 
                    110:         case MENU_OPEN:
                    111:             if (DoWeSave(FILE_INCLUDE) == IDCANCEL ||
                    112:                     DoWeSave(FILE_RESOURCE) == IDCANCEL)
                    113:                 break;
                    114: 
                    115:             Open(FILE_RESOURCE);
                    116: 
                    117:             break;
                    118: 
                    119:         case MENU_SAVE:
                    120:             if (gfIncChged) {
                    121:                 if (!Save(FILE_NOSHOW | FILE_INCLUDE))
                    122:                     break;
                    123:             }
                    124: 
                    125:             if (gfResChged)
                    126:                 Save(FILE_NOSHOW | FILE_RESOURCE);
                    127: 
                    128:             break;
                    129: 
                    130:         case MENU_SAVEAS:
                    131:             /*
                    132:              * Save the include file, but only if there is one.
                    133:              */
                    134:             if (pszIncludeFile || plInclude) {
                    135:                 if (!Save(FILE_NOSHOW | FILE_INCLUDE | FILE_SAVEAS))
                    136:                     break;
                    137:             }
                    138: 
                    139:             /*
                    140:              * Save the resource file.
                    141:              */
                    142:             Save(FILE_NOSHOW | FILE_RESOURCE | FILE_SAVEAS);
                    143: 
                    144:             break;
                    145: 
                    146:         case MENU_NEWCUST:
                    147:             DlgBox(DID_NEWCUST, (WNDPROC)NewCustDlgProc);
                    148:             break;
                    149: 
                    150:         case MENU_OPENCUST:
                    151:             OpenCustomDialog();
                    152:             break;
                    153: 
                    154:         case MENU_REMCUST:
                    155:             DlgBox(DID_REMCUST, (WNDPROC)RemCustDlgProc);
                    156:             break;
                    157: 
                    158:         case MENU_SETINCLUDE:
                    159:             if (DoWeSave(FILE_INCLUDE) != IDCANCEL)
                    160:                 Open(FILE_INCLUDE);
                    161: 
                    162:             break;
                    163: 
                    164:         case MENU_EXIT:
                    165:             PostMessage(ghwndMain, WM_CLOSE, 0, 0L);
                    166:             break;
                    167: 
                    168:         /*
                    169:          * Edit menu ----------------------------------------------------
                    170:          */
                    171: 
                    172:         case MENU_RESTOREDIALOG:
                    173:             RestoreDialog();
                    174:             break;
                    175: 
                    176:         case MENU_CUT:
                    177:         case MENU_COPY:
                    178:             if (gfEditingDlg) {
                    179:                 /*
                    180:                  * Save current stuff in clipboard.
                    181:                  */
                    182:                 CopyToClipboard();
                    183: 
                    184:                 /*
                    185:                  * Clear the selection if they did a "cut" instead of
                    186:                  * a "copy".
                    187:                  */
                    188:                 if (cmd == MENU_CUT)
                    189:                     DeleteControl();
                    190:             }
                    191: 
                    192:             break;
                    193: 
                    194:         case MENU_PASTE:
                    195:             PasteFromClipboard();
                    196:             break;
                    197: 
                    198:         case MENU_DELETE:
                    199:             DeleteControl();
                    200:             break;
                    201: 
                    202:         case MENU_DUPLICATE:
                    203:             Duplicate();
                    204:             break;
                    205: 
                    206:         case MENU_SYMBOLS:
                    207:             ViewInclude();
                    208:             break;
                    209: 
                    210:         case MENU_STYLES:
                    211:             StylesDialog();
                    212:             break;
                    213: 
                    214:         case MENU_SIZETOTEXT:
                    215:             SizeToText();
                    216:             break;
                    217: 
                    218:         case MENU_NEWDIALOG:
                    219:             AddNewDialog();
                    220:             break;
                    221: 
                    222:         case MENU_SELECTDIALOG:
                    223:             SelectDialogDialog();
                    224:             break;
                    225: 
                    226:         /*
                    227:          * Arrange menu -------------------------------------------------
                    228:          */
                    229: 
                    230:         case MENU_ALIGNLEFT:
                    231:         case MENU_ALIGNVERT:
                    232:         case MENU_ALIGNRIGHT:
                    233:         case MENU_ALIGNTOP:
                    234:         case MENU_ALIGNHORZ:
                    235:         case MENU_ALIGNBOTTOM:
                    236:             AlignControls(cmd);
                    237:             break;
                    238: 
                    239:         case MENU_SPACEVERT:
                    240:         case MENU_SPACEHORZ:
                    241:             ArrangeSpacing(cmd);
                    242:             break;
                    243: 
                    244:         case MENU_ARRSIZEWIDTH:
                    245:         case MENU_ARRSIZEHEIGHT:
                    246:             ArrangeSize(cmd);
                    247:             break;
                    248: 
                    249:         case MENU_ARRPUSHBOTTOM:
                    250:         case MENU_ARRPUSHRIGHT:
                    251:             ArrangePushButtons(cmd);
                    252:             break;
                    253: 
                    254:         case MENU_ORDERGROUP:
                    255:             OrderGroupDialog();
                    256:             break;
                    257: 
                    258:         case MENU_ARRSETTINGS:
                    259:             ArrangeSettingsDialog();
                    260:             break;
                    261: 
                    262:         /*
                    263:          * Options menu -------------------------------------------------
                    264:          */
                    265: 
                    266:         case MENU_TESTMODE:
                    267:             if (gfTestMode)
                    268:                 DestroyTestDialog();
                    269:             else
                    270:                 CreateTestDialog();
                    271: 
                    272:             break;
                    273: 
                    274:         case MENU_HEXMODE:
                    275:             /*
                    276:              * Flip the flag, and update the status display so that
                    277:              * the id value will be displayed in the new format.
                    278:              */
                    279:             gfHexMode = gfHexMode ? FALSE : TRUE;
                    280:             StatusUpdate();
                    281:             break;
                    282: 
                    283:         case MENU_TRANSLATE:
                    284:             /*
                    285:              * Flip the flag, and set the enable state of the fields
                    286:              * in the status window.  Changing the translate mode can
                    287:              * effect whether they are allowed to change ids of controls.
                    288:              */
                    289:             gfTranslateMode = gfTranslateMode ? FALSE : TRUE;
                    290: 
                    291:             /*
                    292:              * If they turned on Translate mode, reset the tool and
                    293:              * hide the Toolbox.  Otherwise, show the toolbox if they
                    294:              * want it shown.
                    295:              */
                    296:             if (gfTranslateMode) {
                    297:                 ToolboxShow(FALSE);
                    298:                 ToolboxSelectTool(W_NOTHING, FALSE);
                    299:             }
                    300:             else if (gfShowToolbox) {
                    301:                 ToolboxShow(TRUE);
                    302:             }
                    303: 
                    304:             StatusSetEnable();
                    305:             break;
                    306: 
                    307:         case MENU_USENEWKEYWORDS:
                    308:             /*
                    309:              * Flip the flag.
                    310:              */
                    311:             gfUseNewKeywords = gfUseNewKeywords ? FALSE : TRUE;
                    312:             break;
                    313: 
                    314:         case MENU_SHOWTOOLBOX:
                    315:             /*
                    316:              * Toggle the state of the Toolbox.
                    317:              */
                    318:             gfShowToolbox = gfShowToolbox ? FALSE : TRUE;
                    319:             ToolboxShow(gfShowToolbox);
                    320: 
                    321:             break;
                    322: 
                    323:         /*
                    324:          * Help menu ----------------------------------------------------
                    325:          */
                    326: 
                    327:         case MENU_CONTENTS:
                    328:             WinHelp(ghwndMain, gszHelpFile, HELP_CONTENTS, 0L);
                    329:             break;
                    330: 
                    331:         case MENU_SEARCH:
                    332:             /*
                    333:              * Tell winhelp to be sure this app's help file is current,
                    334:              * then invoke a search with an empty starting key.
                    335:              */
                    336:             WinHelp(ghwndMain, gszHelpFile, HELP_FORCEFILE, 0);
                    337:             WinHelp(ghwndMain, gszHelpFile, HELP_PARTIALKEY, (DWORD)szEmpty);
                    338:             break;
                    339: 
                    340:         case MENU_ABOUT:
                    341:             DlgBox(DID_ABOUT, (WNDPROC)AboutDlgProc);
                    342:             break;
                    343: 
                    344:         /*
                    345:          * Hidden menu commands (accessed by accelerators) --------------
                    346:          */
                    347: 
                    348:         case MENU_HIDDEN_TOTOOLBOX:
                    349:             if (ghwndToolbox && IsWindowVisible(ghwndToolbox))
                    350:                 SetFocus(ghwndToolbox);
                    351: 
                    352:             break;
                    353: 
                    354:         case MENU_HIDDEN_TOPROPBAR:
                    355:             SetFocus(hwndStatus);
                    356:             break;
                    357:     }
                    358: }
                    359: 
                    360: 
                    361: 
                    362: /************************************************************************
                    363: * LoadMenuBitmaps
                    364: *
                    365: * This function loads and inserts the menu items that are bitmaps.
                    366: * This has to be done at runtime because windows does not have a
                    367: * way to specify bitmap menu items in the rc file.
                    368: *
                    369: * Arguments:
                    370: *   HMENU hMenu - The menu handle.
                    371: *
                    372: ************************************************************************/
                    373: 
                    374: VOID LoadMenuBitmaps(
                    375:     HMENU hMenu)
                    376: {
                    377:     INT i;
                    378: 
                    379:     for (i = 0; i < sizeof(bmpmenuTable) / sizeof(BITMAPMENU); i++) {
                    380:         bmpmenuTable[i].hbm =
                    381:                 LoadBitmap(ghInst, MAKEINTRESOURCE(bmpmenuTable[i].idbm));
                    382: 
                    383:         ModifyMenu(hMenu, bmpmenuTable[i].idm,
                    384:                 MF_BYCOMMAND | MF_BITMAP, bmpmenuTable[i].idm,
                    385:                 (LPTSTR)(DWORD)bmpmenuTable[i].hbm);
                    386:     }
                    387: }
                    388: 
                    389: 
                    390: 
                    391: /************************************************************************
                    392: * FreeMenuBitmaps
                    393: *
                    394: * This function frees the menu bitmaps that were loaded by
                    395: * LoadMenuBitmaps.  This function should be called only when
                    396: * the application is exiting, because it frees the bitmaps
                    397: * without removing them from the menu first.
                    398: *
                    399: ************************************************************************/
                    400: 
                    401: VOID FreeMenuBitmaps(VOID)
                    402: {
                    403:     INT i;
                    404: 
                    405:     for (i = 0; i < sizeof(bmpmenuTable) / sizeof(BITMAPMENU); i++)
                    406:         if (bmpmenuTable[i].hbm)
                    407:             DeleteObject(bmpmenuTable[i].hbm);
                    408: }
                    409: 
                    410: 
                    411: 
                    412: /************************************************************************
                    413: * InitMenu
                    414: *
                    415: * This function grays/enables and checks/unchecks the menu items
                    416: * appropriately for the given state.
                    417: *
                    418: * Arguments:
                    419: *   HMENU hMenu - The menu handle.
                    420: *
                    421: ************************************************************************/
                    422: 
                    423: VOID InitMenu(
                    424:     HMENU hMenu)
                    425: {
                    426:     register INT i;
                    427:     BOOL fEnable;
                    428:     NPCTYPE npc;
                    429:     HMENU hMenuArrange;
                    430: 
                    431:     MyEnableMenuItem(hMenu, MENU_NEWRES, !gfTranslateMode);
                    432: 
                    433:     MyEnableMenuItem(hMenu, MENU_SAVE,
                    434:             (gfEditingDlg || gprlHead) && (gfResChged || gfIncChged));
                    435: 
                    436:     MyEnableMenuItem(hMenu, MENU_SAVEAS, gfEditingDlg || gprlHead);
                    437: 
                    438:     MyEnableMenuItem(hMenu, MENU_SETINCLUDE,
                    439:             (gfEditingDlg || gprlHead) && !gfTranslateMode);
                    440: 
                    441:     MyEnableMenuItem(hMenu, MENU_REMCUST, gpclHead);
                    442: 
                    443:     MyEnableMenuItem(hMenu, MENU_RESTOREDIALOG, gfDlgChanged && gcd.prl);
                    444: 
                    445:     MyEnableMenuItem(hMenu, MENU_CUT,
                    446:             gnpcSel && gfEditingDlg && !gfTranslateMode);
                    447: 
                    448:     MyEnableMenuItem(hMenu, MENU_COPY, gnpcSel && gfEditingDlg);
                    449: 
                    450:     MyEnableMenuItem(hMenu, MENU_PASTE, !gfTranslateMode &&
                    451:             IsClipboardFormatAvailable(fmtDlg) &&
                    452:             (gfEditingDlg || DlgInClipboard()));
                    453: 
                    454:     MyEnableMenuItem(hMenu, MENU_DELETE, gnpcSel && !gfTranslateMode);
                    455: 
                    456:     MyEnableMenuItem(hMenu, MENU_DUPLICATE, gnpcSel && !gfTranslateMode);
                    457: 
                    458:     MyEnableMenuItem(hMenu, MENU_SYMBOLS,
                    459:             (gfEditingDlg || gprlHead) && !gfTranslateMode);
                    460: 
                    461:     MyEnableMenuItem(hMenu, MENU_STYLES, gnpcSel && !gfTranslateMode);
                    462: 
                    463:     /*
                    464:      * For the "Size to text" menu command to be enabled, there
                    465:      * must be at least one control selected, and one of the
                    466:      * controls selected has to be able to be sized to its text.
                    467:      */
                    468:     fEnable = FALSE;
                    469:     if (gcSelected) {
                    470:         for (npc = npcHead; npc; npc = npc->npcNext) {
                    471:             if (npc->fSelected && npc->pwcd->fSizeToText) {
                    472:                 fEnable = TRUE;
                    473:                 break;
                    474:             }
                    475:         }
                    476:     }
                    477: 
                    478:     MyEnableMenuItem(hMenu, MENU_SIZETOTEXT, fEnable);
                    479: 
                    480:     MyEnableMenuItem(hMenu, MENU_NEWDIALOG, !gfTranslateMode);
                    481: 
                    482:     MyEnableMenuItem(hMenu, MENU_SELECTDIALOG, gfEditingDlg || gprlHead);
                    483: 
                    484:     hMenuArrange = GetSubMenu(hMenu, MENUPOS_ARRANGE);
                    485: 
                    486:     MyEnableMenuItemByPos(hMenuArrange, MENUPOS_ARRANGEALIGN, gcSelected > 1);
                    487: 
                    488:     MyEnableMenuItemByPos(hMenuArrange, MENUPOS_ARRANGESPACE, gcSelected > 1);
                    489: 
                    490:     /*
                    491:      * For the "Same size" menu option to be enabled, there
                    492:      * must be more than one control selected, and they
                    493:      * must be sizeable controls.
                    494:      */
                    495:     fEnable = FALSE;
                    496:     if (gcSelected > 1) {
                    497:         for (i = 0, npc = npcHead; npc; npc = npc->npcNext) {
                    498:             if (npc->fSelected && npc->pwcd->fSizeable) {
                    499:                 i++;
                    500: 
                    501:                 if (i > 1) {
                    502:                     fEnable = TRUE;
                    503:                     break;
                    504:                 }
                    505:             }
                    506:         }
                    507:     }
                    508: 
                    509:     MyEnableMenuItemByPos(hMenuArrange, MENUPOS_ARRANGESIZE, fEnable);
                    510: 
                    511:     /*
                    512:      * For the Arrange/Push buttons menu item to be enabled,
                    513:      * there must be a dialog up and it must have at least one
                    514:      * push button.  In addition, if there are control(s) other
                    515:      * than the dialog selected, at least one of the selected
                    516:      * controls must be a push button.
                    517:      */
                    518:     fEnable = FALSE;
                    519:     if (gfEditingDlg || gprlHead) {
                    520:         if (!gcSelected || gfDlgSelected) {
                    521:             for (npc = npcHead; npc; npc = npc->npcNext) {
                    522:                 if (npc->pwcd->iType == W_PUSHBUTTON) {
                    523:                     fEnable = TRUE;
                    524:                     break;
                    525:                 }
                    526:             }
                    527:         }
                    528:         else {
                    529:             for (npc = npcHead; npc; npc = npc->npcNext) {
                    530:                 if (npc->pwcd->iType == W_PUSHBUTTON && npc->fSelected) {
                    531:                     fEnable = TRUE;
                    532:                     break;
                    533:                 }
                    534:             }
                    535:         }
                    536:     }
                    537: 
                    538:     MyEnableMenuItemByPos(hMenuArrange, MENUPOS_ARRANGEPUSH, fEnable);
                    539: 
                    540:     MyEnableMenuItem(hMenu, MENU_ORDERGROUP,
                    541:             npcHead && !gfTranslateMode && !gfTestMode && cWindows > 1);
                    542: 
                    543:     MyEnableMenuItem(hMenu, MENU_TESTMODE, gfEditingDlg);
                    544:     MyCheckMenuItem(hMenu, MENU_TESTMODE, gfTestMode);
                    545: 
                    546:     MyEnableMenuItem(hMenu, MENU_HEXMODE, !gfTestMode);
                    547:     MyCheckMenuItem(hMenu, MENU_HEXMODE, gfHexMode);
                    548: 
                    549:     MyEnableMenuItem(hMenu, MENU_TRANSLATE, !gfTestMode);
                    550:     MyCheckMenuItem(hMenu, MENU_TRANSLATE, gfTranslateMode);
                    551: 
                    552:     MyEnableMenuItem(hMenu, MENU_USENEWKEYWORDS, !gfTestMode);
                    553:     MyCheckMenuItem(hMenu, MENU_USENEWKEYWORDS, gfUseNewKeywords);
                    554: 
                    555:     MyEnableMenuItem(hMenu, MENU_SHOWTOOLBOX, !gfTestMode && !gfTranslateMode);
                    556:     MyCheckMenuItem(hMenu, MENU_SHOWTOOLBOX, gfShowToolbox);
                    557: }
                    558: 
                    559: 
                    560: 
                    561: /************************************************************************
                    562: * CopyToClipboard
                    563: *
                    564: * Puts the current dialog and a bitmap image of it into the clipboard.
                    565: * Gives a dialog box resource to the Clipboard.
                    566: * Gives a bit map to the clipboard.
                    567: * Clears everything else out of clipboard.
                    568: *
                    569: ************************************************************************/
                    570: 
                    571: STATICFN VOID CopyToClipboard(VOID)
                    572: {
                    573:     INT cbRes;
                    574:     HANDLE hResClip;
                    575:     PRES lpRes;
                    576:     PRES pRes;
                    577:     HDC hdcSrc;
                    578:     HDC hdcDst;
                    579:     RECT rc;
                    580:     HBITMAP hbm;
                    581: 
                    582:     /*
                    583:      * Store the current selection in a dialog resource.
                    584:      */
                    585:     if (!(pRes = AllocDialogResource(FALSE, TRUE)))
                    586:         return;
                    587: 
                    588:     /*
                    589:      * Allocate global memory for it.
                    590:      */
                    591:     cbRes = ResourceSize(pRes);
                    592:     if (!cbRes || !(hResClip = GlobalAlloc(GHND | GMEM_DDESHARE, cbRes))) {
                    593:         MyFree(pRes);
                    594:         Message(MSG_OUTOFMEMORY);
                    595:         return;
                    596:     }
                    597: 
                    598:     /*
                    599:      * Copy it to the global memory.
                    600:      */
                    601:     lpRes = (PRES)GlobalLock(hResClip);
                    602:     memcpy(lpRes, pRes, cbRes);
                    603:     GlobalUnlock(hResClip);
                    604:     MyFree(pRes);
                    605: 
                    606:     /*
                    607:      * Now place it in the clipboard.
                    608:      */
                    609:     if (OpenClipboard(ghwndMain)) {
                    610:         EmptyClipboard();
                    611:         SetClipboardData(fmtDlg, hResClip);
                    612: 
                    613:         /*
                    614:          * If the dialog is selected, place a bitmap image of it
                    615:          * in the clipboard also.  The drag handles will be removed
                    616:          * first and the dialog will be activated so that the
                    617:          * image looks proper.
                    618:          */
                    619:         if (gfDlgSelected) {
                    620:             CancelSelection(FALSE);
                    621:             SetActiveWindow(gcd.npc->hwnd);
                    622:             UpdateWindow(gcd.npc->hwnd);
                    623: 
                    624:             if (hdcSrc = GetDC(NULL)) {
                    625:                 GetWindowRect(gcd.npc->hwnd, &rc);
                    626:                 if (hbm = CreateCompatibleBitmap(hdcSrc,
                    627:                         rc.right - rc.left, rc.bottom - rc.top)) {
                    628:                     if (hdcDst = CreateCompatibleDC(hdcSrc)) {
                    629:                         /*
                    630:                          * Calculate the dimensions of the bitmap and
                    631:                          * convert them to tenths of a millimeter for
                    632:                          * setting the size with the SetBitmapDimensionEx
                    633:                          * call.  This allows programs like WinWord to
                    634:                          * retrieve the bitmap and know what size to
                    635:                          * display it as.
                    636:                          */
                    637:                         SetBitmapDimensionEx(hbm,
                    638:                                 ((rc.right - rc.left) * MM10PERINCH) /
                    639:                                 GetDeviceCaps(hdcSrc, LOGPIXELSX),
                    640:                                 ((rc.bottom - rc.top) * MM10PERINCH) /
                    641:                                 GetDeviceCaps(hdcSrc, LOGPIXELSY),
                    642:                                 NULL);
                    643: 
                    644:                         SelectObject(hdcDst, hbm);
                    645:                         BitBlt(hdcDst, 0, 0,
                    646:                                 rc.right - rc.left, rc.bottom - rc.top,
                    647:                                 hdcSrc, rc.left, rc.top, SRCCOPY);
                    648:                         DeleteDC(hdcDst);
                    649:                         SetClipboardData(CF_BITMAP, hbm);
                    650:                     }
                    651:                     else {
                    652:                         DeleteObject(hbm);
                    653:                     }
                    654:                 }
                    655: 
                    656:                 ReleaseDC(NULL, hdcSrc);
                    657:             }
                    658: 
                    659:             SetActiveWindow(ghwndMain);
                    660:             SelectControl(gcd.npc, FALSE);
                    661:         }
                    662: 
                    663:         CloseClipboard();
                    664:     }
                    665:     else {
                    666:         Message(MSG_NOCLIP);
                    667:     }
                    668: }
                    669: 
                    670: 
                    671: 
                    672: /************************************************************************
                    673: * DlgInClipboard
                    674: *
                    675: * This function returns TRUE if there is data in the clipboard in the
                    676: * dialog format, and this data is for a complete dialog, not just for
                    677: * a group of controls.
                    678: *
                    679: ************************************************************************/
                    680: 
                    681: STATICFN BOOL DlgInClipboard(VOID)
                    682: {
                    683:     HANDLE hClip;
                    684:     PRES pRes;
                    685:     PDIALOGBOXHEADER pdbh;
                    686:     BOOL fDlgResFound = FALSE;
                    687: 
                    688:     if (!OpenClipboard(ghwndMain))
                    689:         return FALSE;
                    690: 
                    691:     if (hClip = GetClipboardData(fmtDlg)) {
                    692:         pRes = (PRES)GlobalLock(hClip);
                    693: 
                    694:         /*
                    695:          * If cx is CONTROLS_ONLY, then we know that we only
                    696:          * want to copy the controls in the template, not the
                    697:          * entire dialog plus controls.
                    698:          */
                    699:         pdbh = (PDIALOGBOXHEADER)SkipResHeader(pRes);
                    700:         if (pdbh->cx != CONTROLS_ONLY)
                    701:             fDlgResFound = TRUE;
                    702: 
                    703:         GlobalUnlock(hClip);
                    704:     }
                    705: 
                    706:     CloseClipboard();
                    707: 
                    708:     return fDlgResFound;
                    709: }
                    710: 
                    711: 
                    712: 
                    713: /************************************************************************
                    714: * PasteFromClipboard
                    715: *
                    716: * This routine pastes any data from the clipboard into the current
                    717: * resource file.  If the data represents a complete dialog, a new dialog
                    718: * is added.  If it represents some controls, the operation to drop them
                    719: * into the current dialog is begun.
                    720: *
                    721: ************************************************************************/
                    722: 
                    723: STATICFN VOID PasteFromClipboard(VOID)
                    724: {
                    725:     HANDLE hClip;
                    726:     PRES pResClip;
                    727:     PRES pResCopy;
                    728:     INT cbRes;
                    729: 
                    730:     if (!OpenClipboard(ghwndMain)) {
                    731:         Message(MSG_NOCLIP);
                    732:         return;
                    733:     }
                    734: 
                    735:     if (hClip = GetClipboardData(fmtDlg)) {
                    736:         pResClip = (PRES)GlobalLock(hClip);
                    737:         cbRes = ResourceSize(pResClip);
                    738: 
                    739:         /*
                    740:          * Make a copy of the clipboard data.  This needs to be done
                    741:          * because we may need to drag the new controls for a while,
                    742:          * and it is rude to leave the clipboard open that long.
                    743:          */
                    744:         if (pResCopy = (PRES)MyAlloc(cbRes)) {
                    745:             memcpy((PBYTE)pResCopy, (PBYTE)pResClip, cbRes);
                    746: 
                    747:             /*
                    748:              * Now duplicate the dialog or controls in the clipboard.
                    749:              * The pResCopy buffer does NOT need to be freed here, because
                    750:              * it will be freed after the drag operation is complete.
                    751:              */
                    752:             MakeCopyFromRes(pResCopy);
                    753:         }
                    754: 
                    755:         GlobalUnlock(hClip);
                    756:     }
                    757: 
                    758:     CloseClipboard();
                    759: }
                    760: 
                    761: 
                    762: 
                    763: /************************************************************************
                    764: * MsgFilterHookFunc
                    765: *
                    766: * This is the exported message filter function that is hooked into
                    767: * the message stream for detecting the pressing of the F1 key, at
                    768: * which time it calls up the appropriate help.
                    769: *
                    770: ************************************************************************/
                    771: 
                    772: BOOL APIENTRY MsgFilterHookFunc(
                    773:     INT nCode,
                    774:     WPARAM wParam,
                    775:     LPMSG lpMsg)
                    776: {
                    777:     if ((nCode == MSGF_MENU || nCode == MSGF_DIALOGBOX) &&
                    778:             (lpMsg->message == WM_KEYDOWN && lpMsg->wParam == VK_F1)) {
                    779:         /*
                    780:          * Display help.
                    781:          */
                    782:         ShowHelp((nCode == MSGF_MENU) ? TRUE : FALSE);
                    783: 
                    784:         /*
                    785:          * Tell Windows to swallow this message.
                    786:          */
                    787:         return 1;
                    788:     }
                    789: 
                    790:     return CallNextHookEx(ghhkMsgFilter, nCode, wParam, (LONG)lpMsg);
                    791: }
                    792: 
                    793: 
                    794: 
                    795: /************************************************************************
                    796: * ShowHelp
                    797: *
                    798: * This function is called when the user has requested help.  It will
                    799: * look at the menu state (if fMenuHelp is TRUE) or which dialog
                    800: * is currently up to determine the help topic, then it calls WinHelp.
                    801: *
                    802: * Arguments:
                    803: *   BOOL fMenuHelp - TRUE if this help is for a menu (help was requested
                    804: *                    in the menu modal loop).  If FALSE, general help
                    805: *                    or help for a dialog is assumed.
                    806: *
                    807: ************************************************************************/
                    808: 
                    809: VOID ShowHelp(
                    810:     BOOL fMenuHelp)
                    811: {
                    812:     INT nHelpContext = 0;
                    813:     HWND hwndFocus;
                    814: 
                    815:     if (fMenuHelp) {
                    816:         nHelpContext = GetHelpContext(gMenuSelected, gahmapMenu);
                    817:     }
                    818:     else {
                    819:         /*
                    820:          * Look for help for the current dialog.
                    821:          */
                    822:         if (gidCurrentDlg) {
                    823:             nHelpContext = GetHelpContext(gidCurrentDlg, gahmapDialog);
                    824:         }
                    825:         else {
                    826:             /*
                    827:              * There is no current dialog.  Is the window with the
                    828:              * focus a control on the Properties Bar?
                    829:              */
                    830:             if ((hwndFocus = GetFocus()) && IsChild(hwndStatus, hwndFocus))
                    831:                 nHelpContext = GetHelpContext(DID_STATUS, gahmapDialog);
                    832:         }
                    833:     }
                    834: 
                    835:     /*
                    836:      * If there is help context, display it.  Otherwise display
                    837:      * the Contents screen.
                    838:      */
                    839:     if (nHelpContext)
                    840:         WinHelp(ghwndMain, gszHelpFile, HELP_CONTEXT, nHelpContext);
                    841:     else
                    842:         WinHelp(ghwndMain, gszHelpFile, HELP_CONTENTS, 0L);
                    843: }
                    844: 
                    845: 
                    846: 
                    847: /************************************************************************
                    848: * GetHelpContext
                    849: *
                    850: * This function takes a subject and returns its matching help
                    851: * context id from the given HELPMAP table.
                    852: *
                    853: * Arguments:
                    854: *   INT idSubject   - ID of the subject to find the help context for.
                    855: *   PHELPMAP phmap  - The help map table.  It is assumed that the
                    856: *                     last entry in the table has a NULL subject id.
                    857: *
                    858: ************************************************************************/
                    859: 
                    860: STATICFN INT GetHelpContext(
                    861:     INT idSubject,
                    862:     PHELPMAP phmap)
                    863: {
                    864:     while (phmap->idSubject) {
                    865:         if (phmap->idSubject == idSubject)
                    866:             return phmap->HelpContext;
                    867: 
                    868:         phmap++;
                    869:     }
                    870: 
                    871:     return 0;
                    872: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.