#pragma once #include #include // The least a window has to provide for an ActiveX control to activate in it. // XMMT.ocx draws nothing we look at, so every method that decides layout, // menus or scrolling answers with the default. class ControlSite : public IOleClientSite, public IOleInPlaceSite, public IOleInPlaceFrame { public: explicit ControlSite(HWND parent) : parent_(parent) {} virtual ~ControlSite() = default; STDMETHODIMP QueryInterface(REFIID iid, void** out) override; STDMETHODIMP_(ULONG) AddRef() override; STDMETHODIMP_(ULONG) Release() override; // IOleClientSite STDMETHODIMP SaveObject() override { return S_OK; } STDMETHODIMP GetMoniker(DWORD, DWORD, IMoniker** moniker) override { *moniker = nullptr; return E_NOTIMPL; } STDMETHODIMP GetContainer(IOleContainer** container) override { *container = nullptr; return E_NOINTERFACE; } STDMETHODIMP ShowObject() override { return S_OK; } STDMETHODIMP OnShowWindow(BOOL) override { return S_OK; } STDMETHODIMP RequestNewObjectLayout() override { return E_NOTIMPL; } // IOleWindow, shared by the site and the frame STDMETHODIMP GetWindow(HWND* window) override { *window = parent_; return S_OK; } STDMETHODIMP ContextSensitiveHelp(BOOL) override { return E_NOTIMPL; } // IOleInPlaceSite STDMETHODIMP CanInPlaceActivate() override { return S_OK; } STDMETHODIMP OnInPlaceActivate() override { return S_OK; } STDMETHODIMP OnUIActivate() override { return S_OK; } STDMETHODIMP GetWindowContext(IOleInPlaceFrame** frame, IOleInPlaceUIWindow** document, LPRECT position, LPRECT clip, LPOLEINPLACEFRAMEINFO info) override; STDMETHODIMP Scroll(SIZE) override { return E_NOTIMPL; } STDMETHODIMP OnUIDeactivate(BOOL) override { return S_OK; } STDMETHODIMP OnInPlaceDeactivate() override { return S_OK; } STDMETHODIMP DiscardUndoState() override { return E_NOTIMPL; } STDMETHODIMP DeactivateAndUndo() override { return E_NOTIMPL; } STDMETHODIMP OnPosRectChange(LPCRECT) override { return S_OK; } // IOleInPlaceUIWindow STDMETHODIMP GetBorder(LPRECT) override { return E_NOTIMPL; } STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS) override { return E_NOTIMPL; } STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS) override { return E_NOTIMPL; } STDMETHODIMP SetActiveObject(IOleInPlaceActiveObject*, LPCOLESTR) override { return S_OK; } // IOleInPlaceFrame STDMETHODIMP InsertMenus(HMENU, LPOLEMENUGROUPWIDTHS) override { return E_NOTIMPL; } STDMETHODIMP SetMenu(HMENU, HOLEMENU, HWND) override { return S_OK; } STDMETHODIMP RemoveMenus(HMENU) override { return E_NOTIMPL; } STDMETHODIMP SetStatusText(LPCOLESTR) override { return S_OK; } STDMETHODIMP EnableModeless(BOOL) override { return S_OK; } STDMETHODIMP TranslateAccelerator(LPMSG, WORD) override { return S_FALSE; } private: HWND parent_; ULONG references_ = 1; };