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

Windows编程

开发平台:

Visual C++

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