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

Windows编程

开发平台:

Visual C++

  1. //**********************************************************************
  2. // File name: SITE.CPP
  3. //
  4. //      Implementation file for CSimpleSite
  5. //
  6. // Functions:
  7. //
  8. //      See SITE.H for class definition
  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 "app.h"
  16. #include "site.h"
  17. #include "doc.h"
  18. //**********************************************************************
  19. //
  20. // CSimpleSite::Create
  21. //
  22. // Purpose:
  23. //
  24. //      Creation routine for CSimpleSite
  25. //
  26. // Parameters:
  27. //
  28. //      CSimpleDoc FAR *lpDoc   - Pointer to CSimpleDoc
  29. //
  30. // Return Value:
  31. //
  32. //      None
  33. //
  34. // Function Calls:
  35. //      Function                    Location
  36. //
  37. //      IStorage::CreateStorage     OLE API
  38. //      assert                      C Runtime
  39. //
  40. // Comments:
  41. //
  42. //********************************************************************
  43. CSimpleSite FAR * CSimpleSite::Create(CSimpleDoc FAR *lpDoc)
  44. {
  45. CSimpleSite FAR * lpTemp = new CSimpleSite(lpDoc);
  46. if (!lpTemp)
  47. return NULL;
  48. // create a sub-storage for the object
  49. //@@WTK WIN32, UNICODE
  50. //HRESULT hErr = lpDoc->m_lpStorage->CreateStorage( "Object",
  51. HRESULT hErr = lpDoc->m_lpStorage->CreateStorage( OLESTR("Object"),
  52. STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE,
  53. 0,
  54. 0,
  55. &lpTemp->m_lpObjStorage);
  56. assert(hErr == NOERROR);
  57. if (hErr != NOERROR)
  58. {
  59. delete lpTemp;
  60. return NULL;
  61. }
  62. // we will add one ref count on our Site. later when we want to destroy
  63. // the Site object we will release this  ref count. when the Site's ref
  64. // count goes to 0, it will be deleted.
  65. lpTemp->AddRef();
  66. return lpTemp;
  67. }
  68. //**********************************************************************
  69. //
  70. // CSimpleSite::CSimpleSite
  71. //
  72. // Purpose:
  73. //
  74. //      Constructor for CSimpleSite
  75. //
  76. // Parameters:
  77. //
  78. //      CSimpleDoc FAR *lpDoc   - Pointer to CSimpleDoc
  79. //
  80. // Return Value:
  81. //
  82. //      None
  83. //
  84. // Function Calls:
  85. //      Function                    Location
  86. //
  87. // Comments:
  88. //
  89. //********************************************************************
  90. #pragma warning(disable : 4355)  // turn off this warning.  This warning
  91. // tells us that we are passing this in
  92. // an initializer, before "this" is through
  93. // initializing.  This is ok, because
  94. // we just store the ptr in the other
  95. // constructors
  96. CSimpleSite::CSimpleSite (CSimpleDoc FAR *lpDoc) : m_OleClientSite(this),
  97.  m_AdviseSink(this)
  98. #pragma warning (default : 4355)  // Turn the warning back on
  99. {
  100. // remember the pointer to the doc
  101. m_lpDoc = lpDoc;
  102. // clear the reference count
  103. m_nCount = 0;
  104. m_dwDrawAspect = DVASPECT_CONTENT;
  105. m_lpOleObject = NULL;
  106. m_fObjectOpen = FALSE;
  107. }
  108. //**********************************************************************
  109. //
  110. // CSimpleSite::~CSimpleSite
  111. //
  112. // Purpose:
  113. //
  114. //      Destructor for CSimpleSite
  115. //
  116. // Parameters:
  117. //
  118. //      None
  119. //
  120. // Return Value:
  121. //
  122. //      None
  123. //
  124. // Function Calls:
  125. //      Function                                Location
  126. //
  127. //      OutputDebugString                       Windows API
  128. //      IOleObject::Release                     Object
  129. //      IStorage::Release                       OLE API
  130. //
  131. // Comments:
  132. //
  133. //********************************************************************
  134. CSimpleSite::~CSimpleSite ()
  135. {
  136. OutputDebugString ("In CSimpleSite's Destructor rn");
  137. if (m_lpOleObject)
  138.    m_lpOleObject->Release();
  139. if (m_lpObjStorage)
  140.    m_lpObjStorage->Release();
  141. }
  142. //**********************************************************************
  143. //
  144. // CSimpleSite::CloseOleObject
  145. //
  146. // Purpose:
  147. //
  148. //      Call IOleObject::Close on the object of the CSimpleSite
  149. //
  150. // Parameters:
  151. //
  152. //      None
  153. //
  154. // Return Value:
  155. //
  156. //      None
  157. //
  158. // Function Calls:
  159. //      Function                                Location
  160. //
  161. //      OutputDebugString                       Windows API
  162. //      IOleObject::Close                       Object
  163. //
  164. // Comments:
  165. //
  166. //********************************************************************
  167. void CSimpleSite::CloseOleObject (void)
  168. {
  169. LPVIEWOBJECT lpViewObject = NULL;
  170. OutputDebugString ("In CSimpleSite::CloseOleObject rn");
  171. if (m_lpOleObject)
  172.    {
  173.    m_lpOleObject->Close(OLECLOSE_NOSAVE);
  174.    }
  175. }
  176. //**********************************************************************
  177. //
  178. // CSimpleSite::UnloadOleObject
  179. //
  180. // Purpose:
  181. //
  182. //      Close and release all pointers to the object of the CSimpleSite
  183. //
  184. // Parameters:
  185. //
  186. //      None
  187. //
  188. // Return Value:
  189. //
  190. //      None
  191. //
  192. // Function Calls:
  193. //      Function                                Location
  194. //
  195. //      OutputDebugString                       Windows API
  196. //      CSimpleSite::CloseOleObject             SITE.CPP
  197. //      IOleObject::QueryInterface              Object
  198. //      IViewObject::SetAdvise                  Object
  199. //      IViewObject::Release                    Object
  200. //      IStorage::Release                       OLE API
  201. //
  202. // Comments:
  203. //
  204. //********************************************************************
  205. void CSimpleSite::UnloadOleObject (void)
  206. {
  207. OutputDebugString ("In CSimpleSite::UnloadOleObject rn");
  208. if (m_lpOleObject)
  209.    {
  210.    LPVIEWOBJECT lpViewObject;
  211.    CloseOleObject();    // ensure object is closed; NOP if already closed
  212.    m_lpOleObject->QueryInterface(IID_IViewObject, (LPVOID FAR *)&lpViewObject);
  213.    if (lpViewObject)
  214.    {
  215.    // Remove the view advise
  216.    lpViewObject->SetAdvise(m_dwDrawAspect, 0, NULL);
  217.    lpViewObject->Release();
  218.    }
  219.    m_lpOleObject->Release();
  220.    m_lpOleObject = NULL;
  221.    }
  222. }
  223. //**********************************************************************
  224. //
  225. // CSimpleSite::QueryInterface
  226. //
  227. // Purpose:
  228. //
  229. //      Used for interface negotiation of the container Site.
  230. //
  231. // Parameters:
  232. //
  233. //      REFIID riid         -   A reference to the interface that is
  234. //                              being queried.
  235. //
  236. //      LPVOID FAR* ppvObj  -   An out parameter to return a pointer to
  237. //                              the interface.
  238. //
  239. // Return Value:
  240. //
  241. //      S_OK    -   The interface is supported.
  242. //      S_FALSE -   The interface is not supported
  243. //
  244. // Function Calls:
  245. //      Function                    Location
  246. //
  247. //      OutputDebugString           Windows API
  248. //      IsEqualIID                  OLE API
  249. //                   OLE API
  250. //      CSimpleSite::AddRef          OBJ.CPP
  251. //      COleClientSite::AddRef      IOCS.CPP
  252. //      CAdviseSink::AddRef         IAS.CPP
  253. //
  254. // Comments:
  255. //
  256. //
  257. //********************************************************************
  258. STDMETHODIMP CSimpleSite::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
  259. {
  260. OutputDebugString("In CSimpleSite::QueryInterfacern");
  261. *ppvObj = NULL;     // must set out pointer parameters to NULL
  262. if ( riid == IID_IUnknown)
  263. {
  264. AddRef();
  265. *ppvObj = this;
  266. return S_OK;
  267. }
  268. if ( riid == IID_IOleClientSite)
  269. {
  270. m_OleClientSite.AddRef();
  271. *ppvObj = &m_OleClientSite;
  272. return S_OK;
  273. }
  274. if ( riid == IID_IAdviseSink)
  275. {
  276. m_AdviseSink.AddRef();
  277. *ppvObj = &m_AdviseSink;
  278. return S_OK;
  279. }
  280. // Not a supported interface
  281. return E_NOINTERFACE;
  282. }
  283. //**********************************************************************
  284. //
  285. // CSimpleSite::AddRef
  286. //
  287. // Purpose:
  288. //
  289. //      Increments the reference count of the container Site.
  290. //
  291. // Parameters:
  292. //
  293. //      None
  294. //
  295. // Return Value:
  296. //
  297. //      ULONG   -   The new reference count of the site.
  298. //
  299. // Function Calls:
  300. //      Function                    Location
  301. //
  302. //      OutputDebugString           Windows API
  303. //
  304. // Comments:
  305. //
  306. //********************************************************************
  307. STDMETHODIMP_(ULONG) CSimpleSite::AddRef()
  308. {
  309. OutputDebugString("In CSimpleSite::AddRefrn");
  310. return ++m_nCount;
  311. }
  312. //**********************************************************************
  313. //
  314. // CSimpleSite::Release
  315. //
  316. // Purpose:
  317. //
  318. //      Decrements the reference count of the container Site
  319. //
  320. // Parameters:
  321. //
  322. //      None
  323. //
  324. // Return Value:
  325. //
  326. //      ULONG   -   The new reference count of the Site.
  327. //
  328. // Function Calls:
  329. //      Function                    Location
  330. //
  331. //      OutputDebugString           Windows API
  332. //
  333. // Comments:
  334. //
  335. //********************************************************************
  336. STDMETHODIMP_(ULONG) CSimpleSite::Release()
  337. {
  338. OutputDebugString("In CSimpleSite::Releasern");
  339. if (--m_nCount == 0) {
  340. delete this;
  341. return 0;
  342. }
  343. return m_nCount;
  344. }
  345. //**********************************************************************
  346. //
  347. // CSimpleSite::InitObject
  348. //
  349. // Purpose:
  350. //
  351. //      Used to initialize a newly create object (can't be done in the
  352. //      constructor).
  353. //
  354. // Parameters:
  355. //
  356. //      BOOL fCreateNew -   TRUE if insert NEW object
  357. //                          FALSE if create object FROM FILE
  358. //
  359. // Return Value:
  360. //
  361. //      None
  362. //
  363. // Function Calls:
  364. //      Function                        Location
  365. //
  366. //      IOleObject::SetHostNames        Object
  367. //      IOleObject::QueryInterface      Object
  368. //      IViewObject2::GetExtent         Object
  369. //      IOleObject::DoVerb              Object
  370. //      IViewObject::SetAdvise          Object
  371. //      IViewObject::Release            Object
  372. //      GetClientRect                   Windows API
  373. //      OleSetContainedObject           OLE API
  374. //
  375. // Comments:
  376. //
  377. //********************************************************************
  378. void CSimpleSite::InitObject(BOOL fCreateNew)
  379. {
  380. LPVIEWOBJECT2 lpViewObject2;
  381. RECT rect;
  382. // Set a View Advise
  383. m_lpOleObject->QueryInterface(IID_IViewObject2,(LPVOID FAR *)&lpViewObject2);
  384. lpViewObject2->SetAdvise(m_dwDrawAspect, ADVF_PRIMEFIRST, &m_AdviseSink);
  385. // get the initial size of the object
  386. lpViewObject2->GetExtent(m_dwDrawAspect, -1 /*lindex*/, NULL /*ptd*/, &m_sizel);
  387. GetObjRect(&rect);  // get the rectangle of the object in pixels
  388. lpViewObject2->Release();
  389. // give the object the name of the container app/document
  390. //@@WTK WIN32, UNICODE
  391. //m_lpOleObject->SetHostNames("Simple Application", "Simple OLE 2.0 Drag/Drop Container");
  392. m_lpOleObject->SetHostNames(OLESTR("Simple Application"), OLESTR("Simple OLE 2.0 Drag/Drop Container"));
  393. // inform object handler/DLL object that it is used in the embedding container's context
  394. OleSetContainedObject(m_lpOleObject, TRUE);
  395. if (fCreateNew) {
  396.    // force new object to save to guarantee valid object in our storage.
  397.    // OLE 1.0 objects may close w/o saving. this is NOT necessary if the
  398.    // object is created FROM FILE; its data in storage is already valid.
  399.    m_OleClientSite.SaveObject();
  400.    // we only want to DoVerb(SHOW) if this is an InsertNew object.
  401.    // we should NOT DoVerb(SHOW) if the object is created FromFile.
  402.    m_lpOleObject->DoVerb(
  403.    OLEIVERB_SHOW,
  404.    NULL,
  405.    &m_OleClientSite,
  406.    -1,
  407.    m_lpDoc->m_hDocWnd,
  408.    &rect);
  409. }
  410. }
  411. //**********************************************************************
  412. //
  413. // CSimpleSite::PaintObj
  414. //
  415. // Purpose:
  416. //
  417. //      Paints the object
  418. //
  419. // Parameters:
  420. //
  421. //      HDC hDC     - Device context of the document window
  422. //
  423. // Return Value:
  424. //
  425. // Function Calls:
  426. //      Function                        Location
  427. //
  428. //      IOleObject::QueryInterface      Object
  429. //      IViewObject::GetColorSet        Object
  430. //      IViewObject::Release            Object
  431. //      SetMapMode                      Windows API
  432. //      LPtoDP                          Windows API
  433. //      CreateHatchBrush                Windows API
  434. //      SelectObject                    Windows API
  435. //      DeleteObject                    Windows API
  436. //      CreatePalette                   Windows API
  437. //      SelectPalette                   Windows API
  438. //      RealizePalette                  Windows API
  439. //      OleStdFree                      OUTLUI Function
  440. //      OleDraw                         OLE API
  441. //
  442. // Comments:
  443. //
  444. //********************************************************************
  445. void CSimpleSite::PaintObj(HDC hDC)
  446. {
  447. RECT rect;
  448. // need to check to make sure there is a valid object
  449. // available.  This is needed if there is a paint msg
  450. // between the time that CSimpleSite is instantiated
  451. // and OleUIInsertObject returns.
  452. if (!m_lpOleObject)
  453. return;
  454. // convert it to pixels
  455. GetObjRect(&rect);
  456. LPLOGPALETTE pColorSet = NULL;
  457. LPVIEWOBJECT lpView = NULL;
  458. // get a pointer to IViewObject
  459. m_lpOleObject->QueryInterface(IID_IViewObject,(LPVOID FAR *) &lpView);
  460. // if the QI succeeds, get the LOGPALETTE for the object
  461. if (lpView)
  462. lpView->GetColorSet(m_dwDrawAspect, -1, NULL, NULL, NULL, &pColorSet);
  463. HPALETTE hPal=NULL;
  464. HPALETTE hOldPal=NULL;
  465. // if a LOGPALETTE was returned (not guarateed), create the palette and
  466. // realize it.  NOTE: A smarter application would want to get the LOGPALETTE
  467. // for each of its visible objects, and try to create a palette that
  468. // satisfies all of the visible objects.  ALSO: OleStdFree() is use to
  469. // free the returned LOGPALETTE.
  470. if ((pColorSet))
  471. {
  472. hPal = CreatePalette((const LPLOGPALETTE) pColorSet);
  473. hOldPal = SelectPalette(hDC, hPal, FALSE);
  474. RealizePalette(hDC);
  475. OleStdFree(pColorSet);
  476. }
  477. // draw the object
  478. OleDraw(m_lpOleObject, m_dwDrawAspect, hDC, &rect);
  479. // if the object is open, draw a hatch rect.
  480. if (m_fObjectOpen)
  481. {
  482. HBRUSH hBrush = CreateHatchBrush ( HS_BDIAGONAL, RGB(0,0,0) );
  483. HBRUSH hOldBrush = (HBRUSH) SelectObject (hDC, hBrush);
  484. SetROP2(hDC, R2_MASKPEN);
  485. Rectangle (hDC, rect.left, rect.top, rect.right, rect.bottom);
  486. SelectObject(hDC, hOldBrush);
  487. DeleteObject(hBrush);
  488. }
  489. // if we created a palette, restore the old one, and destroy
  490. // the object.
  491. if (hPal)
  492. {
  493. SelectPalette(hDC,hOldPal,FALSE);
  494. DeleteObject(hPal);
  495. }
  496. // if a view pointer was successfully returned, it needs to be released.
  497. if (lpView)
  498. lpView->Release();
  499. }
  500. //**********************************************************************
  501. //
  502. // CSimpleSite::GetObjRect
  503. //
  504. // Purpose:
  505. //
  506. //      Retrieves the rect of the object in pixels
  507. //
  508. // Parameters:
  509. //
  510. //      LPRECT lpRect - Rect structure filled with object's rect in pixels
  511. //
  512. // Return Value:
  513. //
  514. // Function Calls:
  515. //      Function                        Location
  516. //
  517. //      XformWidthInHimetricToPixels    OUTLUI Function
  518. //      XformHeightInHimetricToPixels   OUTLUI Function
  519. //
  520. // Comments:
  521. //
  522. //********************************************************************
  523. void CSimpleSite::GetObjRect(LPRECT lpRect)
  524. {
  525. // convert it to pixels
  526. lpRect->left = lpRect->top = 0;
  527. lpRect->right = XformWidthInHimetricToPixels(NULL,(int)m_sizel.cx);
  528. lpRect->bottom = XformHeightInHimetricToPixels(NULL,(int)m_sizel.cy);
  529. }