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

Windows编程

开发平台:

Visual C++

  1. //**********************************************************************
  2. // File name: app.cpp
  3. //
  4. //    Implementation file for the CSimpleApp Class
  5. //
  6. // Functions:
  7. //
  8. //    See app.h for a list of member functions.
  9. //
  10. // Copyright (c) 1992 - 1997 Microsoft Corporation. All rights reserved.
  11. //**********************************************************************
  12. #include "pre.h"
  13. #include "iocs.h"
  14. #include "ias.h"
  15. #include "ioipf.h"
  16. #include "ioips.h"
  17. #include "app.h"
  18. #include "site.h"
  19. #include "doc.h"
  20. #include "stdpal.h"
  21. #define cpeAppPal 256  // number of colors in our apps palette
  22. typedef struct
  23.    {
  24.    WORD wVersion;
  25.    WORD cpe;
  26.    PALETTEENTRY rgpe[cpeAppPal];
  27.    } LOGPAL;
  28. //**********************************************************************
  29. //
  30. // CreateStandardPalette
  31. //
  32. // Purpose:
  33. //
  34. //      Creates a standard Apps palette.
  35. //
  36. // Parameters:
  37. //
  38. //      None
  39. //
  40. // Return Value:
  41. //
  42. //      None
  43. //
  44. //********************************************************************
  45. HPALETTE CreateStandardPalette(void)
  46.    {
  47.    HDC hdc;
  48.    HPALETTE hpal;
  49.    hpal = (HPALETTE) NULL;
  50.    hdc = GetDC(NULL);
  51.    if (hdc != NULL && GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE)
  52.       {
  53.       int cpeSysPal;
  54.       int cpeReserved;
  55.       cpeSysPal = GetDeviceCaps(hdc, SIZEPALETTE);
  56.       cpeReserved = GetDeviceCaps(hdc, NUMRESERVED);
  57.       if (cpeSysPal > cpeReserved)
  58.          {
  59.          int cpeReserved2;
  60.          unsigned char FAR* lpb;
  61.          PALETTEENTRY FAR* ppe;
  62.          PALETTEENTRY FAR* ppeMac;
  63.          LOGPAL logpal;
  64.          cpeReserved2 = cpeReserved/2;
  65.          // Get the system palette entries at the beginning and end.
  66.          GetSystemPaletteEntries(hdc, 0, cpeReserved2, logpal.rgpe);
  67.          GetSystemPaletteEntries(hdc, cpeSysPal - cpeReserved2, cpeReserved2,
  68.             &logpal.rgpe[cpeAppPal-cpeReserved2]);
  69.          logpal.cpe = cpeAppPal;
  70.          logpal.wVersion = 0x300;
  71.          lpb = (BYTE FAR *) &palSVGA[10];
  72.          ppe = (PALETTEENTRY FAR*)&logpal.rgpe[cpeReserved2];
  73.          ppeMac = (PALETTEENTRY FAR*)&logpal.rgpe[cpeAppPal-cpeReserved2];
  74.          while (ppe < ppeMac)
  75.             {
  76.             ppe->peFlags = PC_NOCOLLAPSE;
  77.             ppe->peRed   = *lpb++;
  78.             ppe->peGreen = *lpb++;
  79.             ppe->peBlue  = *lpb++;
  80.             ppe++;
  81.             }
  82.          hpal = CreatePalette((LOGPALETTE FAR *)&logpal);
  83.          }
  84.       }
  85.    ReleaseDC(NULL, hdc);
  86.    return hpal;
  87.    }
  88. //**********************************************************************
  89. //
  90. // CSimpleApp::CSimpleApp()
  91. //
  92. // Purpose:
  93. //
  94. //      Constructor for CSimpleApp
  95. //
  96. // Parameters:
  97. //
  98. //      None
  99. //
  100. // Return Value:
  101. //
  102. //      None
  103. //
  104. // Function Calls:
  105. //      Function                    Location
  106. //
  107. //      OutputDebugString           Windows API
  108. //      SetRectEmpty                Windows API
  109. //
  110. // Comments:
  111. //
  112. //      CSimpleApp has a contained COleInPlaceFrame.  On construction
  113. //      of CSimpleApp, we explicitly call the constructor of this
  114. //      contained class and pass a copy of the this pointer, so that
  115. //      COleInPlaceFrame can refer back to this class
  116. //
  117. //********************************************************************
  118. #pragma warning(disable : 4355)  // turn off this warning.  This warning
  119.                                                                 // tells us that we are passing this in
  120.                                                                 // an initializer, before "this" is through
  121.                                                                 // initializing.  This is ok, because
  122.                                                                 // we just store the ptr in the other
  123.                                                                 // constructor
  124. CSimpleApp::CSimpleApp() : m_OleInPlaceFrame(this)
  125. #pragma warning (default : 4355)  // Turn the warning back on
  126. {
  127.         OutputDebugString("In CSimpleApp's Constructor rn");
  128.         // clear members
  129.         m_hAppWnd = NULL;
  130.         m_hInst = NULL;
  131.         m_lpDoc = NULL;
  132.     m_hwndUIActiveObj = NULL;
  133.         // clear flags
  134.         m_fInitialized = FALSE;
  135.         m_fCSHMode = FALSE;
  136.         m_fMenuMode = FALSE;
  137.         // used for inplace
  138.         SetRectEmpty(&nullRect);
  139. }
  140. //**********************************************************************
  141. //
  142. // CSimpleApp::~CSimpleApp()
  143. //
  144. // Purpose:
  145. //
  146. //      Destructor for CSimpleApp Class.
  147. //
  148. // Parameters:
  149. //
  150. //      None
  151. //
  152. // Return Value:
  153. //
  154. //      None
  155. //
  156. // Function Calls:
  157. //      Function                    Location
  158. //
  159. //      OutputDebugString           Windows API
  160. //      OleUninitialize             OLE API
  161. //
  162. // Comments:
  163. //
  164. //********************************************************************
  165. CSimpleApp::~CSimpleApp()
  166. {
  167.         OutputDebugString("In CSimpleApp's Destructorrn");
  168.         if (m_hStdPal)
  169.                 DeleteObject(m_hStdPal);
  170.         // need to uninit the library...
  171.         if (m_fInitialized)
  172.                 OleUninitialize();
  173. }
  174. //**********************************************************************
  175. //
  176. // CSimpleApp::DestroyDocs()
  177. //
  178. // Purpose:
  179. //
  180. //      Destroys all of the open documents in the application (Only one
  181. //      since this is an SDI app, but could easily be modified to
  182. //      support MDI).
  183. //
  184. // Parameters:
  185. //
  186. //      None
  187. //
  188. // Return Value:
  189. //
  190. //      None
  191. //
  192. // Function Calls:
  193. //      Function                    Location
  194. //
  195. // Comments:
  196. //
  197. //********************************************************************
  198. void CSimpleApp::DestroyDocs()
  199. {
  200.         CStabilize stabilize(this);
  201.         m_lpDoc->Close();   // we have only 1 document
  202. }
  203. //**********************************************************************
  204. //
  205. // CSimpleApp::QueryInterface
  206. //
  207. // Purpose:
  208. //
  209. //      Used for interface negotiation at the Frame level.
  210. //
  211. // Parameters:
  212. //
  213. //      REFIID riid         -   A reference to the interface that is
  214. //                              being queried.
  215. //
  216. //      LPVOID FAR* ppvObj  -   An out parameter to return a pointer to
  217. //                              the interface.
  218. //
  219. // Return Value:
  220. //
  221. //      S_OK    -   The interface is supported.
  222. //      S_FALSE -   The interface is not supported
  223. //
  224. // Function Calls:
  225. //      Function                    Location
  226. //
  227. //      OutputDebugString           Windows API
  228. //      IsEqualIID                  OLE API
  229. //                   OLE API
  230. //      COleInPlaceFrame::AddRef    IOIPF.CPP
  231. //
  232. // Comments:
  233. //
  234. //      Note that this QueryInterface is associated with the frame.
  235. //      Since the application could potentially have multiple documents
  236. //      and multiple objects, a lot of the interfaces are ambiguous.
  237. //      (ie. which IOleObject is returned?).  For this reason, only
  238. //      pointers to interfaces associated with the frame are returned.
  239. //      In this implementation, Only IOleInPlaceFrame (or one of the
  240. //      interfaces it is derived from) can be returned.
  241. //
  242. //********************************************************************
  243. STDMETHODIMP CSimpleApp::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
  244. {
  245.         OutputDebugString("In CSimpleApp::QueryInterfacern");
  246.         *ppvObj = NULL;     // must set out pointer parameters to NULL
  247.         // looking for IUnknown
  248.         if ( riid == IID_IUnknown)
  249.                 {
  250.                 AddRef();
  251.                 *ppvObj = this;
  252.                 return S_OK;
  253.                 }
  254.         // looking for IOleWindow
  255.         if ( riid == IID_IOleWindow)
  256.                 {
  257.                 m_OleInPlaceFrame.AddRef();
  258.                 *ppvObj=&m_OleInPlaceFrame;
  259.                 return S_OK;
  260.                 }
  261.         // looking for IOleInPlaceUIWindow
  262.         if ( riid == IID_IOleInPlaceUIWindow)
  263.                 {
  264.                 m_OleInPlaceFrame.AddRef();
  265.                 *ppvObj=&m_OleInPlaceFrame;
  266.                 return S_OK;
  267.                 }
  268.         // looking for IOleInPlaceFrame
  269.         if ( riid == IID_IOleInPlaceFrame)
  270.                 {
  271.                 m_OleInPlaceFrame.AddRef();
  272.                 *ppvObj=&m_OleInPlaceFrame;
  273.                 return S_OK;
  274.                 }
  275.         // Not a supported interface
  276.         return E_NOINTERFACE;
  277. }
  278. //**********************************************************************
  279. //
  280. // CSimpleApp::AddRef
  281. //
  282. // Purpose:
  283. //
  284. //      Adds to the reference count at the Application level.
  285. //
  286. // Parameters:
  287. //
  288. //      None
  289. //
  290. // Return Value:
  291. //
  292. //      ULONG   -   The new reference count of the application.
  293. //
  294. // Function Calls:
  295. //      Function                    Location
  296. //
  297. //      OutputDebugString           Windows API
  298. //
  299. // Comments:
  300. //
  301. //      Due to the reference counting model that is used in this
  302. //      implementation, this reference count is the sum of the
  303. //      reference counts on all interfaces of all objects open
  304. //      in the application.
  305. //
  306. //********************************************************************
  307. STDMETHODIMP_(ULONG) CSimpleApp::AddRef()
  308. {
  309.         OutputDebugString("In CSimpleApp::AddRefrn");
  310.         return SafeAddRef();
  311. }
  312. //**********************************************************************
  313. //
  314. // CSimpleApp::Release
  315. //
  316. // Purpose:
  317. //
  318. //      Decrements the reference count at this level
  319. //
  320. // Parameters:
  321. //
  322. //      None
  323. //
  324. // Return Value:
  325. //
  326. //      ULONG   -   The new reference count of the application.
  327. //
  328. // Function Calls:
  329. //      Function                    Location
  330. //
  331. //      OutputDebugString           Windows API
  332. //
  333. // Comments:
  334. //
  335. //********************************************************************
  336. STDMETHODIMP_(ULONG) CSimpleApp::Release()
  337. {
  338.         OutputDebugString("In CSimpleApp::Releasern");
  339.         return SafeRelease();
  340. }
  341. //**********************************************************************
  342. //
  343. // CSimpleApp::fInitApplication
  344. //
  345. // Purpose:
  346. //
  347. //      Initializes the application
  348. //
  349. // Parameters:
  350. //
  351. //      HANDLE hInstance    -   Instance handle of the application.
  352. //
  353. // Return Value:
  354. //
  355. //      TRUE    -   Application was successfully initialized.
  356. //      FALSE   -   Application could not be initialized
  357. //
  358. // Function Calls:
  359. //      Function                    Location
  360. //
  361. //      LoadIcon                    Windows API
  362. //      LoadCursor                  Windows API
  363. //      GetStockObject              Windows API
  364. //      RegisterClass               Windows API
  365. //
  366. // Comments:
  367. //
  368. //********************************************************************
  369. BOOL CSimpleApp::fInitApplication(HANDLE hInstance)
  370. {
  371.         WNDCLASS  wc;
  372.         // Fill in window class structure with parameters that describe the
  373.         // main window.
  374.         wc.style = NULL;                    // Class style(s).
  375.         wc.lpfnWndProc = MainWndProc;       // Function to retrieve messages for
  376.                                                                                 // windows of this class.
  377.         wc.cbClsExtra = 0;                  // No per-class extra data.
  378.         wc.cbWndExtra = 0;                  // No per-window extra data.
  379.         wc.hInstance = (HINSTANCE) hInstance; // Application that owns the class.
  380.         wc.hIcon = LoadIcon((HINSTANCE) hInstance, "SimpCntr");
  381.         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  382.         wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  383.         wc.lpszMenuName =  "SIMPLEMENU";    // Name of menu resource in .RC file.
  384.         wc.lpszClassName = "SimpCntrAppWClass";  // Name used in CreateWindow call
  385.         if (!RegisterClass(&wc))
  386.                 return FALSE;
  387.         wc.style = CS_DBLCLKS;              // Class style(s). allow DBLCLK's
  388.         wc.lpfnWndProc = DocWndProc;        // Function to retrieve messages for
  389.                                                                                 // windows of this class.
  390.         wc.cbClsExtra = 0;                  // No per-class extra data.
  391.         wc.cbWndExtra = 0;                  // No per-window extra data.
  392.         wc.hInstance = (HINSTANCE) hInstance;           // Application that owns the class.
  393.         wc.hIcon = NULL;
  394.         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  395.         wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  396.         wc.lpszMenuName =  NULL;
  397.         wc.lpszClassName = "SimpCntrDocWClass"; // Name used in CreateWindow call.
  398.         // Register the window class and return success/failure code.
  399.         return (RegisterClass(&wc));
  400. }
  401. //**********************************************************************
  402. //
  403. // CSimpleApp::fInitInstance
  404. //
  405. // Purpose:
  406. //
  407. //      Instance initialization.
  408. //
  409. // Parameters:
  410. //
  411. //      HANDLE hInstance    -   App. Instance Handle.
  412. //
  413. //      int nCmdShow        -   Show parameter from WinMain
  414. //
  415. // Return Value:
  416. //
  417. //      TRUE    -   Initialization Successful
  418. //      FALSE   -   Initialization Failed.
  419. //
  420. //
  421. // Function Calls:
  422. //      Function                    Location
  423. //
  424. //      CreateWindow                Windows API
  425. //      ShowWindow                  Windows API
  426. //      UpdateWindow                Windows API
  427. //      OleBuildVersion             OLE API
  428. //      OleInitialize               OLE API
  429. //
  430. // Comments:
  431. //
  432. //      Note that successful Initalization of the OLE libraries
  433. //      is remembered so the UnInit is only called if needed.
  434. //
  435. //********************************************************************
  436. BOOL CSimpleApp::fInitInstance (HANDLE hInstance, int nCmdShow)
  437. {
  438.         DWORD dwVer = OleBuildVersion();
  439.         LPMALLOC lpMalloc = NULL;
  440.         // check to see if we are compatible with this version of the libraries
  441.         if (HIWORD(dwVer) != rmm || LOWORD(dwVer) < rup) {
  442. #ifdef _DEBUG
  443.                 OutputDebugString("WARNING: Incompatible OLE library versionrn");
  444. #else
  445.                 return FALSE;
  446. #endif
  447.         }
  448.         if (SUCCEEDED(OleInitialize(lpMalloc)))
  449.         {
  450.                 m_fInitialized = TRUE;
  451.         }
  452.         else
  453.         {
  454.             // Replacing the standard allocator may not be legal.
  455.             // Try again using the default allocator.
  456.             if (SUCCEEDED(OleInitialize(NULL)))
  457.             {
  458.                 m_fInitialized = TRUE;
  459.             }
  460.         }
  461.         m_hInst = (HINSTANCE) hInstance;
  462.         // Create the "application" windows
  463.         m_hAppWnd = CreateWindow ("SimpCntrAppWClass",
  464.                                                           "Simple OLE 2.0 In-Place Container",
  465.                                                           WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  466.                                                           CW_USEDEFAULT,
  467.                                                           CW_USEDEFAULT,
  468.                                                           CW_USEDEFAULT,
  469.                                                           CW_USEDEFAULT,
  470.                                                           NULL,
  471.                                                           NULL,
  472.                                                           (HINSTANCE) hInstance,
  473.                                                           NULL);
  474.         if (!m_hAppWnd)
  475.                 return FALSE;
  476.         m_hStdPal = CreateStandardPalette();
  477.         ShowWindow (m_hAppWnd, nCmdShow);
  478.         UpdateWindow (m_hAppWnd);
  479.         return m_fInitialized;
  480. }
  481. //**********************************************************************
  482. //
  483. // CSimpleApp::lCommandHandler
  484. //
  485. // Purpose:
  486. //
  487. //      Handles the processing of WM_COMMAND.
  488. //
  489. // Parameters:
  490. //
  491. //      HWND hWnd       -   Handle to the application Window
  492. //
  493. //      UINT message    -   message (always WM_COMMAND)
  494. //
  495. //      WPARAM wParam   -   Same as passed to the WndProc
  496. //
  497. //      LPARAM lParam   -   Same as passed to the WndProc
  498. //
  499. // Return Value:
  500. //
  501. //      NULL
  502. //
  503. // Function Calls:
  504. //      Function                                    Location
  505. //
  506. //      IOleInPlaceActiveObject::QueryInterface     Object
  507. //      IOleInPlaceObject::ContextSensitiveHelp     Object
  508. //      IOleInPlaceObject::Release                  Object
  509. //      IOleObject::DoVerb                          Object
  510. //      GetClientRect                               Windows API
  511. //      MessageBox                                  Windows API
  512. //      DialogBox                                   Windows API
  513. //      MakeProcInstance                            Windows API
  514. //      FreeProcInstance                            Windows API
  515. //      SendMessage                                 Windows API
  516. //      DefWindowProc                               Windows API
  517. //      CSimpleDoc::InsertObject                    DOC.CPP
  518. //
  519. // Comments:
  520. //
  521. //********************************************************************
  522. long CSimpleApp::lCommandHandler (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  523. {
  524.         CStabilize stabilize(this);
  525.         RECT rect;
  526.         // context sensitive help...
  527.         if (m_fMenuMode || m_fCSHMode)
  528.                 {
  529.                 if (m_fCSHMode)
  530.                         {
  531.                         // clear context sensitive help flag
  532.                         m_fCSHMode = FALSE;
  533.                         // if there is an InPlace active object, call its context sensitive help
  534.                         // method with the FALSE parameter to bring the object out of the
  535.                         // csh state.  See the technotes for details.
  536.                         if (m_lpDoc->m_lpActiveObject)
  537.                                 {
  538.                                 LPOLEINPLACEOBJECT lpInPlaceObject;
  539.                                 m_lpDoc->m_lpActiveObject->QueryInterface(IID_IOleInPlaceObject, (LPVOID FAR *)&lpInPlaceObject);
  540.                                 lpInPlaceObject->ContextSensitiveHelp(FALSE);
  541.                                 lpInPlaceObject->Release();
  542.                                 }
  543.                         }
  544.                 // see the technotes for details on implementing context sensitive
  545.                 // help
  546.                 if (m_fMenuMode)
  547.                         {
  548.                         m_fMenuMode = FALSE;
  549.                         if (m_lpDoc->m_lpActiveObject)
  550.                                 m_lpDoc->m_lpActiveObject->ContextSensitiveHelp(FALSE);
  551.                         }
  552.                 // if we provided help, we would do it here...
  553.                 MessageBox (hWnd, "Help", "Help", MB_OK);
  554.                 return NULL;
  555.                 }
  556.         // see if the command is a verb selections
  557.         //@@WTK WIN32, UNICODE
  558.         //if (wParam >= IDM_VERB0)
  559.         if (LOWORD(wParam) >= IDM_VERB0)
  560.                 {
  561.                 // get the rectangle of the object
  562.                 m_lpDoc->m_lpSite->GetObjRect(&rect);
  563.                 //@@WTK WIN32, UNICODE
  564.                 //m_lpDoc->m_lpSite->m_lpOleObject->DoVerb(wParam - IDM_VERB0, NULL, &m_lpDoc->m_lpSite->m_OleClientSite, -1, m_lpDoc->m_hDocWnd, &rect);
  565.                 m_lpDoc->m_lpSite->m_lpOleObject->DoVerb(LOWORD(wParam) - IDM_VERB0, NULL,
  566.                                 &m_lpDoc->m_lpSite->m_OleClientSite, -1, m_lpDoc->m_hDocWnd, &rect);
  567.                 }
  568.         else
  569.                 {
  570.                 //@@WTK WIN32, UNICODE
  571.                 //switch (wParam) {
  572.                 switch (LOWORD(wParam)) {
  573.                         // bring up the About box
  574.                         case IDM_ABOUT:
  575.                                 {
  576.                                 DialogBox(m_hInst,               // current instance
  577.                                         "AboutBox",                  // resource to use
  578.                                         m_hAppWnd,                   // parent handle
  579.                                         (DLGPROC) About);                // About() instance address
  580.                                 break;
  581.                                 }
  582.                         // bring up the InsertObject Dialog
  583.                         case IDM_INSERTOBJECT:
  584.                                 m_lpDoc->InsertObject();
  585.                                 break;
  586.                         // exit the application
  587.                         case IDM_EXIT:
  588.                                 SendMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0L);
  589.                                 break;
  590.                         case IDM_NEW:
  591.                                 m_lpDoc->Close();
  592.                                 m_lpDoc = NULL;
  593.                                 lCreateDoc(hWnd, 0, 0, 0);
  594.                                 break;
  595.                         default:
  596.                                 return (DefWindowProc(hWnd, message, wParam, lParam));
  597.                         }   // end of switch
  598.                 }  // end of else
  599.         return NULL;
  600. }
  601. //**********************************************************************
  602. //
  603. // CSimpleApp::lSizeHandler
  604. //
  605. // Purpose:
  606. //
  607. //      Handles the WM_SIZE message
  608. //
  609. // Parameters:
  610. //
  611. //      HWND hWnd       -   Handle to the application Window
  612. //
  613. //      UINT message    -   message (always WM_SIZE)
  614. //
  615. //      WPARAM wParam   -   Same as passed to the WndProc
  616. //
  617. //      LPARAM lParam   -   Same as passed to the WndProc
  618. //
  619. // Return Value:
  620. //
  621. //      LONG    -   returned from the "document" resizing
  622. //
  623. // Function Calls:
  624. //      Function                    Location
  625. //
  626. //      GetClientRect               Windows API
  627. //      CSimpleDoc::lResizeDoc      DOC.CPP
  628. //
  629. // Comments:
  630. //
  631. //********************************************************************
  632. long CSimpleApp::lSizeHandler (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  633. {
  634.         CStabilize stabilize(this);
  635.         RECT rect;
  636.         GetClientRect(m_hAppWnd, &rect);
  637.         return m_lpDoc->lResizeDoc(&rect);
  638. }
  639. //**********************************************************************
  640. //
  641. // CSimpleApp::lCreateDoc
  642. //
  643. // Purpose:
  644. //
  645. //      Handles the creation of a document.
  646. //
  647. // Parameters:
  648. //
  649. //      HWND hWnd       -   Handle to the application Window
  650. //
  651. //      UINT message    -   message (always WM_CREATE)
  652. //
  653. //      WPARAM wParam   -   Same as passed to the WndProc
  654. //
  655. //      LPARAM lParam   -   Same as passed to the WndProc
  656. //
  657. // Return Value:
  658. //
  659. //      NULL
  660. //
  661. // Function Calls:
  662. //      Function                    Location
  663. //
  664. //      GetClientRect               Windows API
  665. //      CSimpleDoc::CSimpleDoc      DOC.CPP
  666. //
  667. // Comments:
  668. //
  669. //********************************************************************
  670. long CSimpleApp::lCreateDoc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  671. {
  672.         CStabilize stabilize(this);
  673.         RECT rect;
  674.         GetClientRect(hWnd, &rect);
  675.         m_lpDoc = CSimpleDoc::Create(this, &rect, hWnd);
  676.         return NULL;
  677. }
  678. //**********************************************************************
  679. //
  680. // CSimpleApp::AddFrameLevelUI
  681. //
  682. // Purpose:
  683. //
  684. //      Used during InPlace negotiation.
  685. //
  686. // Parameters:
  687. //
  688. //      None
  689. //
  690. // Return Value:
  691. //
  692. //      None
  693. //
  694. // Function Calls:
  695. //      Function                            Location
  696. //
  697. //      COleInPlaceFrame::SetMenu           IOIPF.CPP
  698. //      CSimpleApp::AddFrameLevelTools      APP.CPP
  699. //
  700. // Comments:
  701. //
  702. //      Be sure to read the Technotes included in the OLE 2.0 toolkit
  703. //
  704. //********************************************************************
  705. void CSimpleApp::AddFrameLevelUI()
  706. {
  707.         CStabilize stabilize(this);
  708.         m_OleInPlaceFrame.SetMenu(NULL, NULL, NULL);
  709.         AddFrameLevelTools();
  710. }
  711. //**********************************************************************
  712. //
  713. // CSimpleApp::AddFrameLevelTools
  714. //
  715. // Purpose:
  716. //
  717. //      Used during InPlace negotiation.
  718. //
  719. // Parameters:
  720. //
  721. //      None
  722. //
  723. // Return Value:
  724. //
  725. //      None
  726. //
  727. // Function Calls:
  728. //      Function                              Location
  729. //
  730. //      COleInPlaceFrame::SetBorderSpace      IOIPF.CPP
  731. //      InvalidateRect                        Windows API
  732. //
  733. // Comments:
  734. //
  735. //      Be sure to read the Technotes included in the OLE 2.0 toolkit
  736. //
  737. //********************************************************************
  738. void CSimpleApp::AddFrameLevelTools()
  739. {
  740.         CStabilize stabilize(this);
  741.         m_OleInPlaceFrame.SetBorderSpace(&nullRect);
  742.         InvalidateRect(m_hAppWnd, NULL, TRUE);
  743. }
  744. //**********************************************************************
  745. //
  746. // CSimpleApp::HandleAccelerators
  747. //
  748. // Purpose:
  749. //
  750. //      To properly handle accelerators in the Message Loop
  751. //
  752. // Parameters:
  753. //
  754. //      LPMSG lpMsg -   A pointer to the message structure.
  755. //
  756. // Return Value:
  757. //
  758. //      TRUE    -   The accelerator was handled
  759. //      FALSE   -   The accelerator was not handled
  760. //
  761. // Function Calls:
  762. //      Function                                        Location
  763. //
  764. //      IOleInPlaceActiveObject::TranslateAccelerator   Object
  765. //
  766. // Comments:
  767. //
  768. //      If an object is InPlace active, it gets the first shot at
  769. //      handling the accelerators.
  770. //
  771. //********************************************************************
  772. BOOL CSimpleApp::HandleAccelerators(LPMSG lpMsg)
  773. {
  774.         CStabilize stabilize(this);
  775.         HRESULT hResult;
  776.         BOOL retval = FALSE;
  777.         // if we have an InPlace Active Object
  778.         if (m_lpDoc->m_lpActiveObject)
  779.                 {
  780.                 // Pass the accelerator on...
  781.                 hResult = m_lpDoc->m_lpActiveObject->TranslateAccelerator(lpMsg);
  782.                 if (hResult == NOERROR)
  783.                         retval = TRUE;
  784.                 }
  785.         return retval;
  786. }
  787. //**********************************************************************
  788. //
  789. // CSimpleApp::PaintApp
  790. //
  791. // Purpose:
  792. //
  793. //      Handles the painting of the doc window.
  794. //
  795. //
  796. // Parameters:
  797. //
  798. //      HDC hDC -   hDC to the Doc Window.
  799. //
  800. // Return Value:
  801. //
  802. //      None
  803. //
  804. // Function Calls:
  805. //      Function                    Location
  806. //
  807. //      CSimpleDoc::PaintDoc        DOC.CPP
  808. //
  809. // Comments:
  810. //
  811. //      This is an app level function in case we want to do palette
  812. //      management.
  813. //
  814. //********************************************************************
  815. void CSimpleApp::PaintApp (HDC hDC)
  816. {
  817.         CStabilize stabilize(this);
  818.         // at this level, we could enumerate through all of the
  819.         // visible objects in the application, so that a palette
  820.         // that best fits all of the objects can be built.
  821.         // This app is designed to take on the same palette
  822.         // functionality that was provided in OLE 1.0, the palette
  823.         // of the last object drawn is realized.  Since we only
  824.         // support one object at a time, it shouldn't be a big
  825.         // deal.
  826.         // if we supported multiple documents, we would enumerate
  827.         // through each of the open documents and call paint.
  828.         if (m_lpDoc)
  829.                 m_lpDoc->PaintDoc(hDC);
  830. }
  831. //**********************************************************************
  832. //
  833. // CSimpleApp::ContextSensitiveHelp
  834. //
  835. // Purpose:
  836. //      Used in supporting context sensitive haelp at the app level.
  837. //
  838. //
  839. // Parameters:
  840. //
  841. //      BOOL fEnterMode    -   Entering/Exiting Context Sensitive
  842. //                             help mode.
  843. //
  844. // Return Value:
  845. //
  846. //      None
  847. //
  848. // Function Calls:
  849. //      Function                                    Location
  850. //
  851. //      IOleInPlaceActiveObject::QueryInterface     Object
  852. //      IOleInPlaceObject::ContextSensitiveHelp     Object
  853. //      IOleInPlaceObject::Release                  Object
  854. //
  855. // Comments:
  856. //
  857. //      This function isn't used because we don't support Shift+F1
  858. //      context sensitive help.  Be sure to look at the technotes
  859. //      in the OLE 2.0 toolkit.
  860. //
  861. //********************************************************************
  862. void CSimpleApp::ContextSensitiveHelp (BOOL fEnterMode)
  863. {
  864.         CStabilize stabilize(this);
  865.         if (m_fCSHMode != fEnterMode)
  866.                 {
  867.                 m_fCSHMode = fEnterMode;
  868.                 // this code "trickles" the context sensitive help via shift+f1
  869.                 // to the inplace active object.  See the technotes for implementation
  870.                 // details.
  871.                 if (m_lpDoc->m_lpActiveObject)
  872.                         {
  873.                         LPOLEINPLACEOBJECT lpInPlaceObject;
  874.                         m_lpDoc->m_lpActiveObject->QueryInterface(IID_IOleInPlaceObject, (LPVOID FAR *)&lpInPlaceObject);
  875.                         lpInPlaceObject->ContextSensitiveHelp(fEnterMode);
  876.                         lpInPlaceObject->Release();
  877.                         }
  878.                 }
  879. }
  880. /* OLE2NOTE: forward the WM_QUERYNEWPALETTE message (via
  881. **    SendMessage) to UIActive in-place object if there is one.
  882. **    this gives the UIActive object the opportunity to select
  883. **    and realize its color palette as the FOREGROUND palette.
  884. **    this is optional for in-place containers. if a container
  885. **    prefers to force its color palette as the foreground
  886. **    palette then it should NOT forward the this message. or
  887. **    the container can give the UIActive object priority; if
  888. **    the UIActive object returns 0 from the WM_QUERYNEWPALETTE
  889. **    message (ie. it did not realize its own palette), then
  890. **    the container can realize its palette.
  891. **    (see ContainerDoc_ForwardPaletteChangedMsg for more info)
  892. **
  893. **    (It is a good idea for containers to use the standard
  894. **    palette even if they do not use colors themselves. this
  895. **    will allow embedded object to get a good distribution of
  896. **    colors when they are being drawn by the container)
  897. **
  898. */
  899. LRESULT CSimpleApp::QueryNewPalette(void)
  900. {
  901.         if (m_hwndUIActiveObj) {
  902.                 if (SendMessage(m_hwndUIActiveObj, WM_QUERYNEWPALETTE,
  903.                                 (WPARAM)0, (LPARAM)0)) {
  904.                         /* Object selected its palette as foreground palette */
  905.                         return (LRESULT)1;
  906.                 }
  907.         }
  908.         return wSelectPalette(m_hAppWnd, m_hStdPal, FALSE/*fBackground*/);
  909. }
  910. /* This is just a helper routine */
  911. LRESULT wSelectPalette(HWND hWnd, HPALETTE hPal, BOOL fBackground)
  912. {
  913.         HDC hdc;
  914.         HPALETTE hOldPal;
  915.         UINT iPalChg = 0;
  916.         if (hPal == 0)
  917.                 return (LRESULT)0;
  918.         hdc = GetDC(hWnd);
  919.         hOldPal = SelectPalette(hdc, hPal, fBackground);
  920.         iPalChg = RealizePalette(hdc);
  921.         SelectPalette(hdc, hOldPal, TRUE /*fBackground*/);
  922.         ReleaseDC(hWnd, hdc);
  923.         if (iPalChg > 0)
  924.                 InvalidateRect(hWnd, NULL, TRUE);
  925.         return (LRESULT)1;
  926. }