⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 activex.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        src/msw/ole/activex.cpp// Purpose:     wxActiveXContainer implementation// Author:      Ryan Norton <wxprojects@comcast.net>, Lindsay Mathieson <???>// Modified by:// Created:     11/07/04// RCS-ID:      $Id: activex.cpp,v 1.25 2006/10/29 23:38:37 VZ Exp $// Copyright:   (c) 2003 Lindsay Mathieson, (c) 2005 Ryan Norton// Licence:     wxWindows licence/////////////////////////////////////////////////////////////////////////////// ============================================================================// declarations// ============================================================================// ----------------------------------------------------------------------------// headers// ----------------------------------------------------------------------------#include "wx/wxprec.h"#ifdef __BORLANDC__    #pragma hdrstop#endif#if wxUSE_ACTIVEX#ifndef WX_PRECOMP    #include "wx/dcclient.h"    #include "wx/math.h"#endif#include "wx/msw/ole/activex.h"// autointerfaces that we only use hereWX_DECLARE_AUTOOLE(wxAutoIOleInPlaceSite, IOleInPlaceSite)WX_DECLARE_AUTOOLE(wxAutoIOleDocument, IOleDocument)WX_DECLARE_AUTOOLE(wxAutoIPersistStreamInit, IPersistStreamInit)WX_DECLARE_AUTOOLE(wxAutoIAdviseSink, IAdviseSink)WX_DECLARE_AUTOOLE(wxAutoIProvideClassInfo, IProvideClassInfo)WX_DECLARE_AUTOOLE(wxAutoITypeInfo, ITypeInfo)WX_DECLARE_AUTOOLE(wxAutoIConnectionPoint, IConnectionPoint)WX_DECLARE_AUTOOLE(wxAutoIConnectionPointContainer, IConnectionPointContainer)DEFINE_EVENT_TYPE(wxEVT_ACTIVEX)// Ole class helpers (sort of MFC-like) from wxActiveX#define DECLARE_OLE_UNKNOWN(cls)\    private:\    class TAutoInitInt\    {\        public:\        LONG l;\        TAutoInitInt() : l(0) {}\    };\    TAutoInitInt refCount, lockCount;\    static void _GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc);\    public:\    LONG GetRefCount();\    HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject);\    ULONG STDMETHODCALLTYPE AddRef();\    ULONG STDMETHODCALLTYPE Release();\    ULONG STDMETHODCALLTYPE AddLock();\    ULONG STDMETHODCALLTYPE ReleaseLock()#define DEFINE_OLE_TABLE(cls)\    LONG cls::GetRefCount() {return refCount.l;}\    HRESULT STDMETHODCALLTYPE cls::QueryInterface(REFIID iid, void ** ppvObject)\    {\        if (! ppvObject)\        {\            return E_FAIL;\        }\        const char *desc = NULL;\        cls::_GetInterface(this, iid, ppvObject, desc);\        if (! *ppvObject)\        {\            return E_NOINTERFACE;\        }\        ((IUnknown * )(*ppvObject))->AddRef();\        return S_OK;\    }\    ULONG STDMETHODCALLTYPE cls::AddRef()\    {\        InterlockedIncrement(&refCount.l);\        return refCount.l;\    }\    ULONG STDMETHODCALLTYPE cls::Release()\    {\        if (refCount.l > 0)\        {\            InterlockedDecrement(&refCount.l);\            if (refCount.l == 0)\            {\                delete this;\                return 0;\            }\            return refCount.l;\        }\        else\            return 0;\    }\    ULONG STDMETHODCALLTYPE cls::AddLock()\    {\        InterlockedIncrement(&lockCount.l);\        return lockCount.l;\    }\    ULONG STDMETHODCALLTYPE cls::ReleaseLock()\    {\        if (lockCount.l > 0)\        {\            InterlockedDecrement(&lockCount.l);\            return lockCount.l;\        }\        else\            return 0;\    }\    DEFINE_OLE_BASE(cls)#define DEFINE_OLE_BASE(cls)\    void cls::_GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc)\    {\        *_interface = NULL;\        desc = NULL;#define OLE_INTERFACE(_iid, _type)\    if (IsEqualIID(iid, _iid))\    {\        *_interface = (IUnknown *) (_type *) self;\        desc = # _iid;\        return;\    }#define OLE_IINTERFACE(_face) OLE_INTERFACE(IID_##_face, _face)#define OLE_INTERFACE_CUSTOM(func)\    if (func(self, iid, _interface, desc))\    {\        return;\    }#define END_OLE_TABLE\    }// ============================================================================// implementation// ============================================================================//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++// PixelsToHimetric//// Utility to convert from pixels to the himetric values in some COM methods//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#define HIMETRIC_PER_INCH   2540#define MAP_PIX_TO_LOGHIM(x,ppli)   MulDiv(HIMETRIC_PER_INCH, (x), (ppli))static void PixelsToHimetric(SIZEL &sz){    static int logX = 0;    static int logY = 0;    if (logY == 0)    {        // initaliase        HDC dc = GetDC(NULL);        logX = GetDeviceCaps(dc, LOGPIXELSX);        logY = GetDeviceCaps(dc, LOGPIXELSY);        ReleaseDC(NULL, dc);    };#define HIMETRIC_INCH   2540#define CONVERT(x, logpixels)   wxMulDivInt32(HIMETRIC_INCH, (x), (logpixels))    sz.cx = CONVERT(sz.cx, logX);    sz.cy = CONVERT(sz.cy, logY);#undef CONVERT#undef HIMETRIC_INCH}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//// FrameSite//// Handles the actual wxActiveX container implementation////+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++class FrameSite :    public IOleClientSite,    public IOleInPlaceSiteEx,    public IOleInPlaceFrame,    public IOleItemContainer,    public IDispatch,    public IOleCommandTarget,    public IOleDocumentSite,    public IAdviseSink,    public IOleControlSite{private:    DECLARE_OLE_UNKNOWN(FrameSite);public:    FrameSite(wxWindow * win, wxActiveXContainer * win2)    {        m_window = win2;        m_bSupportsWindowlessActivation = true;        m_bInPlaceLocked = false;        m_bUIActive = false;        m_bInPlaceActive = false;        m_bWindowless = false;        m_nAmbientLocale = 0;        m_clrAmbientForeColor = ::GetSysColor(COLOR_WINDOWTEXT);        m_clrAmbientBackColor = ::GetSysColor(COLOR_WINDOW);        m_bAmbientShowHatching = true;        m_bAmbientShowGrabHandles = true;        m_bAmbientAppearance = true;        m_hDCBuffer = NULL;        m_hWndParent = (HWND)win->GetHWND();    }    virtual ~FrameSite(){}    //***************************IDispatch*****************************    HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID, OLECHAR ** ,                                            unsigned int , LCID ,                                            DISPID * )    {   return E_NOTIMPL;   }    STDMETHOD(GetTypeInfo)(unsigned int, LCID, ITypeInfo **)    {   return E_NOTIMPL;   }    HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int *)    {   return E_NOTIMPL;   }    HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID, LCID,                            WORD wFlags, DISPPARAMS *,                            VARIANT * pVarResult, EXCEPINFO *,                            unsigned int *)    {        if (!(wFlags & DISPATCH_PROPERTYGET))            return S_OK;        if (pVarResult == NULL)            return E_INVALIDARG;        //The most common case is boolean, use as an initial type        V_VT(pVarResult) = VT_BOOL;        switch (dispIdMember)        {            case DISPID_AMBIENT_MESSAGEREFLECT:                V_BOOL(pVarResult)= FALSE;                return S_OK;            case DISPID_AMBIENT_DISPLAYASDEFAULT:                V_BOOL(pVarResult)= TRUE;                return S_OK;            case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED:                V_BOOL(pVarResult) = TRUE;                return S_OK;            case DISPID_AMBIENT_SILENT:                V_BOOL(pVarResult)= TRUE;                return S_OK;            case DISPID_AMBIENT_APPEARANCE:                pVarResult->vt = VT_BOOL;                pVarResult->boolVal = m_bAmbientAppearance;                break;            case DISPID_AMBIENT_FORECOLOR:                pVarResult->vt = VT_I4;                pVarResult->lVal = (long) m_clrAmbientForeColor;                break;            case DISPID_AMBIENT_BACKCOLOR:                pVarResult->vt = VT_I4;                pVarResult->lVal = (long) m_clrAmbientBackColor;                break;            case DISPID_AMBIENT_LOCALEID:                pVarResult->vt = VT_I4;                pVarResult->lVal = (long) m_nAmbientLocale;                break;            case DISPID_AMBIENT_USERMODE:                pVarResult->vt = VT_BOOL;                pVarResult->boolVal = m_window->m_bAmbientUserMode;                break;            case DISPID_AMBIENT_SHOWGRABHANDLES:                pVarResult->vt = VT_BOOL;                pVarResult->boolVal = m_bAmbientShowGrabHandles;                break;            case DISPID_AMBIENT_SHOWHATCHING:                pVarResult->vt = VT_BOOL;                pVarResult->boolVal = m_bAmbientShowHatching;                break;            default:                return DISP_E_MEMBERNOTFOUND;        }        return S_OK;    }    //**************************IOleWindow***************************    HRESULT STDMETHODCALLTYPE GetWindow(HWND * phwnd)    {        if (phwnd == NULL)            return E_INVALIDARG;        (*phwnd) = m_hWndParent;        return S_OK;    }    HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL)    {return S_OK;}    //**************************IOleInPlaceUIWindow*****************    HRESULT STDMETHODCALLTYPE GetBorder(LPRECT lprectBorder)    {        if (lprectBorder == NULL)            return E_INVALIDARG;        return INPLACE_E_NOTOOLSPACE;    }    HRESULT STDMETHODCALLTYPE RequestBorderSpace(LPCBORDERWIDTHS pborderwidths)    {        if (pborderwidths == NULL)            return E_INVALIDARG;        return INPLACE_E_NOTOOLSPACE;    }    HRESULT STDMETHODCALLTYPE SetBorderSpace(LPCBORDERWIDTHS)    {return S_OK;}    HRESULT STDMETHODCALLTYPE SetActiveObject(        IOleInPlaceActiveObject *pActiveObject, LPCOLESTR)    {        if (pActiveObject)            pActiveObject->AddRef();        m_window->m_oleInPlaceActiveObject = pActiveObject;        return S_OK;    }    //********************IOleInPlaceFrame************************    STDMETHOD(InsertMenus)(HMENU, LPOLEMENUGROUPWIDTHS){return S_OK;}    STDMETHOD(SetMenu)(HMENU, HOLEMENU, HWND){  return S_OK;}    STDMETHOD(RemoveMenus)(HMENU){return S_OK;}    STDMETHOD(SetStatusText)(LPCOLESTR){ return S_OK;}    HRESULT STDMETHODCALLTYPE EnableModeless(BOOL){return S_OK;}    HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpmsg, WORD)    {        // TODO: send an event with this id        if (m_window->m_oleInPlaceActiveObject.Ok())            m_window->m_oleInPlaceActiveObject->TranslateAccelerator(lpmsg);        return S_FALSE;    }    //*******************IOleInPlaceSite**************************    HRESULT STDMETHODCALLTYPE CanInPlaceActivate(){return S_OK;}    HRESULT STDMETHODCALLTYPE OnInPlaceActivate()    {   m_bInPlaceActive = true;    return S_OK;    }    HRESULT STDMETHODCALLTYPE OnUIActivate()    {   m_bUIActive = true;         return S_OK;    }    HRESULT STDMETHODCALLTYPE GetWindowContext(IOleInPlaceFrame **ppFrame,                                        IOleInPlaceUIWindow **ppDoc,                                        LPRECT lprcPosRect,                                        LPRECT lprcClipRect,                                        LPOLEINPLACEFRAMEINFO lpFrameInfo)    {        if (ppFrame == NULL || ppDoc == NULL || lprcPosRect == NULL ||            lprcClipRect == NULL || lpFrameInfo == NULL)        {            if (ppFrame != NULL)                (*ppFrame) = NULL;            if (ppDoc != NULL)                (*ppDoc) = NULL;            return E_INVALIDARG;        }        HRESULT hr = QueryInterface(IID_IOleInPlaceFrame, (void **) ppFrame);        if (! SUCCEEDED(hr))        {            return E_UNEXPECTED;        }        hr = QueryInterface(IID_IOleInPlaceUIWindow, (void **) ppDoc);        if (! SUCCEEDED(hr))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -