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

Windows编程

开发平台:

Visual C++

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