PATRON.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:17k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * PATRON.CPP
  3.  * Patron Chapter 21
  4.  *
  5.  * WinMain which is all we need for the basic application.
  6.  *
  7.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  8.  *
  9.  * Kraig Brockschmidt, Microsoft
  10.  * Internet  :  kraigb@microsoft.com
  11.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  12.  */
  13. #define INITGUIDS
  14. #include "patron.h"
  15. //CHAPTER21MOD
  16. ULONG       g_cObj=0;
  17. ULONG       g_cLock=0;
  18. HWND        g_hWnd=NULL;
  19. BOOL        g_fUser=TRUE;
  20. //End CHAPTER21MOD
  21. /*
  22.  * WinMain
  23.  *
  24.  * Purpose:
  25.  *  Main entry point of application.  Should register the app class
  26.  *  if a previous instance has not done so and do any other one-time
  27.  *  initializations.
  28.  */
  29. int PASCAL WinMain (HINSTANCE hInst, HINSTANCE hPrev
  30.     , LPSTR pszCmdLine, int nCmdShow)
  31.     {
  32.     PCPatronFrame   pFR;
  33.     FRAMEINIT       fi;
  34.     WPARAM          wRet=0;
  35.     SETMESSAGEQUEUE;
  36.     //Attempt to allocate and initialize the application
  37.     pFR=new CPatronFrame(hInst, hPrev, pszCmdLine, nCmdShow);
  38.     if (NULL==pFR)
  39.         return -1;
  40.     fi.idsMin=IDS_FRAMEMIN;
  41.     fi.idsMax=IDS_FRAMEMAX;
  42.     fi.idsStatMin=IDS_STATMESSAGEMIN;
  43.     fi.idsStatMax=IDS_STATMESSAGEMAX;
  44.     fi.idStatMenuMin=ID_MENUFILE;
  45.     fi.idStatMenuMax=ID_MENUHELP;
  46.     fi.iPosWindowMenu=WINDOW_MENU;
  47.     fi.cMenus=CMENUS;
  48.     fi.x=CW_USEDEFAULT;
  49.     fi.y=CW_USEDEFAULT;
  50.     fi.cx=CW_USEDEFAULT;
  51.     fi.cy=CW_USEDEFAULT;
  52.     //If we can initialize pFR, start chugging messages
  53.     if (pFR->Init(&fi))
  54.         wRet=pFR->MessageLoop();
  55.     delete pFR;
  56.     return wRet;
  57.     }
  58. //CHAPTER21MOD
  59. /*
  60.  * ObjectDestroyed
  61.  *
  62.  * Purpose:
  63.  *  Function for the Patron Document object to call when it gets
  64.  *  destroyed.  We destroy the main window if the proper conditions
  65.  *  are met for shutdown.
  66.  */
  67. void ObjectDestroyed(void)
  68.     {
  69.     g_cObj--;
  70.     //No more objects, no locks, no user control, shut the app down.
  71.     if (0==g_cObj && 0==g_cLock && IsWindow(g_hWnd) && !g_fUser)
  72.         PostMessage(g_hWnd, WM_CLOSE, 0, 0L);
  73.     return;
  74.     }
  75. //End CHAPTER21MOD
  76. /*
  77.  * CPatronFrame::CPatronFrame
  78.  * CPatronFrame::~CPatronFrame
  79.  *
  80.  * Constructor Parameters:
  81.  *  hInst           HINSTANCE from WinMain
  82.  *  hInstPrev       HINSTANCE from WinMain
  83.  *  pszCmdLine      LPSTR from WinMain
  84.  *  nCmdShow        int from WInMain
  85.  */
  86. CPatronFrame::CPatronFrame(HINSTANCE hInst, HINSTANCE hInstPrev
  87.     , LPSTR pszCmdLine, int nCmdShow)
  88.     : CFrame(hInst, hInstPrev, pszCmdLine, nCmdShow)
  89.     {
  90.     m_fInitialized=FALSE;
  91.     m_pIClassDataTran=NULL;
  92.     //CHAPTER21MOD
  93.     m_pDocCreated=NULL;
  94.     m_fEmbedding=FALSE;
  95.     m_dwRegCO=0;
  96.     m_pIClassFactory=NULL;
  97.     //End CHAPTER21MOD
  98.     return;
  99.     }
  100. CPatronFrame::~CPatronFrame(void)
  101.     {
  102.     //CHAPTER21MOD
  103.     //Opposite of CoRegisterClassObject, takes class factory ref to 1
  104.     if (0L!=m_dwRegCO)
  105.         CoRevokeClassObject(m_dwRegCO);
  106.     //This should be the last Release, which frees the class factory.
  107.     ReleaseInterface(m_pIClassFactory);
  108.     //End CHAPTER21MOD
  109.     if (NULL!=m_pIClassDataTran)
  110.         {
  111.         m_pIClassDataTran->LockServer(FALSE);
  112.         m_pIClassDataTran->Release();
  113.         }
  114.     OleFlushClipboard();
  115.     if (m_fInitialized)
  116.         OleUninitialize();
  117.     return;
  118.     }
  119. /*
  120.  * CPatronFrame::Init
  121.  *
  122.  * Purpose:
  123.  *  Call OleInitialize then calling down into the base class
  124.  *  initialization.
  125.  *
  126.  * Parameters:
  127.  *  pFI             PFRAMEINIT containing initialization
  128.  *                  parameters.
  129.  *
  130.  * Return Value:
  131.  *  BOOL            TRUE if initialization succeeded,
  132.  *                  FALSE otherwise.
  133.  */
  134. BOOL CPatronFrame::Init(PFRAMEINIT pFI)
  135.     {
  136.     HRESULT     hr;
  137.     CHECKVER_OLE;
  138.     if (FAILED(OleInitialize(NULL)))
  139.         return FALSE;
  140.     m_fInitialized=TRUE;
  141.     //Lock the data transfer object factory as an optimization.
  142.     hr=CoGetClassObject(CLSID_DataTransferObject
  143.         , CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory
  144.         , (PPVOID)&m_pIClassDataTran);
  145.     if (SUCCEEDED(hr))
  146.         m_pIClassDataTran->LockServer(TRUE);
  147.     //CHAPTER21MOD
  148.     //Check for command line flags
  149.     ParseCommandLine();
  150.     if (NULL!=m_ppszCmdArgs)
  151.         {
  152.         if(0==lstrcmpi(m_ppszCmdArgs[0], TEXT("-Embedding"))
  153.            || 0==lstrcmpi(m_ppszCmdArgs[0], TEXT("/Embedding")))
  154.             m_fEmbedding=TRUE;
  155.         }
  156.     g_fUser=!m_fEmbedding;
  157.     if (m_fEmbedding)
  158.         {
  159.         HRESULT     hr;
  160.         m_pIClassFactory=new CLinkClassFactory(this);
  161.         if (NULL==m_pIClassFactory)
  162.             return FALSE;
  163.         //Since we hold on to this, we should AddRef it.
  164.         m_pIClassFactory->AddRef();
  165.         hr=CoRegisterClassObject(CLSID_PatronPages, m_pIClassFactory
  166.             , CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE, &m_dwRegCO);
  167.         if (FAILED(hr))
  168.             return FALSE;
  169.         }
  170.     //End CHAPTER21MOD
  171.     return CFrame::Init(pFI);
  172.     }
  173. /*
  174.  * CPatronFrame::CreateCClient
  175.  *
  176.  * Purpose:
  177.  *  Constructs a new client specific to the application.
  178.  *
  179.  * Parameters:
  180.  *  None
  181.  *
  182.  * Return Value:
  183.  *  PCClient        Pointer to the new client object.
  184.  */
  185. PCClient CPatronFrame::CreateCClient(void)
  186.     {
  187.     return (PCClient)(new CPatronClient(m_hInst, this));
  188.     }
  189. /*
  190.  * CPatronFrame::RegisterAllClasses
  191.  *
  192.  * Purpose:
  193.  *  Registers all classes used in this application.
  194.  *
  195.  * Parameters:
  196.  *  None
  197.  *
  198.  * Return Value:
  199.  *  BOOL            TRUE if registration succeeded, FALSE otherwise.
  200.  */
  201. BOOL CPatronFrame::RegisterAllClasses(void)
  202.     {
  203.     WNDCLASS        wc;
  204.     //First let the standard frame do its thing
  205.     if (!CFrame::RegisterAllClasses())
  206.         return FALSE;
  207.     //We need double-clicks now and for object activation.
  208.     wc.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  209.     wc.hInstance     = m_hInst;
  210.     wc.cbClsExtra    = 0;
  211.     wc.lpfnWndProc   = PagesWndProc;
  212.     wc.cbWndExtra    = CBPAGESWNDEXTRA;
  213.     wc.hIcon         = NULL;
  214.     wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  215.     wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);
  216.     wc.lpszMenuName  = NULL;
  217.     wc.lpszClassName = SZCLASSPAGES;
  218.     if (!RegisterClass(&wc))
  219.         return FALSE;
  220.     return TRUE;
  221.     }
  222. //CHAPTER21MOD
  223. /*
  224.  * CPatronFrame::PreShowInit
  225.  *
  226.  * Purpose:
  227.  *  Called from Init before intially showing the window.  We do
  228.  *  whatever else we want here, modifying m_nCmdShow as necessary
  229.  *  which affects ShowWindow in Init.
  230.  *
  231.  * Parameters:
  232.  *  None
  233.  *
  234.  * Return Value:
  235.  *  BOOL            TRUE if this successful, FALSE otherwise.
  236.  */
  237. BOOL CPatronFrame::PreShowInit(void)
  238.     {
  239.     //Base class does nothing
  240.     CFrame::PreShowInit();
  241.     //Save the window handle for shutdown if necessary.
  242.     g_hWnd=m_hWnd;
  243.     //If we're -Embedding, don't show the window initially.
  244.     if (m_fEmbedding)
  245.         m_nCmdShow=SW_HIDE;
  246.     return TRUE;
  247.     }
  248. //End CHAPTER21MOD
  249. /*
  250.  * CPatronFrame::OnCommand
  251.  *
  252.  * Purpose:
  253.  *  WM_COMMAND handler for the Patron frame window that processes
  254.  *  extra File menu items as well as the Page menu.
  255.  *
  256.  * Parameters:
  257.  *  hWnd            HWND of the frame window.
  258.  *  wParam          WPARAM of the message.
  259.  *  lParam          LPARAM of the message.
  260.  *
  261.  * Return Value:
  262.  *  LRESULT         Return value for the message.
  263.  */
  264. LRESULT CPatronFrame::OnCommand(HWND hWnd, WPARAM wParam
  265.     , LPARAM lParam)
  266.     {
  267.     PCPatronDoc     pDoc;
  268.     COMMANDPARAMS(wID, wCode, hWndMsg);
  269.     /*
  270.      * Don't bother with anything during first initialization,
  271.      * skipping many toolbar notifications.
  272.      */
  273.     if (m_fInit)
  274.         return 0L;
  275.     pDoc=(PCPatronDoc)m_pCL->ActiveDocument();
  276.     if (NULL!=pDoc && (IDM_VERBMIN <= wID) && (IDM_VERBMAX >= wID))
  277.         {
  278.         pDoc->ActivateObject(wID-IDM_VERBMIN);
  279.         return 0L;
  280.         }
  281.     switch (wID)
  282.         {
  283.         case IDM_FILEPRINT:
  284.             pDoc->Print(m_hWnd);
  285.             return 0L;
  286.         case IDM_FILEPRINTERSETUP:
  287.             pDoc->PrinterSetup(m_hWnd, FALSE);
  288.             return 0L;
  289.         case IDM_EDITPASTESPECIAL:
  290.             pDoc->PasteSpecial(m_hWnd);
  291.             return 0L;
  292.         case IDM_EDITDELETEOBJECT:
  293.             pDoc->Delete();
  294.             return 0L;
  295.         case IDM_EDITINSERTOBJECT:
  296.             pDoc->InsertObject(m_hWnd);
  297.             return 0L;
  298.         case IDM_EDITCONVERT:
  299.             pDoc->ConvertObject(m_hWnd);
  300.             return 0L;
  301.         case IDM_EDITLINKS:
  302.             pDoc->EditLinks(m_hWnd);
  303.             return 0L;
  304.         case IDM_PAGENEWPAGE:
  305.             pDoc->NewPage();
  306.             break;
  307.         case IDM_PAGEDELETEPAGE:
  308.             pDoc->DeletePage();
  309.             break;
  310.         case IDM_PAGENEXTPAGE:
  311.             pDoc->NextPage();
  312.             break;
  313.         case IDM_PAGEPREVIOUSPAGE:
  314.             pDoc->PreviousPage();
  315.             break;
  316.         case IDM_PAGEFIRSTPAGE:
  317.             pDoc->FirstPage();
  318.             break;
  319.         case IDM_PAGELASTPAGE:
  320.             pDoc->LastPage();
  321.             break;
  322.         case IDM_PAGESHOWOBJECTS:
  323.             {
  324.             BOOL    fTemp;
  325.             //First get the current state, then toggle it.
  326.             fTemp=pDoc->ShowOrQueryObjectTypes(TRUE, FALSE);
  327.             pDoc->ShowOrQueryObjectTypes(FALSE, !fTemp);
  328.             }
  329.             break;
  330.         default:
  331.            return CFrame::OnCommand(hWnd, wParam, lParam);
  332.         }
  333.     return 0L;
  334.     }
  335. /*
  336.  * CPatronFrame::CreateToolbar
  337.  *
  338.  * Purpose:
  339.  *  Procedure to create all the necessary toolbar buttons.
  340.  *
  341.  * Parameters:
  342.  *  None
  343.  *
  344.  * Return Value:
  345.  *  UINT            Number of tools added to the bar.
  346.  */
  347. UINT CPatronFrame::CreateToolbar(void)
  348.     {
  349.     UINT            iLast;
  350.     UINT            uState=GIZMO_NORMAL;
  351.     UINT            utCmd =GIZMOTYPE_BUTTONCOMMAND;
  352.     //Insert the standard ones.
  353.     iLast=CFrame::CreateToolbar();
  354.     //Remove Undo:  we don't use it.
  355.     m_pTB->Remove(IDM_EDITUNDO);
  356.     /*
  357.      * Insert Print File Import in the 5th position and account
  358.      * for it in iLast.
  359.      */
  360.     m_pTB->Add(utCmd, 4, IDM_FILEPRINT, m_dxB, m_dyB
  361.         , NULL, NULL, 6, uState);
  362.     iLast++;
  363.     m_pTB->Add(GIZMOTYPE_SEPARATOR, iLast++, 0, 6, m_dyB
  364.         , NULL, NULL, 0, uState);
  365.     //Add New Page, and Delete Page
  366.     m_pTB->Add(utCmd, iLast++, IDM_PAGENEWPAGE, m_dxB, m_dyB
  367.         , NULL, m_hBmp, 2, uState);
  368.     m_pTB->Add(utCmd, iLast++, IDM_PAGEDELETEPAGE, m_dxB, m_dyB
  369.         , NULL, m_hBmp, 3, uState);
  370.     m_pTB->Add(GIZMOTYPE_SEPARATOR, iLast++, 0, 6, m_dyB
  371.         , NULL, NULL, 0, uState);
  372.     //First, Prev, Next, Last pages.
  373.     m_pTB->Add(utCmd, iLast++, IDM_PAGEFIRSTPAGE, m_dxB, m_dyB
  374.         , NULL, m_hBmp, 4, uState);
  375.     m_pTB->Add(utCmd, iLast++, IDM_PAGEPREVIOUSPAGE, m_dxB, m_dyB
  376.         , NULL, m_hBmp, 5, uState);
  377.     m_pTB->Add(utCmd, iLast++, IDM_PAGENEXTPAGE, m_dxB, m_dyB
  378.         , NULL, m_hBmp, 6, uState);
  379.     m_pTB->Add(utCmd, iLast++, IDM_PAGELASTPAGE, m_dxB, m_dyB
  380.         , NULL, m_hBmp, 7, uState);
  381.     return iLast;
  382.     }
  383. /*
  384.  * CPatronFrame::UpdateMenus
  385.  *
  386.  * Purpose:
  387.  *  Handles the WM_INITMENU message for the frame window.  Depending
  388.  *  on the existence of an active window, menu items are selectively
  389.  *  enabled and disabled.
  390.  *
  391.  * Parameters:
  392.  *  hMenu           HMENU of the menu to intialize
  393.  *  iMenu           UINT position of the menu.
  394.  *
  395.  * Return Value:
  396.  *  None
  397.  */
  398. void CPatronFrame::UpdateMenus(HMENU hMenu, UINT iMenu)
  399.     {
  400.     PCPatronDoc     pDoc;
  401.     BOOL            fOK=FALSE;
  402.     BOOL            fCallDefault=TRUE;
  403.     UINT            uTemp;
  404.     UINT            uTempE;
  405.     UINT            uTempD;
  406.     pDoc=(PCPatronDoc)m_pCL->ActiveDocument();
  407.     uTempE=MF_ENABLED | MF_BYCOMMAND;
  408.     uTempD=MF_DISABLED | MF_GRAYED | MF_BYCOMMAND;
  409.     uTemp=((NULL!=pDoc) ? uTempE : uTempD);
  410.     if (m_phMenu[0]==hMenu)
  411.         {
  412.         EnableMenuItem(hMenu, IDM_FILEPRINT, uTemp);
  413.         if (NULL!=pDoc)
  414.             fOK=pDoc->FQueryPrinterSetup();
  415.         EnableMenuItem(hMenu, IDM_FILEPRINTERSETUP
  416.             , (fOK) ? uTempE : uTempD);
  417.         }
  418.     if (m_phMenu[1]==hMenu)
  419.         {
  420.         if (NULL!=pDoc)
  421.             fOK=pDoc->FQueryPaste();
  422.         EnableMenuItem(hMenu, IDM_EDITPASTE
  423.             , (fOK) ? uTempE : uTempD);
  424.         EnableMenuItem(hMenu, IDM_EDITPASTESPECIAL
  425.             , (fOK) ? uTempE : uTempD);
  426.         //Cut, Copy, Delete depends on there being a selection.
  427.         if (NULL!=pDoc)
  428.             fOK=pDoc->FQueryObjectSelected(hMenu);
  429.         else
  430.             fOK=FALSE;
  431.         EnableMenuItem(hMenu, IDM_EDITCUT, (fOK) ? uTempE : uTempD);
  432.         EnableMenuItem(hMenu, IDM_EDITCOPY
  433.             , (fOK) ? uTempE : uTempD);
  434.         EnableMenuItem(hMenu, IDM_EDITDELETEOBJECT
  435.             , (fOK) ? uTempE : uTempD);
  436.         EnableMenuItem(hMenu, IDM_EDITINSERTOBJECT, uTemp);
  437.         if (NULL!=pDoc)
  438.             fOK=pDoc->FQueryEnableEditLinks();
  439.         else
  440.             fOK=FALSE;
  441.         EnableMenuItem(hMenu, IDM_EDITLINKS
  442.             , (fOK) ? uTempE : uTempD);
  443.         //We did the whole menu...
  444.         fCallDefault=FALSE;
  445.         }
  446.     //Page menu
  447.     if (m_phMenu[2]==hMenu)
  448.         {
  449.         EnableMenuItem(hMenu, IDM_PAGENEWPAGE,      uTemp);
  450.         EnableMenuItem(hMenu, IDM_PAGEDELETEPAGE,   uTemp);
  451.         EnableMenuItem(hMenu, IDM_PAGENEXTPAGE,     uTemp);
  452.         EnableMenuItem(hMenu, IDM_PAGEPREVIOUSPAGE, uTemp);
  453.         EnableMenuItem(hMenu, IDM_PAGEFIRSTPAGE,    uTemp);
  454.         EnableMenuItem(hMenu, IDM_PAGELASTPAGE,     uTemp);
  455.         //Check the Show Objects command or not.
  456.         if (NULL!=pDoc)
  457.             fOK=pDoc->ShowOrQueryObjectTypes(TRUE, FALSE);
  458.         else
  459.             fOK=FALSE;
  460.         CheckMenuItem(hMenu, IDM_PAGESHOWOBJECTS, MF_BYCOMMAND
  461.             | ((fOK) ? MF_CHECKED : MF_UNCHECKED));
  462.         EnableMenuItem(hMenu, IDM_PAGESHOWOBJECTS, uTemp);
  463.         }
  464.     if (fCallDefault)
  465.         CFrame::UpdateMenus(hMenu, iMenu);
  466.     return;
  467.     }
  468. /*
  469.  * CPatronFrame::UpdateToolbar
  470.  *
  471.  * Purpose:
  472.  *  Enables and disables tools depending on whether we have
  473.  *  a document or not.
  474.  *
  475.  * Parameters:
  476.  *  None
  477.  *
  478.  * Return Value:
  479.  *  None
  480.  */
  481. void CPatronFrame::UpdateToolbar(void)
  482.     {
  483.     PCDocument  pDoc;
  484.     BOOL        fEnable;
  485.     //Let the default hack on its tools.
  486.     CFrame::UpdateToolbar();
  487.     pDoc=m_pCL->ActiveDocument();
  488.     fEnable=(NULL!=pDoc);
  489.     //No document, disable just about everything
  490.     m_pTB->Enable(IDM_FILEPRINT,        fEnable);
  491.     m_pTB->Enable(IDM_FILEPRINTERSETUP, fEnable);
  492.     m_pTB->Enable(IDM_PAGENEWPAGE,      fEnable);
  493.     m_pTB->Enable(IDM_PAGEDELETEPAGE,   fEnable);
  494.     m_pTB->Enable(IDM_PAGEFIRSTPAGE,    fEnable);
  495.     m_pTB->Enable(IDM_PAGEPREVIOUSPAGE, fEnable);
  496.     m_pTB->Enable(IDM_PAGENEXTPAGE,     fEnable);
  497.     m_pTB->Enable(IDM_PAGELASTPAGE,     fEnable);
  498.     return;
  499.     }
  500. /*
  501.  * CPatronFrame::FMessageHook
  502.  *
  503.  * Purpose:
  504.  *  Override of CFrame::FMessageHook so we can specifically trap
  505.  *  WM_MENUSELECT messages for the Object verb menu to provide some
  506.  *  meaningful information on the status strip.
  507.  *
  508.  * Parameters:
  509.  *  <WndProc Parameters>
  510.  *  pLRes           LRESULT * in which to store the return value
  511.  *                  for the message.
  512.  *
  513.  * Return Value:
  514.  *  BOOL            TRUE to prevent further processing,
  515.  *                  FALSE otherwise.
  516.  */
  517. BOOL CPatronFrame::FMessageHook(HWND hWnd, UINT iMsg, WPARAM wParam
  518.     , LPARAM lParam, LRESULT *pLRes)
  519.     {
  520.     BOOL        fRet=FALSE;
  521.     *pLRes=0;
  522.     MENUSELECTPARAMS(wItem, wMenuFlags, hMenu);
  523.     //CHAPTER21MOD
  524.     /*
  525.      * When closing, make sure any document create from the
  526.      * class factory is saved since the object in it might
  527.      * have been changed.  We want to save without showing
  528.      * the user any message or asking if the user wants to save.
  529.      */
  530.     if (WM_CLOSE==iMsg)
  531.         {
  532.         if (NULL!=m_pDocCreated)
  533.             {
  534.             if (m_pDocCreated->FDirtyGet())
  535.                 {
  536.                 CHourglass  wait;
  537.                 m_pDocCreated->Save(0, NULL);
  538.                 }
  539.             }
  540.         return FALSE;
  541.         }
  542.     //End CHAPTER21MOD
  543.     //If this is the wrong message, nothing to do.
  544.     if (WM_MENUSELECT!=iMsg)
  545.         return FALSE;
  546.     //This happens when there's no menu selection.
  547.     if (-1==wMenuFlags)
  548.         return FALSE;
  549.     if (MF_POPUP & wMenuFlags)
  550.         {
  551.         /*
  552.          * If this is the cascade verb menu itself, display the same
  553.          * message.  m_phMenu[1] contains the current edit menu
  554.          * handle.
  555.          */
  556.         if (0!=wItem)
  557.             {
  558.             fRet=((HMENU)wItem==GetSubMenu(m_phMenu[1]
  559.                 , MENUPOS_OBJECT));
  560.             }
  561.         }
  562.     else
  563.         {
  564.         /*
  565.          * If the ID is in the verb range, use
  566.          * IDS_ITEMMESSAGEEDITOBJECT message
  567.          */
  568.         fRet=(IDM_VERBMIN <= wItem && IDM_VERBMAX >= wItem);
  569.         }
  570.     if (fRet)
  571.         m_pSL->MessageDisplay(IDM_EDITOBJECT);
  572.     return fRet;
  573.     }