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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * COCOSMO.CPP
  3.  * Component Cosmo Chapter 10
  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 "cocosmo.h"
  15. /*
  16.  * WinMain
  17.  *
  18.  * Purpose:
  19.  *  Main entry point of application.  Should register the app class
  20.  *  if a previous instance has not done so and do any other one-time
  21.  *  initializations.
  22.  */
  23. int PASCAL WinMain (HINSTANCE hInst, HINSTANCE hPrev
  24.     , LPSTR pszCmdLine, int nCmdShow)
  25.     {
  26.     PCCosmoFrame    pFR;
  27.     FRAMEINIT       fi;
  28.     WPARAM          wRet;
  29.     //Attempt to allocate and initialize the application
  30.     pFR=new CCosmoFrame(hInst, hPrev, pszCmdLine, nCmdShow);
  31.     if (NULL==pFR)
  32.         return -1;
  33.     fi.idsMin=IDS_FRAMEMIN;
  34.     fi.idsMax=IDS_FRAMEMAX;
  35.     fi.idsStatMin=IDS_STATMESSAGEMIN;
  36.     fi.idsStatMax=IDS_STATMESSAGEMAX;
  37.     fi.idStatMenuMin=ID_MENUFILE;
  38.     fi.idStatMenuMax=ID_MENUHELP;
  39.     fi.iPosWindowMenu=WINDOW_MENU;
  40.     fi.cMenus=CMENUS;
  41.     fi.x=CW_USEDEFAULT;
  42.     fi.y=CW_USEDEFAULT;
  43.     fi.cx=440;
  44.     fi.cy=460;
  45.     //If we can initialize pFR, start chugging messages
  46.     if (pFR->Init(&fi))
  47.         wRet=pFR->MessageLoop();
  48.     delete pFR;
  49.     return wRet;
  50.     }
  51. /*
  52.  * CCosmoFrame::CCosmoFrame
  53.  * CCosmoFrame::~CCosmoFrame
  54.  *
  55.  * Constructor Parameters:
  56.  *  hInst           HINSTANCE from WinMain
  57.  *  hInstPrev       HINSTANCE from WinMain
  58.  *  pszCmdLine      LPSTR from WinMain
  59.  *  nCmdShow        int from WInMain
  60.  */
  61. CCosmoFrame::CCosmoFrame(HINSTANCE hInst, HINSTANCE hInstPrev
  62.     , LPSTR pszCmdLine, int nCmdShow)
  63.     : CFrame(hInst, hInstPrev, pszCmdLine, nCmdShow)
  64.     {
  65.     UINT        i;
  66.     for (i=0; i<5; i++)
  67.         m_hBmpLines[i]=NULL;
  68.     m_uIDCurLine=0;
  69.     m_fInitialized=FALSE;
  70.     return;
  71.     }
  72. CCosmoFrame::~CCosmoFrame(void)
  73.     {
  74.     UINT        i;
  75.     for (i=0; i<5; i++)
  76.         {
  77.         if (NULL!=m_hBmpLines[i])
  78.             DeleteObject(m_hBmpLines[i]);
  79.         }
  80.     if (m_fInitialized)
  81.         CoUninitialize();
  82.     return;
  83.     }
  84. /*
  85.  * CCosmoFrame::Init
  86.  *
  87.  * Purpose:
  88.  *  Call CoInitialize then calling down into the base class
  89.  *  initialization.
  90.  *
  91.  * Parameters:
  92.  *  pFI             PFRAMEINIT containing initialization
  93.  *                  parameters.
  94.  *
  95.  * Return Value:
  96.  *  BOOL            TRUE if initialization succeeded,
  97.  *                  FALSE otherwise.
  98.  */
  99. BOOL CCosmoFrame::Init(PFRAMEINIT pFI)
  100.     {
  101.     CHECKVER_COM;
  102.     if (FAILED(CoInitialize(NULL)))
  103.         return FALSE;
  104.     m_fInitialized=TRUE;
  105.     return CFrame::Init(pFI);
  106.     }
  107. /*
  108.  * CCosmoFrame::CreateCClient
  109.  *
  110.  * Purpose:
  111.  *  Constructs a new client specific to the application.
  112.  *
  113.  * Parameters:
  114.  *  None
  115.  *
  116.  * Return Value:
  117.  *  PCClient        Pointer to the new client object.
  118.  */
  119. PCClient CCosmoFrame::CreateCClient(void)
  120.     {
  121.     return (PCClient)(new CCosmoClient(m_hInst, this));
  122.     }
  123. /*
  124.  * CCosmoFrame::RegisterAllClasses
  125.  *
  126.  * Purpose:
  127.  *  Registers all classes used in this application.
  128.  *
  129.  * Parameters:
  130.  *  None
  131.  *
  132.  * Return Value:
  133.  *  BOOL            TRUE if registration succeeded, FALSE otherwise.
  134.  */
  135. BOOL CCosmoFrame::RegisterAllClasses(void)
  136.     {
  137.     WNDCLASS        wc;
  138.     //First let the standard frame do its thing
  139.     if (!CFrame::RegisterAllClasses())
  140.         return FALSE;
  141.     /*
  142.      * We want a different background color for the document
  143.      * because the Polyline we put in the document will paint
  144.      * with COLOR_WINDOW which by default which is CLASSLIB's
  145.      * default document color.
  146.      */
  147.     GetClassInfo(m_hInst, SZCLASSDOCUMENT, &wc);
  148.     UnregisterClass(SZCLASSDOCUMENT, m_hInst);
  149.     wc.hbrBackground=(HBRUSH)(COLOR_APPWORKSPACE+1);
  150.     if (!RegisterClass(&wc))
  151.         return FALSE;
  152.     //No need to register the Polyline window now...
  153.     return TRUE;
  154.     }
  155. /*
  156.  * CCosmoFrame::PreShowInit
  157.  *
  158.  * Purpose:
  159.  *  Called from Init before intially showing the window.  We do
  160.  *  whatever else we want here, modifying nCmdShow as necessary
  161.  *  which affects ShowWindow in Init.
  162.  *
  163.  * Parameters:
  164.  *  None
  165.  *
  166.  * Return Value:
  167.  *  BOOL            TRUE if this initialization succeeded,
  168.  *                  FALSE otherwise.
  169.  */
  170. BOOL CCosmoFrame::PreShowInit(void)
  171.     {
  172.     CreateLineMenu();
  173.     CheckLineSelection(IDM_LINESOLID);
  174.     return TRUE;
  175.     }
  176. /*
  177.  * CCosmoFrame::CreateLineMenu
  178.  *
  179.  * Purpose:
  180.  *  Initializes the bitmaps used to create the Line menu and
  181.  *  replaces the text items defined in the application resources
  182.  *  with these bitmaps.  Note that the contents of m_hBmpLines
  183.  *  must be cleaned up when the application terminates.
  184.  *
  185.  * Parameters:
  186.  *  None
  187.  *
  188.  * Return Value:
  189.  *  None
  190.  */
  191. void CCosmoFrame::CreateLineMenu(void)
  192.     {
  193.     HMENU       hMenu;
  194.     HDC         hDC, hMemDC;
  195.     HPEN        hPen;
  196.     HGDIOBJ     hObj;
  197.     TEXTMETRIC  tm;
  198.     UINT        i, cx, cy;
  199.     hMenu=GetSubMenu(GetMenu(m_hWnd), 3);   //Line menu.
  200.     hDC=GetDC(m_hWnd);
  201.     //Create each line in a menu item 8 chars wide, one char high.
  202.     GetTextMetrics(hDC, &tm);
  203.     cx=tm.tmAveCharWidth*8;
  204.     cy=tm.tmHeight;
  205.     /*
  206.      * Create a memory DC in which to draw lines, and bitmaps
  207.      * for each line.
  208.      */
  209.     hMemDC=CreateCompatibleDC(hDC);
  210.     ReleaseDC(m_hWnd, hDC);
  211.     for (i=0; i<5; i++)
  212.         {
  213.         m_hBmpLines[i]=CreateCompatibleBitmap(hMemDC, cx, cy);
  214.         SelectObject(hMemDC, m_hBmpLines[i]);
  215.         PatBlt(hMemDC, 0, 0, cx, cy, WHITENESS);
  216.         hPen=CreatePen(i, 1, 0L);       //i=line style like PS_SOLID
  217.         hObj=SelectObject(hMemDC, hPen);
  218.         MoveToEx(hMemDC, 0, cy/2, NULL);
  219.         LineTo(hMemDC, cx, cy/2);
  220.         ModifyMenu(hMenu, IDM_LINEMIN+i, MF_BYCOMMAND | MF_BITMAP
  221.             , IDM_LINEMIN+i, (LPTSTR)(LONG)(UINT)m_hBmpLines[i]);
  222.         SelectObject(hMemDC, hObj);
  223.         DeleteObject(hPen);
  224.         }
  225.     CheckMenuItem(hMenu, IDM_LINESOLID, MF_CHECKED);
  226.     DeleteDC(hMemDC);
  227.     return;
  228.     }
  229. /*
  230.  * CCosmoFrame::CreateToolbar
  231.  *
  232.  * Purpose:
  233.  *  Procedure to create all the necessary toolbar buttons.
  234.  *
  235.  * Parameters:
  236.  *  None
  237.  *
  238.  * Return Value:
  239.  *  UINT            Number of tools added to the bar.
  240.  */
  241. UINT CCosmoFrame::CreateToolbar(void)
  242.     {
  243.     UINT            iLast;
  244.     UINT            uState=GIZMO_NORMAL;
  245.     UINT            utCmd =GIZMOTYPE_BUTTONCOMMAND;
  246.     UINT            utEx  =GIZMOTYPE_BUTTONATTRIBUTEEX;
  247.     //Insert the standard ones.
  248.     iLast=CFrame::CreateToolbar();
  249.     /*
  250.      * Insert File Import in the 5th position and account for
  251.      * it in iLast.
  252.      */
  253.     m_pTB->Add(utCmd, 4, IDM_FILEIMPORT, m_dxB, m_dyB
  254.         , NULL, m_hBmp, 2, uState);
  255.     iLast++;
  256.     //Separator
  257.     m_pTB->Add(GIZMOTYPE_SEPARATOR, iLast++, 0, 6, m_dyB
  258.         , NULL, NULL, 0, uState);
  259.     /*
  260.      * For the Background bitmap, preserve our use of black
  261.      * (part of the image)
  262.      */
  263.     m_pTB->Add(utCmd, iLast++, IDM_COLORBACKGROUND, m_dxB, m_dyB
  264.         , NULL, m_hBmp, 3, GIZMO_NORMAL | PRESERVE_BLACK);
  265.     m_pTB->Add(utCmd, iLast++, IDM_COLORLINE, m_dxB, m_dyB
  266.         , NULL, m_hBmp, 4, uState);
  267.     //Separator
  268.     m_pTB->Add(GIZMOTYPE_SEPARATOR, iLast++, 0, 6, m_dyB
  269.         , NULL, NULL, 0, uState);
  270.     //Line styles.
  271.     m_pTB->Add(utEx, iLast++, IDM_LINESOLID, m_dxB, m_dyB
  272.         , NULL, m_hBmp, 5, uState);
  273.     m_pTB->Add(utEx, iLast++, IDM_LINEDASH, m_dxB, m_dyB
  274.         , NULL, m_hBmp, 6, uState);
  275.     m_pTB->Add(utEx, iLast++, IDM_LINEDOT, m_dxB, m_dyB
  276.         , NULL, m_hBmp, 7, uState);
  277.     m_pTB->Add(utEx, iLast++, IDM_LINEDASHDOT, m_dxB, m_dyB
  278.         , NULL, m_hBmp, 8, uState);
  279.     m_pTB->Add(utEx, iLast++, IDM_LINEDASHDOTDOT, m_dxB, m_dyB
  280.         , NULL, m_hBmp, 9, uState);
  281.     return iLast;
  282.     }
  283. /*
  284.  * CCosmoFrame::OnCommand
  285.  *
  286.  * Purpose:
  287.  *  WM_COMMAND handler for the Cosmo frame window that just
  288.  *  processes the line menu and the color menu leaving the
  289.  *  CFrame to do everything else.
  290.  *
  291.  * Parameters:
  292.  *  hWnd            HWND of the frame window.
  293.  *  wParam          WPARAM of the message.
  294.  *  lParam          LPARAM of the message.
  295.  *
  296.  * Return Value:
  297.  *  LRESULT         Return value for the message.
  298.  */
  299. LRESULT CCosmoFrame::OnCommand(HWND hWnd, WPARAM wParam
  300.     , LPARAM lParam)
  301.     {
  302.     PCCosmoDoc      pDoc;
  303.     TCHAR           szFile[CCHPATHMAX];
  304.     BOOL            fOK;
  305.     UINT            i, uTemp;
  306.     COLORREF        rgColors[16];
  307.     CHOOSECOLOR     cc;
  308.     COMMANDPARAMS(wID, wCode, hWndMsg);
  309.     /*
  310.      * Don't bother with anything during first initialization,
  311.      * skipping many toolbar notifications.
  312.      */
  313.     if (m_fInit)
  314.         return 0L;
  315.     pDoc=(PCCosmoDoc)m_pCL->ActiveDocument();
  316.     /*
  317.      * Check for the line style commands which are
  318.      * IDM_LINEMIN+<style>.  We handle this by changing the menu
  319.      * and toolbar, then we pass it to the document for real
  320.      * processing.
  321.      */
  322.     if (NULL!=pDoc && IDM_LINEMIN <= wID && IDM_LINEMAX >=wID)
  323.         {
  324.         CheckLineSelection(wID);
  325.         pDoc->LineStyleSet(wID-IDM_LINEMIN);
  326.         return 0L;
  327.         }
  328.     switch (wID)
  329.         {
  330.         case IDM_FILEIMPORT:
  331.             szFile[0]=0;
  332.             fOK=SaveOpenDialog(szFile, CCHPATHMAX, IDS_FILEIMPORT
  333.                 , TRUE, &i);
  334.             if (fOK)
  335.                 {
  336.                 uTemp=pDoc->Load(FALSE, szFile);
  337.                 pDoc->ErrorMessage(uTemp);
  338.                 }
  339.             return (LRESULT)fOK;
  340.         case IDM_COLORBACKGROUND:
  341.         case IDM_COLORLINE:
  342.             //Invoke the color chooser for either color
  343.             uTemp=(IDM_COLORBACKGROUND==wID)
  344.                 ? DOCCOLOR_BACKGROUND : DOCCOLOR_LINE;
  345.             for (i=0; i<16; i++)
  346.                 rgColors[i]=RGB(0, 0, i*16);
  347.             memset(&cc, 0, sizeof(CHOOSECOLOR));
  348.             cc.lStructSize=sizeof(CHOOSECOLOR);
  349.             cc.lpCustColors=rgColors;
  350.             cc.hwndOwner=hWnd;
  351.             cc.Flags=CC_RGBINIT;
  352.             cc.rgbResult=pDoc->ColorGet(uTemp);
  353.             if (ChooseColor(&cc))
  354.                 pDoc->ColorSet(uTemp, cc.rgbResult);
  355.             break;
  356.         default:
  357.            CFrame::OnCommand(hWnd, wParam, lParam);
  358.         }
  359.     return 0L;
  360.     }
  361. /*
  362.  * CCosmoFrame::OnDocumentDataChange
  363.  *
  364.  * Purpose:
  365.  *  Update the Line menu and toolbar if the style in the data
  366.  *  changes.
  367.  *
  368.  * Parameters:
  369.  *  pDoc            PCDocument notifying the sink.
  370.  *
  371.  * Return Value:
  372.  *  None
  373.  */
  374. void CCosmoFrame::OnDocumentDataChange(PCDocument pDoc)
  375.     {
  376.     CheckLineSelection(IDM_LINEMIN
  377.         +((PCCosmoDoc)pDoc)->LineStyleGet());
  378.     return;
  379.     }
  380. /*
  381.  * CCosmoFrame::OnDocumentActivate
  382.  *
  383.  * Purpose:
  384.  *  Informs us that document activation changed, so update the UI
  385.  *  for that new document.
  386.  *
  387.  * Parameters:
  388.  *  pDoc            PCDocument notifying the sink.
  389.  *
  390.  * Return Value:
  391.  *  None
  392.  */
  393. void CCosmoFrame::OnDocumentActivate(PCDocument pDoc)
  394.     {
  395.     CheckLineSelection(IDM_LINEMIN
  396.         +((PCCosmoDoc)pDoc)->LineStyleGet());
  397.     return;
  398.     }
  399. /*
  400.  * CCosmoFrame::UpdateMenus
  401.  *
  402.  * Purpose:
  403.  *  Handles the WM_INITMENU message for the frame window.  Depending
  404.  *  on the existence of an active window, menu items are selectively
  405.  *  enabled and disabled.
  406.  *
  407.  * Parameters:
  408.  *  hMenu           HMENU of the menu to intialize
  409.  *  iMenu           UINT position of the menu.
  410.  *
  411.  * Return Value:
  412.  *  None
  413.  */
  414. void CCosmoFrame::UpdateMenus(HMENU hMenu, UINT iMenu)
  415.     {
  416.     PCDocument  pDoc;
  417.     BOOL        fOK=FALSE;
  418.     BOOL        fCallDefault=TRUE;
  419.     UINT        i;
  420.     UINT        uTemp;
  421.     UINT        uTempE;
  422.     UINT        uTempD;
  423.     pDoc=m_pCL->ActiveDocument();
  424.     uTempE=MF_ENABLED | MF_BYCOMMAND;
  425.     uTempD=MF_DISABLED | MF_GRAYED | MF_BYCOMMAND;
  426.     uTemp=((NULL!=pDoc) ? uTempE : uTempD);
  427.     //File menu:  If there is document window, disable Import.
  428.     if (m_phMenu[0]==hMenu)
  429.         EnableMenuItem(hMenu, IDM_FILEIMPORT, uTemp);
  430.     //Color menu:  no document, no commands
  431.     if (m_phMenu[2]==hMenu)
  432.         {
  433.         EnableMenuItem(hMenu, IDM_COLORBACKGROUND, uTemp);
  434.         EnableMenuItem(hMenu, IDM_COLORLINE,       uTemp);
  435.         fCallDefault=FALSE;
  436.         }
  437.     //Line menu:  no document, no commands
  438.     if (m_phMenu[3]==hMenu)
  439.         {
  440.         for (i=IDM_LINEMIN; i<=IDM_LINEMAX; i++)
  441.             EnableMenuItem(hMenu, i, uTemp);
  442.         fCallDefault=FALSE;
  443.         }
  444.     if (fCallDefault)
  445.         CFrame::UpdateMenus(hMenu, iMenu);
  446.     return;
  447.     }
  448. /*
  449.  * CCosmoFrame::UpdateToolbar
  450.  *
  451.  * Purpose:
  452.  *  Enables and disables tools depending on whether we have
  453.  *  a document or not.
  454.  *
  455.  * Parameters:
  456.  *  None
  457.  *
  458.  * Return Value:
  459.  *  None
  460.  */
  461. void CCosmoFrame::UpdateToolbar(void)
  462.     {
  463.     BOOL        fLast;
  464.     UINT        i;
  465.     //Save the last enabled state before CFrame changes it
  466.     fLast=m_fLastEnable;
  467.     //Let the default hack on its tools
  468.     CFrame::UpdateToolbar();
  469.     /*
  470.      * If CFrame::UpdateToolbar changed anything, then we need
  471.      * to change as well--if nothing changes, nothing to do.
  472.      */
  473.     if (fLast!=m_fLastEnable)
  474.         {
  475.         m_pTB->Enable(IDM_FILEIMPORT, m_fLastEnable);
  476.         m_pTB->Enable(IDM_COLORBACKGROUND, m_fLastEnable);
  477.         m_pTB->Enable(IDM_COLORLINE,       m_fLastEnable);
  478.         for (i=IDM_LINEMIN; i <= IDM_LINEMAX; i++)
  479.             m_pTB->Enable(i, m_fLastEnable);
  480.         }
  481.     return;
  482.     }
  483. /*
  484.  * CCosmoFrame::CheckLineSelection
  485.  *
  486.  * Purpose:
  487.  *  Maintains the bitmap menu and the tools for the line selection.
  488.  *  Both are mutially exclusive option lists where a selection in
  489.  *  one has to affect the other.
  490.  *
  491.  * Parameters:
  492.  *  uID             UINT ID of the item to be selected
  493.  *
  494.  * Return Value:
  495.  *  None
  496.  */
  497. void CCosmoFrame::CheckLineSelection(UINT uID)
  498.     {
  499.     UINT        i;
  500.     HMENU       hMenu;
  501.     //Update menus and tools if the selection changed.
  502.     if (uID!=m_uIDCurLine)
  503.         {
  504.         m_uIDCurLine=uID;
  505.         hMenu=GetMenu(m_hWnd);
  506.         //Uncheck all lines initially.
  507.         for (i=IDM_LINEMIN; i<=IDM_LINEMAX; i++)
  508.             CheckMenuItem(hMenu, i, MF_UNCHECKED | MF_BYCOMMAND);
  509.         CheckMenuItem(hMenu, uID, MF_CHECKED | MF_BYCOMMAND);
  510.         m_pTB->Check(uID, TRUE);
  511.         }
  512.     return;
  513.     }