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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * COSMO.CPP
  3.  * Cosmo Chapter 18
  4.  *
  5.  * WinMain and CCosmoFrame implementations.
  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 "cosmo.h"
  15. //CHAPTER18MOD
  16. /*
  17.  * These are for proper implementation of the class factory,
  18.  * OLE Documents support, and shutdown conditions.
  19.  */
  20. ULONG g_cObj=0;
  21. ULONG g_cLock=0;
  22. HWND  g_hWnd=NULL;
  23. BOOL  g_fUser=FALSE;
  24. //End CHAPTER18MOD
  25. /*
  26.  * WinMain
  27.  *
  28.  * Purpose:
  29.  *  Main entry point of application.  Should register the app class
  30.  *  if a previous instance has not done so and do any other one-time
  31.  *  initializations.
  32.  */
  33. int PASCAL WinMain (HINSTANCE hInst, HINSTANCE hPrev
  34.     , LPSTR pszCmdLine, int nCmdShow)
  35.     {
  36.     PCCosmoFrame    pFR;
  37.     FRAMEINIT       fi;
  38.     WPARAM          wRet;
  39.     SETMESSAGEQUEUE;
  40.     //Attempt to allocate and initialize the application
  41.     pFR=new CCosmoFrame(hInst, hPrev, pszCmdLine, nCmdShow);
  42.     if (NULL==pFR)
  43.         return -1;
  44.     fi.idsMin=IDS_FRAMEMIN;
  45.     fi.idsMax=IDS_FRAMEMAX;
  46.     fi.idsStatMin=IDS_STATMESSAGEMIN;
  47.     fi.idsStatMax=IDS_STATMESSAGEMAX;
  48.     fi.idStatMenuMin=ID_MENUFILE;
  49.     fi.idStatMenuMax=ID_MENUHELP;
  50.     fi.iPosWindowMenu=WINDOW_MENU;
  51.     fi.cMenus=CMENUS;
  52.     fi.x=CW_USEDEFAULT;
  53.     fi.y=CW_USEDEFAULT;
  54.     fi.cx=440;
  55.     fi.cy=460;
  56.     //If we can initialize pFR, start chugging messages
  57.     if (pFR->Init(&fi))
  58.         wRet=pFR->MessageLoop();
  59.     delete pFR;
  60.     return wRet;
  61.     }
  62. //CHAPTER18MOD
  63. /*
  64.  * ObjectDestroyed
  65.  *
  66.  * Purpose:
  67.  *  Function for the Cosmo Figure object to call when it gets
  68.  *  destroyed.  We destroy the main window if the proper conditions
  69.  *  are met for shutdown.
  70.  */
  71. void ObjectDestroyed(void)
  72.     {
  73.     g_cObj--;
  74.     //No more objects, no locks, no user control, shut the app down.
  75.     if (0L==g_cObj && 0L==g_cLock && IsWindow(g_hWnd) && !g_fUser)
  76.         PostMessage(g_hWnd, WM_CLOSE, 0, 0L);
  77.     return;
  78.     }
  79. //CHAPTER18MOD
  80. /*
  81.  * CCosmoFrame::CCosmoFrame
  82.  * CCosmoFrame::~CCosmoFrame
  83.  *
  84.  * Constructor Parameters:
  85.  *  hInst           HINSTANCE from WinMain
  86.  *  hInstPrev       HINSTANCE from WinMain
  87.  *  pszCmdLine      LPSTR from WinMain
  88.  *  nCmdShow        int from WInMain
  89.  */
  90. CCosmoFrame::CCosmoFrame(HINSTANCE hInst, HINSTANCE hInstPrev
  91.     , LPSTR pszCmdLine, int nCmdShow)
  92.     : CFrame(hInst, hInstPrev, pszCmdLine, nCmdShow)
  93.     {
  94.     UINT        i;
  95.     for (i=0; i<5; i++)
  96.         m_hBmpLines[i]=NULL;
  97.     m_uIDCurLine=0;
  98.     m_fInitialized=FALSE;
  99.     m_pIClassDataTran=NULL;
  100.     //CHAPTER18MOD
  101.     m_fEmbedding=FALSE;
  102.     m_dwRegCO=0;
  103.     m_pIClassFactory=NULL;
  104.     //End CHAPTER18MOD
  105.     return;
  106.     }
  107. CCosmoFrame::~CCosmoFrame(void)
  108.     {
  109.     UINT        i;
  110.     //CHAPTER18MOD
  111.     //Reverse CoRegisterClassObject, takes class factory ref to 1
  112.     if (0L!=m_dwRegCO)
  113.         CoRevokeClassObject(m_dwRegCO);
  114.     ReleaseInterface(m_pIClassFactory);
  115.     //End CHAPTER18MOD
  116.     for (i=0; i<5; i++)
  117.         {
  118.         if (NULL!=m_hBmpLines[i])
  119.             DeleteObject(m_hBmpLines[i]);
  120.         }
  121.     if (NULL!=m_pIClassDataTran)
  122.         {
  123.         m_pIClassDataTran->LockServer(FALSE);
  124.         m_pIClassDataTran->Release();
  125.         }
  126.     OleFlushClipboard();
  127.     if (m_fInitialized)
  128.         OleUninitialize();
  129.     return;
  130.     }
  131. /*
  132.  * CCosmoFrame::Init
  133.  *
  134.  * Purpose:
  135.  *  Call CoInitialize then calling down into the base class
  136.  *  initialization.
  137.  *
  138.  * Parameters:
  139.  *  pFI             PFRAMEINIT containing initialization parameters.
  140.  *
  141.  * Return Value:
  142.  *  BOOL            TRUE if initialization succeeded, FALSE otherwise.
  143.  */
  144. BOOL CCosmoFrame::Init(PFRAMEINIT pFI)
  145.     {
  146.     HRESULT     hr;
  147.     CHECKVER_OLE;
  148.     if (FAILED(OleInitialize(NULL)))
  149.         return FALSE;
  150.     m_fInitialized=TRUE;
  151.     hr=CoGetClassObject(CLSID_DataTransferObject
  152.         , CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory
  153.         , (PPVOID)&m_pIClassDataTran);
  154.     if (SUCCEEDED(hr))
  155.         m_pIClassDataTran->LockServer(TRUE);
  156.     //CHAPTER18MOD
  157.     //Check for command line flags
  158.     ParseCommandLine();
  159.     if (NULL!=m_ppszCmdArgs)
  160.         {
  161.         if(0==lstrcmpi(m_ppszCmdArgs[0], TEXT("-Embedding"))
  162.            || 0==lstrcmpi(m_ppszCmdArgs[0], TEXT("/Embedding")))
  163.             m_fEmbedding=TRUE;
  164.         }
  165.     g_fUser=!m_fEmbedding;
  166.     /*
  167.      * Create our class factory and register it for this application
  168.      * using CoRegisterClassObject.  The REGCLS_*USE flags have to
  169.      * do with servicable object from this instance, not with MDI or
  170.      * SDI.  Since it's most convenient to be single use, we'll do
  171.      * this in either version.
  172.      *
  173.      * In addition, it only makes sense to do any of this if we're
  174.      * being launched to be a server.
  175.      */
  176.     if (m_fEmbedding)
  177.         {
  178.         m_pIClassFactory=new CFigureClassFactory(this);
  179.         if (NULL==m_pIClassFactory)
  180.             return FALSE;
  181.         //Since we hold on to this, we should AddRef it.
  182.         m_pIClassFactory->AddRef();
  183.         hr=CoRegisterClassObject(CLSID_CosmoFigure, m_pIClassFactory
  184.             , CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE, &m_dwRegCO);
  185.         if (FAILED(hr))
  186.             return FALSE;
  187.         }
  188.     //End CHAPTER18MOD
  189.     return CFrame::Init(pFI);
  190.     }
  191. /*
  192.  * CCosmoFrame::CreateCClient
  193.  *
  194.  * Purpose:
  195.  *  Constructs a new client specific to the application.
  196.  *
  197.  * Parameters:
  198.  *  None
  199.  *
  200.  * Return Value:
  201.  *  PCClient        Pointer to the new client object.
  202.  */
  203. PCClient CCosmoFrame::CreateCClient(void)
  204.     {
  205.     return (PCClient)(new CCosmoClient(m_hInst, this));
  206.     }
  207. /*
  208.  * CCosmoFrame::RegisterAllClasses
  209.  *
  210.  * Purpose:
  211.  *  Registers all classes used in this application.
  212.  *
  213.  * Parameters:
  214.  *  None
  215.  *
  216.  * Return Value:
  217.  *  BOOL            TRUE if registration succeeded, FALSE otherwise.
  218.  */
  219. BOOL CCosmoFrame::RegisterAllClasses(void)
  220.     {
  221.     WNDCLASS        wc;
  222.     //First let the standard frame do its thing
  223.     if (!CFrame::RegisterAllClasses())
  224.         return FALSE;
  225.     /*
  226.      * We want a different background color for the document
  227.      * because the Polyline we put in the document will paint
  228.      * with COLOR_WINDOW which by default which is CLASSLIB's
  229.      * default document color.
  230.      */
  231.     GetClassInfo(m_hInst, SZCLASSDOCUMENT, &wc);
  232.     UnregisterClass(SZCLASSDOCUMENT, m_hInst);
  233.     wc.hbrBackground=(HBRUSH)(COLOR_APPWORKSPACE+1);
  234.     if (!RegisterClass(&wc))
  235.         return FALSE;
  236.     //Register the Polyline window.
  237.     wc.style         = CS_HREDRAW | CS_VREDRAW;
  238.     wc.hInstance     = m_hInst;
  239.     wc.cbClsExtra    = 0;
  240.     wc.lpfnWndProc   = PolylineWndProc;
  241.     wc.cbWndExtra    = CBPOLYLINEWNDEXTRA;
  242.     wc.hIcon         = NULL;
  243.     wc.hCursor       = LoadCursor(NULL, IDC_CROSS);
  244.     wc.hbrBackground = NULL;
  245.     wc.lpszMenuName  = NULL;
  246.     wc.lpszClassName = SZCLASSPOLYLINE;
  247.     if (!RegisterClass(&wc))
  248.         return FALSE;
  249.     return TRUE;
  250.     }
  251. /*
  252.  * CCosmoFrame::PreShowInit
  253.  *
  254.  * Purpose:
  255.  *  Called from Init before intially showing the window.  We do
  256.  *  whatever else we want here, modifying nCmdShow as necessary
  257.  *  which affects ShowWindow in Init.
  258.  *
  259.  * Parameters:
  260.  *  None
  261.  *
  262.  * Return Value:
  263.  *  BOOL            TRUE if this initialization succeeded,
  264.  *                  FALSE otherwise.
  265.  */
  266. BOOL CCosmoFrame::PreShowInit(void)
  267.     {
  268.     CreateLineMenu();
  269.     CheckLineSelection(IDM_LINESOLID);
  270.     //CHAPTER18MOD
  271.     //Save the window handle for shutdown if necessary.
  272.     g_hWnd=m_hWnd;
  273.     //If we're under OLE control, don't show the main window.
  274.     if (m_fEmbedding)
  275.         m_nCmdShow=SW_HIDE;
  276.     //End CHAPTER18MOD
  277.     return TRUE;
  278.     }
  279. /*
  280.  * CCosmoFrame::CreateLineMenu
  281.  *
  282.  * Purpose:
  283.  *  Initializes the bitmaps used to create the Line menu and
  284.  *  replaces the text items defined in the application resources
  285.  *  with these bitmaps.  Note that the contents of m_hBmpLines
  286.  *  must be cleaned up when the application terminates.
  287.  *
  288.  * Parameters:
  289.  *  None
  290.  *
  291.  * Return Value:
  292.  *  None
  293.  */
  294. void CCosmoFrame::CreateLineMenu(void)
  295.     {
  296.     HMENU       hMenu;
  297.     HDC         hDC, hMemDC;
  298.     HPEN        hPen;
  299.     HGDIOBJ     hObj;
  300.     TEXTMETRIC  tm;
  301.     UINT        i, cx, cy;
  302.     hMenu=GetSubMenu(GetMenu(m_hWnd), 3);   //Line menu.
  303.     hDC=GetDC(m_hWnd);
  304.     //Create each line in a menu item 8 chars wide, one char high.
  305.     GetTextMetrics(hDC, &tm);
  306.     cx=tm.tmAveCharWidth*8;
  307.     cy=tm.tmHeight;
  308.     /*
  309.      * Create a memory DC in which to draw lines, and bitmaps
  310.      * for each line.
  311.      */
  312.     hMemDC=CreateCompatibleDC(hDC);
  313.     ReleaseDC(m_hWnd, hDC);
  314.     for (i=0; i<5; i++)
  315.         {
  316.         m_hBmpLines[i]=CreateCompatibleBitmap(hMemDC, cx, cy);
  317.         SelectObject(hMemDC, m_hBmpLines[i]);
  318.         PatBlt(hMemDC, 0, 0, cx, cy, WHITENESS);
  319.         hPen=CreatePen(i, 1, 0L);       //i=line style like PS_SOLID
  320.         hObj=SelectObject(hMemDC, hPen);
  321.         MoveToEx(hMemDC, 0, cy/2, NULL);
  322.         LineTo(hMemDC, cx, cy/2);
  323.         ModifyMenu(hMenu, IDM_LINEMIN+i, MF_BYCOMMAND | MF_BITMAP
  324.             , IDM_LINEMIN+i, (LPTSTR)(LONG)(UINT)m_hBmpLines[i]);
  325.         SelectObject(hMemDC, hObj);
  326.         DeleteObject(hPen);
  327.         }
  328.     CheckMenuItem(hMenu, IDM_LINESOLID, MF_CHECKED);
  329.     DeleteDC(hMemDC);
  330.     return;
  331.     }
  332. /*
  333.  * CCosmoFrame::CreateToolbar
  334.  *
  335.  * Purpose:
  336.  *  Procedure to create all the necessary toolbar buttons.
  337.  *
  338.  * Parameters:
  339.  *  None
  340.  *
  341.  * Return Value:
  342.  *  UINT            Number of tools added to the bar.
  343.  */
  344. UINT CCosmoFrame::CreateToolbar(void)
  345.     {
  346.     UINT            iLast;
  347.     UINT            uState=GIZMO_NORMAL;
  348.     UINT            utCmd =GIZMOTYPE_BUTTONCOMMAND;
  349.     UINT            utEx  =GIZMOTYPE_BUTTONATTRIBUTEEX;
  350.     //Insert the standard ones.
  351.     iLast=CFrame::CreateToolbar();
  352.     /*
  353.      * Insert File Import in the 5th position and account for
  354.      * it in iLast.
  355.      */
  356.     m_pTB->Add(utCmd, 4, IDM_FILEIMPORT, m_dxB, m_dyB
  357.         , NULL, m_hBmp, 2, uState);
  358.     iLast++;
  359.     //Separator
  360.     m_pTB->Add(GIZMOTYPE_SEPARATOR, iLast++, 0, 6, m_dyB
  361.         , NULL, NULL, 0, uState);
  362.     /*
  363.      * For the Background bitmap, preserve our use of black
  364.      * (part of the image)
  365.      */
  366.     m_pTB->Add(utCmd, iLast++, IDM_COLORBACKGROUND, m_dxB, m_dyB
  367.         , NULL, m_hBmp, 3, GIZMO_NORMAL | PRESERVE_BLACK);
  368.     m_pTB->Add(utCmd, iLast++, IDM_COLORLINE, m_dxB, m_dyB
  369.         , NULL, m_hBmp, 4, uState);
  370.     //Separator
  371.     m_pTB->Add(GIZMOTYPE_SEPARATOR, iLast++, 0, 6, m_dyB
  372.         , NULL, NULL, 0, uState);
  373.     //Line styles.
  374.     m_pTB->Add(utEx, iLast++, IDM_LINESOLID, m_dxB, m_dyB
  375.         , NULL, m_hBmp, 5, uState);
  376.     m_pTB->Add(utEx, iLast++, IDM_LINEDASH, m_dxB, m_dyB
  377.         , NULL, m_hBmp, 6, uState);
  378.     m_pTB->Add(utEx, iLast++, IDM_LINEDOT, m_dxB, m_dyB
  379.         , NULL, m_hBmp, 7, uState);
  380.     m_pTB->Add(utEx, iLast++, IDM_LINEDASHDOT, m_dxB, m_dyB
  381.         , NULL, m_hBmp, 8, uState);
  382.     m_pTB->Add(utEx, iLast++, IDM_LINEDASHDOTDOT, m_dxB, m_dyB
  383.         , NULL, m_hBmp, 9, uState);
  384.     return iLast;
  385.     }
  386. /*
  387.  * CCosmoFrame::OnCommand
  388.  *
  389.  * Purpose:
  390.  *  WM_COMMAND handler for the Cosmo frame window that just
  391.  *  processes the line menu and the color menu leaving the
  392.  *  CFrame to do everything else.
  393.  *
  394.  * Parameters:
  395.  *  hWnd            HWND of the frame window.
  396.  *  wParam          WPARAM of the message.
  397.  *  lParam          LPARAM of the message.
  398.  *
  399.  * Return Value:
  400.  *  LRESULT         Return value for the message.
  401.  */
  402. LRESULT CCosmoFrame::OnCommand(HWND hWnd, WPARAM wParam
  403.     , LPARAM lParam)
  404.     {
  405.     PCCosmoDoc      pDoc;
  406.     TCHAR           szFile[CCHPATHMAX];
  407.     BOOL            fOK;
  408.     UINT            i, uTemp;
  409.     COLORREF        rgColors[16];
  410.     CHOOSECOLOR     cc;
  411.     COMMANDPARAMS(wID, wCode, hWndMsg);
  412.     /*
  413.      * Don't bother with anything during first initialization,
  414.      * skipping many toolbar notifications.
  415.      */
  416.     if (m_fInit)
  417.         return 0L;
  418.     pDoc=(PCCosmoDoc)m_pCL->ActiveDocument();
  419.     /*
  420.      * Check for the line style commands which are
  421.      * IDM_LINEMIN+<style>.  We handle this by changing the menu
  422.      * and toolbar, then we pass it to the document for real
  423.      * processing.
  424.      */
  425.     if (NULL!=pDoc && IDM_LINEMIN <= wID && IDM_LINEMAX >=wID)
  426.         {
  427.         CheckLineSelection(wID);
  428.         pDoc->LineStyleSet(wID-IDM_LINEMIN);
  429.         return 0L;
  430.         }
  431.     switch (wID)
  432.         {
  433.         case IDM_FILEIMPORT:
  434.             szFile[0]=0;
  435.             fOK=SaveOpenDialog(szFile, CCHPATHMAX, IDS_FILEIMPORT
  436.                 , TRUE, &i);
  437.             if (fOK)
  438.                 {
  439.                 uTemp=pDoc->Load(FALSE, szFile);
  440.                 pDoc->ErrorMessage(uTemp);
  441.                 }
  442.             return (LRESULT)fOK;
  443.         case IDM_COLORBACKGROUND:
  444.         case IDM_COLORLINE:
  445.             //Invoke the color chooser for either color
  446.             uTemp=(IDM_COLORBACKGROUND==wID)
  447.                 ? DOCCOLOR_BACKGROUND : DOCCOLOR_LINE;
  448.             for (i=0; i<16; i++)
  449.                 rgColors[i]=RGB(0, 0, i*16);
  450.             memset(&cc, 0, sizeof(CHOOSECOLOR));
  451.             cc.lStructSize=sizeof(CHOOSECOLOR);
  452.             cc.lpCustColors=rgColors;
  453.             cc.hwndOwner=hWnd;
  454.             cc.Flags=CC_RGBINIT;
  455.             cc.rgbResult=pDoc->ColorGet(uTemp);
  456.             if (ChooseColor(&cc))
  457.                 pDoc->ColorSet(uTemp, cc.rgbResult);
  458.             break;
  459.         default:
  460.            CFrame::OnCommand(hWnd, wParam, lParam);
  461.         }
  462.     return 0L;
  463.     }
  464. /*
  465.  * CCosmoFrame::OnDocumentDataChange
  466.  *
  467.  * Purpose:
  468.  *  Update the Line menu and toolbar if the style in the data
  469.  *  changes.
  470.  *
  471.  * Parameters:
  472.  *  pDoc            PCDocument notifying the sink.
  473.  *
  474.  * Return Value:
  475.  *  None
  476.  */
  477. void CCosmoFrame::OnDocumentDataChange(PCDocument pDoc)
  478.     {
  479.     CheckLineSelection(IDM_LINEMIN
  480.         +((PCCosmoDoc)pDoc)->LineStyleGet());
  481.     return;
  482.     }
  483. /*
  484.  * CCosmoFrame::OnDocumentActivate
  485.  *
  486.  * Purpose:
  487.  *  Informs us that document activation changed, so update the UI
  488.  *  for that new document.
  489.  *
  490.  * Parameters:
  491.  *  pDoc            PCDocument notifying the sink.
  492.  *
  493.  * Return Value:
  494.  *  None
  495.  */
  496. void CCosmoFrame::OnDocumentActivate(PCDocument pDoc)
  497.     {
  498.     CheckLineSelection(IDM_LINEMIN
  499.         +((PCCosmoDoc)pDoc)->LineStyleGet());
  500.     return;
  501.     }
  502. /*
  503.  * CCosmoFrame::UpdateMenus
  504.  *
  505.  * Purpose:
  506.  *  Handles the WM_INITMENU message for the frame window.  Depending
  507.  *  on the existence of an active window, menu items are selectively
  508.  *  enabled and disabled.
  509.  *
  510.  * Parameters:
  511.  *  hMenu           HMENU of the menu to intialize
  512.  *  iMenu           UINT position of the menu.
  513.  *
  514.  * Return Value:
  515.  *  None
  516.  */
  517. void CCosmoFrame::UpdateMenus(HMENU hMenu, UINT iMenu)
  518.     {
  519.     PCDocument  pDoc;
  520.     BOOL        fOK=FALSE;
  521.     BOOL        fCallDefault=TRUE;
  522.     UINT        i;
  523.     UINT        uTemp;
  524.     UINT        uTempE;
  525.     UINT        uTempD;
  526.     pDoc=m_pCL->ActiveDocument();
  527.     uTempE=MF_ENABLED | MF_BYCOMMAND;
  528.     uTempD=MF_DISABLED | MF_GRAYED | MF_BYCOMMAND;
  529.     uTemp=((NULL!=pDoc) ? uTempE : uTempD);
  530.     //File menu:  If there is document window, disable Import.
  531.     if (m_phMenu[0]==hMenu)
  532.         EnableMenuItem(hMenu, IDM_FILEIMPORT, uTemp);
  533.     //Color menu:  no document, no commands
  534.     if (m_phMenu[2]==hMenu)
  535.         {
  536.         EnableMenuItem(hMenu, IDM_COLORBACKGROUND, uTemp);
  537.         EnableMenuItem(hMenu, IDM_COLORLINE,       uTemp);
  538.         fCallDefault=FALSE;
  539.         }
  540.     //Line menu:  no document, no commands
  541.     if (m_phMenu[3]==hMenu)
  542.         {
  543.         for (i=IDM_LINEMIN; i<=IDM_LINEMAX; i++)
  544.             EnableMenuItem(hMenu, i, uTemp);
  545.         fCallDefault=FALSE;
  546.         }
  547.     if (fCallDefault)
  548.         CFrame::UpdateMenus(hMenu, iMenu);
  549.     return;
  550.     }
  551. /*
  552.  * CCosmoFrame::UpdateToolbar
  553.  *
  554.  * Purpose:
  555.  *  Enables and disables tools depending on whether we have
  556.  *  a document or not.
  557.  *
  558.  * Parameters:
  559.  *  None
  560.  *
  561.  * Return Value:
  562.  *  None
  563.  */
  564. void CCosmoFrame::UpdateToolbar(void)
  565.     {
  566.     BOOL        fLast;
  567.     UINT        i;
  568.     //Save the last enabled state before CFrame changes it
  569.     fLast=m_fLastEnable;
  570.     //Let the default hack on its tools
  571.     CFrame::UpdateToolbar();
  572.     /*
  573.      * If CFrame::UpdateToolbar changed anything, then we need
  574.      * to change as well--if nothing changes, nothing to do.
  575.      */
  576.     if (fLast!=m_fLastEnable)
  577.         {
  578.         m_pTB->Enable(IDM_FILEIMPORT, m_fLastEnable);
  579.         m_pTB->Enable(IDM_COLORBACKGROUND, m_fLastEnable);
  580.         m_pTB->Enable(IDM_COLORLINE,       m_fLastEnable);
  581.         for (i=IDM_LINEMIN; i <= IDM_LINEMAX; i++)
  582.             m_pTB->Enable(i, m_fLastEnable);
  583.         }
  584.     return;
  585.     }
  586. /*
  587.  * CCosmoFrame::CheckLineSelection
  588.  *
  589.  * Purpose:
  590.  *  Maintains the bitmap menu and the tools for the line selection.
  591.  *  Both are mutially exclusive option lists where a selection in
  592.  *  one has to affect the other.
  593.  *
  594.  * Parameters:
  595.  *  uID             UINT ID of the item to be selected
  596.  *
  597.  * Return Value:
  598.  *  None
  599.  */
  600. void CCosmoFrame::CheckLineSelection(UINT uID)
  601.     {
  602.     UINT        i;
  603.     HMENU       hMenu;
  604.     //Update menus and tools if the selection changed.
  605.     if (uID!=m_uIDCurLine)
  606.         {
  607.         m_uIDCurLine=uID;
  608.         hMenu=GetMenu(m_hWnd);
  609.         //Uncheck all lines initially.
  610.         for (i=IDM_LINEMIN; i<=IDM_LINEMAX; i++)
  611.             CheckMenuItem(hMenu, i, MF_UNCHECKED | MF_BYCOMMAND);
  612.         CheckMenuItem(hMenu, uID, MF_CHECKED | MF_BYCOMMAND);
  613.         m_pTB->Check(uID, TRUE);
  614.         }
  615.     return;
  616.     }
  617. //CHAPTER18MOD
  618. /*
  619.  * CCosmoFrame::UpdateEmbeddingUI
  620.  *
  621.  * Purpose:
  622.  *  Puts the application into the user interface for editing an
  623.  *  embedded object, manipulating menus and title bars.
  624.  *
  625.  * Parameters:
  626.  *  fEmbedding      BOOL TRUE to go in the mode, FALSE to leave it.
  627.  *  pszApp          LPCTSTR name of the container application as
  628.  *                  received in IOleObject::SetHostNames.
  629.  *  pszObj          LPCTSTR name of the object in the container as
  630.  *                  received in IOleObject::SetHostNames.
  631.  *
  632.  * Return Value:
  633.  *  None
  634.  */
  635. void CCosmoFrame::UpdateEmbeddingUI(BOOL fEmbedding
  636.     , PCDocument pDoc, LPCTSTR pszApp, LPCTSTR pszObj)
  637.     {
  638.     HMENU           hMenu;
  639.     TCHAR           szTemp[256];
  640.     //First let's play with the File menu.
  641.     hMenu=m_phMenu[0];
  642.     //Remove or add the File New, Open, and Save items
  643.     if (fEmbedding)
  644.         {
  645.         DeleteMenu(m_phMenu[0], IDM_FILENEW,   MF_BYCOMMAND);
  646.         DeleteMenu(m_phMenu[0], IDM_FILEOPEN,  MF_BYCOMMAND);
  647.         DeleteMenu(m_phMenu[0], IDM_FILECLOSE, MF_BYCOMMAND);
  648.         DeleteMenu(m_phMenu[0], IDM_FILESAVE,  MF_BYCOMMAND);
  649.         //Save As->Save Copy As
  650.         ModifyMenu(m_phMenu[0], IDM_FILESAVEAS, MF_BYCOMMAND
  651.             , IDM_FILESAVEAS, PSZ(IDS_SAVECOPYAS));
  652.         }
  653.     else
  654.         {
  655.         InsertMenu(m_phMenu[0], 0, MF_BYPOSITION, IDM_FILENEW
  656.             , PSZ(IDS_NEW));
  657.         InsertMenu(m_phMenu[0], 1, MF_BYPOSITION, IDM_FILEOPEN
  658.             , PSZ(IDS_OPEN));
  659.         InsertMenu(m_phMenu[0], 2, MF_BYPOSITION, IDM_FILESAVE
  660.             , PSZ(IDS_SAVE));
  661.         InsertMenu(m_phMenu[0], 3, MF_BYPOSITION, IDM_FILECLOSE
  662.             , PSZ(IDS_SAVE));
  663.         //Save Copy As->Save As
  664.         ModifyMenu(m_phMenu[0], IDM_FILESAVEAS, MF_BYCOMMAND
  665.             , IDM_FILESAVEAS, PSZ(IDS_SAVEAS));
  666.         }
  667.     //Change "Exit" to "Exit & Return to xx" or vice-versa for SDI
  668.     if (fEmbedding)
  669.         wsprintf(szTemp, PSZ(IDS_EXITANDRETURN), (LPSTR)pszObj);
  670.     else
  671.         lstrcpy(szTemp, PSZ(IDS_EXIT));
  672.     ModifyMenu(m_phMenu[0], IDM_FILEEXIT, MF_STRING, IDM_FILEEXIT
  673.         , szTemp);
  674.     DrawMenuBar(m_hWnd);
  675.     //Now let's play with the toolbar.
  676.     m_pTB->Show(IDM_FILENEW,   !fEmbedding);
  677.     m_pTB->Show(IDM_FILEOPEN,  !fEmbedding);
  678.     m_pTB->Show(IDM_FILECLOSE, !fEmbedding);
  679.     m_pTB->Show(IDM_FILESAVE,  !fEmbedding);
  680.     //Enable what's left appropriately.
  681.     UpdateToolbar();
  682.     //Now play with the title bar.
  683.     //IDS_EMBEDDINGCAPTION is MDI/SDI sensitive in COSMO.RC.
  684.     wsprintf(szTemp, PSZ(IDS_EMBEDDINGCAPTION), pszObj);
  685.     /*
  686.      * Remember that in MDI situations that Windows takes care of
  687.      * the frame window caption bar when the document is maximized.
  688.      */
  689.    #ifdef MDI
  690.     SetWindowText(pDoc->Window(), szTemp);
  691.    #else
  692.     SetWindowText(m_hWnd, szTemp);
  693.    #endif
  694.     return;
  695.     }
  696. //End CHAPTER18MOD