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

Windows编程

开发平台:

Visual C++

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