//********************************************************************** // File name: obj.cpp // // Implementation file for the CSimpSvrApp Class // // Functions: // // See obj.h for a list of member functions. // // Copyright (c) 1993 Microsoft Corporation. All rights reserved. //********************************************************************** #include "pre.h" #include "obj.h" #include "ioo.h" #include "ido.h" #include "ips.h" #include "icf.h" #include "ioipao.h" #include "ioipo.h" #include "app.h" #include "doc.h" //********************************************************************** // // CSimpSvrObj::QueryInterface // // Purpose: // // Used for interface negotiation at the "Object" level. // // Parameters: // // REFIID riid - A reference to the interface that is // being queried. // // LPVOID FAR* ppvObj - An out parameter to return a pointer to // the interface. // // Return Value: // // S_OK - The interface is supported. // E_NOINTERFACE - The interface is not supported // // Function Calls: // Function Location // // TestDebugOut Windows API // ResultFromScode OLE API // IUnknown::AddRef OBJ.CPP, IOO.CPP, IDO.CPP, IPS.CPP // IOIPO.CPP, IOIPAO.CPP // // //******************************************************************** STDMETHODIMP CSimpSvrObj::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj) { TestDebugOut(TEXT("In CSimpSvrObj::QueryInterface\r\n")); SCODE sc = S_OK; if (IsEqualIID(riid, IID_IUnknown)) *ppvObj = this; else if (IsEqualIID(riid, IID_IOleObject)) *ppvObj = &m_OleObject; else if (IsEqualIID(riid, IID_IDataObject)) *ppvObj = &m_DataObject; else if ( IsEqualIID(riid, IID_IPersistStorage) || IsEqualIID(riid, IID_IPersist) ) *ppvObj = &m_PersistStorage; else if (IsEqualIID(riid, IID_IOleInPlaceObject)) *ppvObj = &m_OleInPlaceObject; else if (IsEqualIID(riid, IID_IOleInPlaceActiveObject)) *ppvObj = &m_OleInPlaceActiveObject; else if (IsEqualIID(riid, IID_IExternalConnection)) *ppvObj = &m_ExternalConnection; else { *ppvObj = NULL; sc = E_NOINTERFACE; } if (*ppvObj) ((LPUNKNOWN)*ppvObj)->AddRef(); return ResultFromScode( sc ); } //********************************************************************** // // CSimpSvrObj::AddRef // // Purpose: // // Adds to the reference count at the Object level. // // Parameters: // // None // // Return Value: // // ULONG - The new reference count of the Object. // // Function Calls: // Function Location // // TestDebugOut Windows API // CSimpSvrDoc::AddRef DOC.CPP // // Comments: // // Due to the reference counting model that is used in this // implementation, this reference count is the sum of the // reference counts on all interfaces. (ie IDataObject, // IExternalConnection, IPersistStorage, IOleInPlaceActiveObject, // IOleObject, IOleInPlaceObject) // //******************************************************************** STDMETHODIMP_(ULONG) CSimpSvrObj::AddRef () { TestDebugOut(TEXT("In CSimpSvrObj::AddRef\r\n")); m_lpDoc->AddRef(); return ++m_nCount; } //********************************************************************** // // CSimpSvrObj::Release // // Purpose: // // Decrements the reference count at this level // // Parameters: // // None // // Return Value: // // ULONG - The new reference count of the object. // // Function Calls: // Function Location // // TestDebugOut Windows API // CSimpSvrDoc::Release DOC.CPP // CSimpSvrDoc::ClearObj DOC.H // // Comments: // // Due to the reference counting model that is used in this // implementation, this reference count is the sum of the // reference counts on all interfaces. (ie IDataObject, // IExternalConnection, IPersistStorage, IOleInPlaceActiveObject, // IOleObject, IOleInPlaceObject) // //******************************************************************** STDMETHODIMP_(ULONG) CSimpSvrObj::Release () { TestDebugOut(TEXT("In CSimpSvrObj::Release\r\n")); /* The SimpSvrObj destructor needs to access SimpSvrDoc. We want to * hold on to the SimpSvrDoc object until we have deleted our own. */ CSimpSvrDoc *lpDoc=m_lpDoc; if (--m_nCount== 0) { /* We still have Doc object. But SimpSvrObj object is going away. * So, we need to clear the obj pointer in the Doc object. */ lpDoc->ClearObj(); delete this; lpDoc->Release(); return(0); } lpDoc->Release(); return m_nCount; } //********************************************************************** // // CSimpSvrObj::CSimpSvrObj // // Purpose: // // Constructor for CSimpSvrObj. Initialize the members variables // // Parameters: // // CSimpSvrDoc FAR * lpSimpSvrDoc - ptr to the doc object // // Return Value: // // None // // Function Calls: // Function Location // // //******************************************************************** #pragma warning (disable : 4355) // "this" used in base initializer list warning. This // can be disabled because we are not using "this" in // the constructor for these objects, rather we are // just storing it for future use... CSimpSvrObj::CSimpSvrObj(CSimpSvrDoc FAR * lpSimpSvrDoc) : m_OleObject(this), m_DataObject(this), m_PersistStorage(this), m_OleInPlaceActiveObject(this), m_OleInPlaceObject(this), m_ExternalConnection(this) #pragma warning (default : 4355) // Turn the warning back on { m_lpDoc = lpSimpSvrDoc; m_nCount = 0; m_fInPlaceActive = FALSE; m_fInPlaceVisible = FALSE; m_fUIActive = FALSE; m_hmenuShared = NULL; m_hOleMenu = NULL; m_dwRegister = 0; m_lpFrame = NULL; m_lpCntrDoc = NULL; m_lpStorage = NULL; m_lpColorStm = NULL; m_lpSizeStm = NULL; m_lpOleClientSite = NULL; m_lpOleAdviseHolder = NULL; m_lpDataAdviseHolder = NULL; m_lpIPSite = NULL; // The default object is red m_red = 128; m_green = 0; m_blue = 0; m_size.x = 100; m_size.y = 100; m_xOffset = 0; m_yOffset = 0; m_scale = 1.0F; m_fSaveWithSameAsLoad = FALSE; m_fNoScribbleMode = FALSE; } //********************************************************************** // // CSimpSvrObj::~CSimpSvrObj // // Purpose: // // Destructor for CSimpSvrObj // // Parameters: // // None // // Return Value: // None // // // Function Calls: // Function Location // // TestDebugOut Windows API // PostMessage Windows API // CSimpSvrDoc::GetApp DOC.H // CSimpSvrDoc::GethAppWnd DOC.H // CSimpSvrApp::IsStartedByOle APP.CPP // IDataAdviseHolder OLE // IOleAdviseHolder OLE // IOleClientSite OLE // // Comment: // We need to release the DataAdviseHolder, OleClientSite and // OleAdviseHolder if they are created by our CSimpSvrObj. // // //******************************************************************** CSimpSvrObj::~CSimpSvrObj() { TestDebugOut(TEXT("In CSimpSvrObj's Destructor \r\n")); // if we were started by ole, post ourselves a close message if (m_lpDoc->GetApp()->IsStartedByOle()) PostMessage(m_lpDoc->GethAppWnd(), WM_SYSCOMMAND, SC_CLOSE, 0L); /* We need to release our Data Advise Holder when we destroy our * object. */ if (m_lpDataAdviseHolder) { m_lpDataAdviseHolder->Release(); } if (m_lpOleAdviseHolder) { m_lpOleAdviseHolder->Release(); } if (m_lpOleClientSite) { m_lpOleClientSite->Release(); } } //********************************************************************** // // CSimpSvrObj::Draw // // Purpose: // // Draws the object into an arbitrary DC // // Parameters: // // HDC hDC - DC to draw into // // Return Value: // // NONE // // Function Calls: // Function Location // // TestDebugOut Windows API // CreateBrushIndirect Windows API // SelectObject Windows API // Rectangle Windows API // DeleteObject Windows API // // //******************************************************************** void CSimpSvrObj::Draw (HDC hDC, BOOL m_fMeta) { LOGBRUSH lb; TestDebugOut(TEXT("In CSimpSvrObj::Draw\r\n")); TCHAR szBuffer[255]; wsprintf(szBuffer, TEXT("Drawing Scale %3d\r\n"),m_scale); TestDebugOut(szBuffer); if (!m_fMeta) { SetMapMode(hDC, MM_ANISOTROPIC); SetWindowOrg(hDC, (int)(m_xOffset/m_scale), (int)(m_yOffset/m_scale)); SetWindowExt(hDC, m_size.x, m_size.y); SetViewportExt(hDC, (int)(m_size.x*m_scale), (int)(m_size.y*m_scale)); } // fill out a LOGBRUSH lb.lbStyle = BS_SOLID; lb.lbColor = RGB(m_red, m_green, m_blue); lb.lbHatch = 0; // create the brush HBRUSH hBrush = CreateBrushIndirect(&lb); // select the brush HBRUSH hOldBrush = (HBRUSH) SelectObject(hDC, hBrush); HPEN hPen = CreatePen(PS_INSIDEFRAME, 6, RGB(0, 0, 0)); HPEN hOldPen = (HPEN) SelectObject(hDC, hPen); // draw the rectangle Rectangle (hDC, 0, 0, m_size.x, m_size.y); // restore the pen hPen = (HPEN) SelectObject(hDC, hOldPen); // free the pen DeleteObject(hPen); // restore the old brush hBrush = (HBRUSH) SelectObject(hDC, hOldBrush); // free the brush DeleteObject(hBrush); } //********************************************************************** // // CSimpSvrObj::GetMetaFilePict // // Purpose: // // Returns a handle to a metafile representation of the object. // // Parameters: // // None // // Return Value: // // Handle to the metafile. // // Function Calls: // Function Location // // TestDebugOut Windows API // GlobalAlloc Windows API // GlobalLock Windows API // SetWindowOrg Windows API // SetWindowExt Windows API // CreateMetaFile Windows API // CloseMetaFile Windows API // GlobalUnlock Windows API // XformWidthInPixelsToHimetric OLE2UI // XformHeightInPixelsToHimetric OLE2UI // CSimpSvrObj::Draw OBJ.CPP // // //******************************************************************** HANDLE CSimpSvrObj::GetMetaFilePict() { HANDLE hMFP; METAFILEPICT FAR * lpMFP; POINT pt; TestDebugOut(TEXT("In CSimpSvrObj::GetMetaFilePict\r\n")); // allocate the memory for the METAFILEPICT structure hMFP = GlobalAlloc (GMEM_SHARE | GHND, sizeof (METAFILEPICT) ); if (!hMFP) { /* GlobalAlloc fails. Cannot allocate global memory. */ return(NULL); } lpMFP = (METAFILEPICT FAR*) GlobalLock(hMFP); if (!lpMFP) { /* Cannot lock the allocated memory. */ return(NULL); } // get the size of the object in HIMETRIC pt.x = XformWidthInPixelsToHimetric(NULL, m_size.x); pt.y = XformHeightInPixelsToHimetric(NULL, m_size.y); // fill out the METAFILEPICT structure lpMFP->mm = MM_ANISOTROPIC; lpMFP->xExt = pt.x; lpMFP->yExt = pt.y; // Create the metafile HDC hDC = CreateMetaFile(NULL); if (hDC) { SetWindowOrg (hDC, 0, 0); SetWindowExt (hDC, m_size.x, m_size.y); Draw(hDC); lpMFP->hMF = CloseMetaFile(hDC); } // unlock the metafilepict GlobalUnlock(hMFP); return hMFP; } //********************************************************************** // // CSimpSvrObj::SaveToStorage // // Purpose: // // Saves the object to the passed storage // // Parameters: // // LPSTORAGE lpStg - Storage in which to save the object // // Return Value: // // None // // Function Calls: // Function Location // // TestDebugOut Windows API // IStorage::CreateStream OLE // IStream::Write OLE // IStream::Release OLE // // Comments: // // A real app will want to do better error checking / returning // //******************************************************************** void CSimpSvrObj::SaveToStorage (LPSTORAGE lpStg, BOOL fSameAsLoad) { TestDebugOut(TEXT("In CSimpSvrObj::SaveToStorage\r\n")); LPSTREAM lpTempColor, lpTempSize; if (!fSameAsLoad) m_PersistStorage.CreateStreams( lpStg, &lpTempColor, &lpTempSize); else { lpTempColor = m_lpColorStm; lpTempColor->AddRef(); lpTempSize = m_lpSizeStm; lpTempSize->AddRef(); } ULARGE_INTEGER uli; uli.LowPart = 0; uli.HighPart = 0; if ( lpTempColor->SetSize(uli) != S_OK ) goto EXIT; // we don't want to proceed further if fails if ( lpTempSize->SetSize(uli) != S_OK ) goto EXIT; LARGE_INTEGER li; li.LowPart = 0; li.HighPart = 0; if ( lpTempColor->Seek(li, STREAM_SEEK_SET, NULL) != S_OK ) goto EXIT; if ( lpTempSize->Seek(li, STREAM_SEEK_SET, NULL) != S_OK ) goto EXIT; // write the colors to the stream if ( lpTempColor->Write(&m_red, sizeof(m_red), NULL) != S_OK ) goto EXIT; if ( lpTempColor->Write(&m_green, sizeof(m_green), NULL) != S_OK ) goto EXIT; if ( lpTempColor->Write(&m_blue, sizeof(m_blue), NULL) != S_OK ) goto EXIT; // write the size to the stream if ( lpTempSize->Write(&m_size, sizeof(m_size), NULL) != S_OK ) goto EXIT; TestDebugOut(TEXT("SaveToStorage exits normally\n")); EXIT: lpTempColor->Release(); lpTempSize->Release(); } //********************************************************************** // // CSimpSvrObj::LoadFromStorage // // Purpose: // // Loads the object from the passed storage // // Parameters: // // LPSTORAGE lpStg - Storage in which to load the object from // // Return Value: // // None. // // Function Calls: // Function Location // // TestDebugOut Windows API // IStorage::OpenStream OLE // IStream::Read OLE // IStream::Release OLE // // //******************************************************************** void CSimpSvrObj::LoadFromStorage () { TestDebugOut(TEXT("In CSimpSvrObj::LoadFromStorage\r\n")); // Read the colors if ( m_lpColorStm->Read(&m_red, sizeof(m_red), NULL) != S_OK ) return; if ( m_lpColorStm->Read(&m_green, sizeof(m_green), NULL) != S_OK ) return; if ( m_lpColorStm->Read(&m_blue, sizeof(m_blue), NULL) != S_OK ) return; // read the size if ( m_lpSizeStm->Read(&m_size, sizeof(m_size), NULL) != S_OK ) return; TestDebugOut(TEXT("LoadFromStorage exits normally\n")); } //********************************************************************** // // CSimpSvrObj::DoInPlaceActivate // // Purpose: // // Does the inplace activation for the object // // Parameters: // // LONG lVerb - Verb that caused this function to be called // // Return Value: // // TRUE/FALSE depending on success or failure. // // Function Calls: // Function Location // // IOleClientSite::QueryInterface Container // IOleClientSite::ShowObject Container // IOleInPlaceSite::CanInPlaceActivate Container // IOleInPlaceSite::Release Container // IOleInPlaceSite::OnInPlaceActivate Container // IOleInPlaceSite::GetWindow Container // IOleInPlaceSite::GetWindowContext Container // IOleInPlaceSite::OnUIActivate Container // IOleInPlaceSite::Release Container // IOleInPlaceFrame::SetActiveObject Container // IOleInPlaceUIWindow::SetActiveObject Container // TestDebugOut Windows API // ShowWindow Windows API // SetParent Windows API // IntersectRect Windows API // OffsetRect Windows API // MoveWindow Windows API // CopyRect Windows API // SetFocus Windows API // SetHatchWindowSize OLE2UI // CSimpSvrObj::AssembleMenus OBJ.CPP // CSimpSvrObj::AddFrameLevelUI OBJ.CPP // // // Comments: // // Be sure to read TECHNOTES.WRI included with the OLE SDK // for details on implementing inplace activation. // //******************************************************************** BOOL CSimpSvrObj::DoInPlaceActivate (LONG lVerb) { BOOL retval = FALSE; RECT posRect, clipRect; TestDebugOut(TEXT("In CSimpSvrObj::DoInPlaceActivate\r\n")); // if not currently in place active if (!m_fInPlaceActive) { // get the inplace site if (m_lpOleClientSite->QueryInterface(IID_IOleInPlaceSite, (LPVOID FAR *)&m_lpIPSite) != NOERROR) goto error; // if the inplace site could not be obtained, or refuses to inplace // activate then goto error. if (m_lpIPSite == NULL || m_lpIPSite->CanInPlaceActivate() != NOERROR) { if (m_lpIPSite) m_lpIPSite->Release(); m_lpIPSite = NULL; goto error; } // tell the site that we are activating. if (m_lpIPSite->OnInPlaceActivate() != S_OK) TestDebugOut(TEXT("OnInPlaceActivate fails\n")); m_fInPlaceActive = TRUE; } // if not currently inplace visibl if (!m_fInPlaceVisible) { m_fInPlaceVisible = TRUE; // get the window handle of the site if (m_lpIPSite->GetWindow(&m_hWndParent) != S_OK) TestDebugOut(TEXT("GetWindow fails\n")); // get window context from the container m_FrameInfo.cb = sizeof(OLEINPLACEFRAMEINFO); if (m_lpIPSite->GetWindowContext ( &m_lpFrame, &m_lpCntrDoc, &posRect, &clipRect, &m_FrameInfo) != S_OK) TestDebugOut(TEXT("GetWindowContext fails\n")); if (sizeof(OLEINPLACEFRAMEINFO) != m_FrameInfo.cb) { TestDebugOut(TEXT("WARNING! GetWindowContext call " "modified FrameInfo.cb!\n")); } // show the hatch window m_lpDoc->ShowHatchWnd(); // Set the parenting SetParent (m_lpDoc->GethHatchWnd(), m_hWndParent); SetParent (m_lpDoc->GethDocWnd(), m_lpDoc->GethHatchWnd()); // tell the client site to show the object if (m_lpOleClientSite->ShowObject() != S_OK) TestDebugOut(TEXT("ShowObject fails\n")); RECT resRect; // figure out the "real" size of the object IntersectRect(&resRect, &posRect, &clipRect); CopyRect(&m_posRect, &posRect); POINT pt; // adjust our hatch window size SetHatchWindowSize ( m_lpDoc->GethHatchWnd(), &resRect, &posRect, &pt); // calculate the actual object rect inside the hatchwnd. OffsetRect (&resRect, pt.x, pt.y); // move the object window MoveWindow(m_lpDoc->GethDocWnd(), resRect.left, resRect.top, resRect.right - resRect.left, resRect.bottom - resRect.top, FALSE); // create the combined window AssembleMenus(); } // if not UIActive if (!m_fUIActive) { m_fUIActive = TRUE; // tell the inplace site that we are activating m_lpIPSite->OnUIActivate(); // set the focus to our object window SetFocus(m_lpDoc->GethDocWnd()); // set the active object on the frame if (m_lpFrame->SetActiveObject(&m_OleInPlaceActiveObject, OLESTR("Simple OLE 2.0 Server")) != S_OK) TestDebugOut(TEXT("SetActiveObject fails\n")); // set the active object on the Doc, if available. if (m_lpCntrDoc) if (m_lpCntrDoc->SetActiveObject(&m_OleInPlaceActiveObject, OLESTR("Simple OLE 2.0 Server")) != S_OK) TestDebugOut(TEXT("SetActiveObjet fails\n")); // add the frame level UI. AddFrameLevelUI(); } retval = TRUE; error: return retval; } //********************************************************************** // // CSimpSvrObj::AssembleMenus // // Purpose: // // Creates the combined menus used during inplace activation. // // Parameters: // // None // // Return Value: // // None // // Function Calls: // Function Location // // TestDebugOut Windows API // CreateMenu Windows API // IOleInPlaceFrame::InsertMenus Container // InsertMenu Windows API // DestroyMenu Windows API // OleCreateMenuDescriptor OLE API // // //******************************************************************** void CSimpSvrObj::AssembleMenus() { TestDebugOut(TEXT("In CSimpSvrObj::AssembleMenus\r\n")); OLEMENUGROUPWIDTHS menugroupwidths; m_hmenuShared = NULL; // Create the menu resource m_hmenuShared = CreateMenu(); // have the contaner insert its menus if (m_lpFrame->InsertMenus (m_hmenuShared, &menugroupwidths) == NOERROR) { int nFirstGroup = (int) menugroupwidths.width[0]; // insert the server menus InsertMenu( m_hmenuShared, nFirstGroup, MF_BYPOSITION | MF_POPUP, (UINT)m_lpDoc->GetColorMenu(), TEXT("&Color")); menugroupwidths.width[1] = 1; menugroupwidths.width[3] = 0; menugroupwidths.width[5] = 0; } else { // Destroy the menu resource DestroyMenu(m_hmenuShared); m_hmenuShared = NULL; } // tell OLE to create the menu descriptor m_hOleMenu = OleCreateMenuDescriptor(m_hmenuShared, &menugroupwidths); if (!m_hOleMenu) TestDebugOut(TEXT("OleCreateMenuDescriptor fails\n")); } //********************************************************************** // // CSimpSvrObj::AddFrameLevelUI // // Purpose: // // Adds the Frame level user interface // // Parameters: // // None // // Return Value: // // None // // Function Calls: // Function Location // // TestDebugOut Windows API // IOleInPlaceFrame::SetMenu Container // IOleInPlaceFrame::SetBorderSpace Container // IOleInPlaceUIWindow::SetBorderSpace Container // CSimpSvrDoc::GethDocWnd DOC.H // // //******************************************************************** void CSimpSvrObj::AddFrameLevelUI() { TestDebugOut(TEXT("In CSimpSvrObj::AddFrameLevelUI\r\n")); // add the combined menu if ( m_lpFrame->SetMenu(m_hmenuShared, m_hOleMenu, m_lpDoc->GethDocWnd()) != S_OK ) return; // do hatched border SetParent (m_lpDoc->GethHatchWnd(), m_hWndParent); SetParent (m_lpDoc->GethDocWnd(), m_lpDoc->GethHatchWnd()); // set the border space. Normally we would negotiate for toolbar // space at this point. Since this server doesn't have a toolbar, // this isn't needed... if (m_lpFrame) if (m_lpFrame->SetBorderSpace(NULL) != S_OK) return; if (m_lpCntrDoc) if (m_lpCntrDoc->SetBorderSpace(NULL) != S_OK) return; TestDebugOut(TEXT("AddFrameLevelUI exits\n")); } //********************************************************************** // // CSimpSvrObj::DoInPlaceHide // // Purpose: // // Hides the object while inplace actvie // // Parameters: // // None // // Return Value: // // None // // Function Calls: // Function Location // // TestDebugOut Windows API // SetParent Windows API // CSimpSvrDoc::GethDocWnd DOC.H // CSimpSvrDoc::GethAppWnd DOC.H // CSimpSvrDoc::GethHatchWnd DOC.H // CSimpSvrObj::DisassembleMenus OBJ.CPP // IOleInPlaceFrame::Release Container // IOleInPlaceUIWindow::Release Container // // // Comments: // // Be sure to read TECHNOTES.WRI included with the OLE SDK // for details on implementing inplace activation. // //******************************************************************** void CSimpSvrObj::DoInPlaceHide() { TestDebugOut(TEXT("In CSimpSvrObj::DoInPlaceHide\r\n")); // if we aren't inplace visible, then this routine is a NOP, if (!m_fInPlaceVisible) return; m_fInPlaceVisible = FALSE; // change the parenting SetParent (m_lpDoc->GethDocWnd(), m_lpDoc->GethAppWnd()); SetParent (m_lpDoc->GethHatchWnd(),m_lpDoc->GethDocWnd()); // rip down the combined menus DisassembleMenus(); // release the inplace frame m_lpFrame->Release(); m_lpFrame = NULL; // only holding one ref. to frame. // release the UIWindow if it is there. if (m_lpCntrDoc) m_lpCntrDoc->Release(); m_lpCntrDoc = NULL; } //********************************************************************** // // CSimpSvrObj::DisassembleMenus // // Purpose: // // Disassembles the combined menus used in inplace activation // // Parameters: // // None // // Return Value: // // None // // Function Calls: // Function Location // // TestDebugOut Windows API // OleDestroyMenuDescriptor OLE API // RemoveMenu Windows API // IOleInPlaceFrame::RemoveMenus Container // DestroyMenu Windows API // // Comments: // // Be sure to read TECHNOTES.WRI included with the OLE SDK // for details on implementing inplace activation. // //******************************************************************** void CSimpSvrObj::DisassembleMenus() { // destroy the menu descriptor OleDestroyMenuDescriptor(m_hOleMenu); if (m_hmenuShared) { // remove the menus that we added RemoveMenu( m_hmenuShared, 1, MF_BYPOSITION); // have the container remove its menus if (m_lpFrame->RemoveMenus(m_hmenuShared) != S_OK) TestDebugOut(TEXT("RemoveMenus fails\n")); // Destroy the menu resource DestroyMenu(m_hmenuShared); m_hmenuShared = NULL; } } //********************************************************************** // // CSimpSvrObj::SendOnDataChange // // Purpose: // // Uses the data advise holder to send a data change, then updates // the ROT to note the time of change. // // Parameters: // // None // // Return Value: // // None // // Function Calls: // Function Location // // IDataAdviseHolder::SendOnDataChange OLE API // GetRunningObjectTable OLE API // CoFileTimeNow OLE API // IRunningObjectTable::NoteChangeTime OLE API // // //******************************************************************** void CSimpSvrObj::SendOnDataChange() { if (m_lpDataAdviseHolder) if (m_lpDataAdviseHolder->SendOnDataChange( (LPDATAOBJECT) &m_DataObject, 0, 0)) TestDebugOut(TEXT("SendOnDataChange fails\n")); LPRUNNINGOBJECTTABLE lpRot; GetRunningObjectTable(0, &lpRot); if ( lpRot && m_dwRegister) { FILETIME ft; CoFileTimeNow(&ft); lpRot->NoteChangeTime(m_dwRegister, &ft); lpRot->Release(); } } //********************************************************************** // // CSimpSvrObj::DeactivateUI // // Purpose: // // Breaks down the inplace ui // // Parameters: // // None // // Return Value: // // None // // Function Calls: // Function Location // // SetParent Windows API // IOleInPlaceUIWindow::SetActiveObject Container // IOleInPlaceFrame::SetActiveObject Container // IOleInPlaceSite::UIDeactivate Container // // //******************************************************************** void CSimpSvrObj::DeactivateUI() { // if not UI active, or no pointer to IOleInPlaceFrame, then // return NOERROR if (!(m_fUIActive || m_lpFrame)) return; else { m_fUIActive = FALSE; // remove hatching SetParent (m_lpDoc->GethDocWnd(), m_lpDoc->GethAppWnd()); SetParent (m_lpDoc->GethHatchWnd(),m_lpDoc->GethDocWnd()); // if in an MDI container, call SetActiveObject on the DOC. if (m_lpCntrDoc) if (m_lpCntrDoc->SetActiveObject(NULL, NULL) != S_OK) TestDebugOut(TEXT("Fail in SetActiveObject\n")); if (m_lpFrame->SetActiveObject(NULL, NULL) != S_OK) TestDebugOut(TEXT("Fail in SetActiveObject\n")); // tell the container that our UI is going away. if (m_lpIPSite) if (m_lpIPSite->OnUIDeactivate(FALSE) != S_OK) TestDebugOut(TEXT("Fail in OnUIDeactivate\n")); } }