亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tenant.cpp

?? 英文版的 想要的話可以下載了 為大家服務
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
/*
 * TENANT.CPP
 * Patron Chapter 17
 *
 * Implementation of the CTentant class which holds information
 * for a single object on a page.  It maintains position, references
 * to data, and a storage.
 *
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
 *
 * Kraig Brockschmidt, Microsoft
 * Internet  :  kraigb@microsoft.com
 * Compuserve:  >INTERNET:kraigb@microsoft.com
 */


#include "patron.h"


/*
 * CTenant::CTenant
 * CTenant::~CTenant
 *
 * Constructor Parameters:
 *  dwID            DWORD identifier for this page.
 *  hWnd            HWND of the pages window.
 *  pPG             PCPages to the parent structure.
 */

CTenant::CTenant(DWORD dwID, HWND hWnd, PCPages pPG)
    {
    m_hWnd=hWnd;
    m_dwID=dwID;

    m_fInitialized=0;
    m_pIStorage=NULL;
    m_cOpens=0;

    m_pObj=NULL;
    m_pPG =pPG;
    m_clsID=CLSID_NULL;
    m_fSetExtent=FALSE;

    //CHAPTER17MOD
    m_cRef=0;
    m_pIOleObject=NULL;
    m_pIViewObject2=NULL;
    m_grfMisc=0;

    m_pImpIOleClientSite=NULL;
    m_pImpIAdviseSink=NULL;

    m_fRepaintEnabled=TRUE;
    //End CHAPTER17MOD
    return;
    }


CTenant::~CTenant(void)
    {
    //CHAPTER17MOD
    //Object pointers cleaned up in Close.

    DeleteInterfaceImp(m_pImpIAdviseSink);
    DeleteInterfaceImp(m_pImpIOleClientSite);
    //End CHAPTER17MOD

    return;
    }




//CHAPTER17MOD
/*
 * CTenant::QueryInterface
 * CTenant::AddRef
 * CTenant::Release
 *
 * Purpose:
 *  IUnknown members for CTenant object.
 */

STDMETHODIMP CTenant::QueryInterface(REFIID riid, PPVOID ppv)
    {
    *ppv=NULL;

    if (IID_IUnknown==riid)
        *ppv=this;

    if (IID_IOleClientSite==riid)
        *ppv=m_pImpIOleClientSite;

    if (IID_IAdviseSink==riid)
        *ppv=m_pImpIAdviseSink;

    if (NULL!=*ppv)
        {
        ((LPUNKNOWN)*ppv)->AddRef();
        return NOERROR;
        }

    return ResultFromScode(E_NOINTERFACE);
    }


STDMETHODIMP_(ULONG) CTenant::AddRef(void)
    {
    return ++m_cRef;
    }

STDMETHODIMP_(ULONG) CTenant::Release(void)
    {
    if (0!=--m_cRef)
        return m_cRef;

    delete this;
    return 0;
    }

//End CHAPTER17MOD





/*
 * CTenant::GetID
 *
 * Return Value:
 *  DWORD           dwID field in this tenant.
 */

DWORD CTenant::GetID(void)
    {
    return m_dwID;
    }



/*
 * CTenant::GetStorageName
 *
 * Parameters:
 *  pszName         LPOLESTR to a buffer in which to store the storage
 *                  name for this tenant.
 *
 * Return Value:
 *  UINT            Number of characters stored.
 */

UINT CTenant::GetStorageName(LPOLESTR pszName)
    {
   #ifdef WIN32ANSI
    char        szTemp[32];
    UINT        cch;

    cch=wsprintf(szTemp, "Tenant %lu", m_dwID);
    MultiByteToWideChar(CP_ACP, 0, szTemp, -1, pszName, 32);
    return cch;
   #else
    return wsprintf(pszName, TEXT("Tenant %lu"), m_dwID);
   #endif
    }



//CHAPTER17MOD
/*
 * CTenant::StorageGet
 *
 * Purpose:
 *  Returns the IStorage pointer maintained by this tenant,
 *  AddRef'd of course.
 *
 * Parameters:
 *  ppStg           LPSTORAGE * in which to return the pointer.
 *
 * Return Value:
 *  None
 */

void CTenant::StorageGet(LPSTORAGE *ppStg)
    {
    if (NULL==ppStg)
        return;

    *ppStg=m_pIStorage;

    if (NULL!=*ppStg)
        (*ppStg)->AddRef();

    return;
    }
//End CHAPTER17MOD




/*
 * CTenant::Create
 *
 * Purpose:
 *  Creates a new tenant of the given CLSID, which can be either a
 *  static bitmap or metafile or any compound document object.
 *
 * Parameters:
 *  tType           TENANTTYPE to create, either a static metafile,
 *                  bitmap, or some kind of compound document object
 *                  This determines which OleCreate* call we use.
 *  pvType          LPVOID providing the relevant pointer from which
 *                  to create the tenant, depending on iType.
 *  pFE             LPFORMATETC specifying the type of renderings
 *                  to use.
 *  pptl            PPOINTL in which we store offset coordinates.
 *  pszl            LPSIZEL where this object should store its
 *                  lometric extents.
 *  pIStorage       LPSTORAGE of the page we live in.  We have to
 *                  create another storage in this for the tenant.
 *  ppo             PPATRONOBJECT containing placement data.
 *  dwData          DWORD with extra data, sensitive to iType.
 *
 * Return Value:
 *  UINT            A CREATE_* value depending on what we
 *                  actually do.
 */

UINT CTenant::Create(TENANTTYPE tType, LPVOID pvType
    , LPFORMATETC pFE, PPOINTL pptl, LPSIZEL pszl
    , LPSTORAGE pIStorage, PPATRONOBJECT ppo, DWORD dwData)
    {
    HRESULT             hr;
    LPUNKNOWN           pObj;
    UINT                uRet=CREATE_GRAPHICONLY;
    //CHAPTER17MOD
    //Some things moves to ObjectInitialize
    //End CHAPTER17MOD

    if (NULL==pvType || NULL==pIStorage)
        return CREATE_FAILED;

    //Fail if this is called for an already living tenant.
    if (m_fInitialized)
        return CREATE_FAILED;

    m_fInitialized=TRUE;

    //Create a new storage for this tenant.
    if (!Open(pIStorage))
        return CREATE_FAILED;

    /*
     * Get the placement info if it's here.  We either have a non-
     * NULL PPATRONOBJECT in ppo or we have to use default
     * placement and retrieve the size from the object itself.
     */
    pszl->cx=0;
    pszl->cy=0;

    if (NULL!=ppo)
        {
        *pFE=ppo->fe;
        *pptl=ppo->ptl;
        *pszl=ppo->szl;     //Could be 0,0 , so we ask object

        uRet=CREATE_PLACEDOBJECT;
        }

    hr=ResultFromScode(E_FAIL);

    //Now create an object based specifically for the type.
    switch (tType)
        {
        case TENANTTYPE_NULL:
            break;

        case TENANTTYPE_STATIC:
            /*
             * We could use OleCreateStaticFromData here which does
             * pretty much what we're doing below.  However, it does
             * not allow us to control whether we paste a bitmap or
             * a metafile--it uses metafile first, bitmap second.
             * For this reason we'll use code developed in Chapter
             * 11's FreeLoader to affect the paste.
             */
            hr=CreateStatic((LPDATAOBJECT)pvType, pFE, &pObj);
            break;

        //CHAPTER17MOD
        case TENANTTYPE_EMBEDDEDOBJECT:
            hr=OleCreate(*((LPCLSID)pvType), IID_IUnknown
                , OLERENDER_DRAW, NULL, NULL, m_pIStorage
                , (PPVOID)&pObj);
            break;

        case TENANTTYPE_EMBEDDEDFILE:
            hr=OleCreateFromFile(CLSID_NULL, (LPTSTR)pvType
                , IID_IUnknown, OLERENDER_DRAW, NULL, NULL
                , m_pIStorage, (PPVOID)&pObj);
            break;

        case TENANTTYPE_EMBEDDEDOBJECTFROMDATA:
            hr=OleCreateFromData((LPDATAOBJECT)pvType, IID_IUnknown
                , OLERENDER_DRAW, NULL, NULL, m_pIStorage
                , (PPVOID)&pObj);
            break;
        //End CHAPTER17MOD

        default:
            break;
        }

    //If creation didn't work, get rid of the element Open created.
    if (FAILED(hr))
        {
        Destroy(pIStorage);
        return CREATE_FAILED;
        }

    //CHAPTER17MOD
    //We don't get the size if PatronObject data was seen already.
    if (!ObjectInitialize(pObj, pFE, dwData))
        {
        Destroy(pIStorage);
        return CREATE_FAILED;
        }

    if (0==pszl->cx && 0==pszl->cy)
        {
        SIZEL   szl;

        //Try to get the real size of the object, default to 2"*2"
        SETSIZEL((*pszl), 2*LOMETRIC_PER_INCH, 2*LOMETRIC_PER_INCH);
        hr=ResultFromScode(E_FAIL);

        //Try IViewObject2 first, then IOleObject as a backup.
        if (NULL!=m_pIViewObject2)
            {
            hr=m_pIViewObject2->GetExtent(m_fe.dwAspect, -1, NULL
                , &szl);
            }
        else
            {
            if (NULL!=m_pIOleObject)
                hr=m_pIOleObject->GetExtent(m_fe.dwAspect, &szl);
            }

        if (SUCCEEDED(hr))
            {
            //Convert HIMETRIC to our LOMETRIC mapping
            SETSIZEL((*pszl), szl.cx/10, szl.cy/10);
            }
        }
    //End CHAPTER17MOD

    return uRet;
    }






/*
 * CTenant::Load
 *
 * Purpose:
 *  Recreates the object living in this tenant in place of calling
 *  FCreate.  This is used in loading as opposed to new creation.
 *
 * Parameters:
 *  pIStorage       LPSTORAGE of the page we live in.
 *  pti             PTENTANTINFO containing persistent information.
 *                  The ID value in this structure is ignored.
 *
 * Return Value:
 *  BOOL            TRUE if successful, FALSE otherwise.
 */

BOOL CTenant::Load(LPSTORAGE pIStorage, PTENANTINFO pti)
    {
    HRESULT         hr;
    LPUNKNOWN       pObj;
    //CHAPTER17MOD
    DWORD           dwState=TENANTSTATE_DEFAULT;
    //End CHAPTER17MOD

    if (NULL==pIStorage || NULL==pti)
        return FALSE;

    //CHAPTER17MOD
    /*
     * If we already initialized once, clean up, releasing
     * everything before we attempt to reload.  This happens
     * when using the Convert Dialog.
     */
    if (m_fInitialized)
        {
        //Preserve all states except open
        dwState=(m_dwState & ~TENANTSTATE_OPEN);
        m_cRef++;   //Prevent accidental closure

        //This should release all holds on our IStorage as well.
        if (NULL!=m_pIViewObject2)
            {
            m_pIViewObject2->SetAdvise(m_fe.dwAspect, 0, NULL);
            ReleaseInterface(m_pIViewObject2);
            }

        ReleaseInterface(m_pIOleObject);
        ReleaseInterface(m_pObj);

        m_pIStorage=NULL;   //We'll have already released this.
        m_cRef--;           //Match safety increment above.
        }
    //End CHAPTER14MOD

    m_fInitialized=TRUE;

    //Open the storage for this tenant.
    if (!Open(pIStorage))
        return FALSE;

    hr=OleLoad(m_pIStorage, IID_IUnknown, NULL, (PPVOID)&pObj);

    if (FAILED(hr))
        {
        Destroy(pIStorage);
        return FALSE;
        }

    //CHAPTER17MOD
    m_fSetExtent=pti->fSetExtent;
    ObjectInitialize(pObj, &pti->fe, NULL);

    //Restore the original state before reloading.
    m_dwState=dwState;
    //End CHAPTER17MOD

    RectSet(&pti->rcl, FALSE, FALSE);
    return TRUE;
    }




/*
 * CTenant::GetInfo
 *
 * Purpose:
 *  Retrieved a TENANTINFO structure for this tenant.
 *
 * Parameters:
 *  pti             PTENANTINFO structure to fill
 *
 * Return Value:
 *  None
 */

void CTenant::GetInfo(PTENANTINFO pti)
    {
    if (NULL!=pti)
        {
        pti->dwID=m_dwID;
        pti->rcl=m_rcl;
        pti->fe=m_fe;
        pti->fSetExtent=m_fSetExtent;
        }

    return;
    }




//CHAPTER17MOD
/*
 * CTenant::ObjectInitialize
 * (Protected)
 *
 * Purpose:
 *  Performs operations necessary after creating an object or
 *  reloading one from storage.
 *
 * Parameters:
 *  pObj            LPUNKNOWN of the object in this tenant.
 *  pFE             LPFORMATETC describing the graphic here.
 *  dwData          DWORD extra data.  If pFE->dwAspect==
 *                  DVASPECT_ICON then this is the iconic metafile.
 *
 * Return Value:
 *  BOOL            TRUE if the function succeeded, FALSE otherwise.
 */

BOOL CTenant::ObjectInitialize(LPUNKNOWN pObj, LPFORMATETC pFE
    , DWORD dwData)
    {
    HRESULT         hr;
    LPPERSIST       pIPersist=NULL;
    DWORD           dw;
    PCDocument      pDoc;
    TCHAR           szFile[CCHPATHMAX];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产99久久久久| 91精品国产欧美日韩| 精品一区二区免费看| 麻豆免费看一区二区三区| 日本亚洲电影天堂| 热久久免费视频| 久久99九九99精品| 亚洲成在人线在线播放| 一区二区三区在线高清| 五月天久久比比资源色| 老司机精品视频一区二区三区| 免费成人在线观看视频| 国产一区二区在线影院| 在线观看欧美黄色| 精品奇米国产一区二区三区| 国产精品国产成人国产三级| 一区二区三区久久| 国产一区二区三区免费看| 大胆欧美人体老妇| 色哟哟一区二区三区| 7777精品伊人久久久大香线蕉完整版 | 风间由美一区二区av101| av午夜一区麻豆| 欧美一区二区三区啪啪| 国产精品乱码一区二区三区软件| 亚洲国产精品久久一线不卡| 国产精品一级片在线观看| 欧美日韩中文另类| 亚洲图片你懂的| 久久精品国产一区二区三区免费看| 国产成人综合网| 日韩一区二区三区电影| 午夜欧美视频在线观看| 色偷偷成人一区二区三区91| 国产精品久久久久影院亚瑟| 日本美女一区二区三区| 在线免费视频一区二区| 日韩美女视频一区二区| 99国产欧美另类久久久精品| 国产日韩欧美综合一区| 粉嫩一区二区三区性色av| 欧美电影免费观看完整版| 亚洲v精品v日韩v欧美v专区| 欧美日韩精品一区二区三区 | 欧美人牲a欧美精品| 一区二区三区在线观看国产| 欧美专区日韩专区| 午夜久久久久久| 久久婷婷一区二区三区| 国产精品18久久久久久久久久久久| 欧美电影免费观看高清完整版| 天天av天天翘天天综合网| 7777精品伊人久久久大香线蕉的| 午夜久久久久久久久久一区二区| 在线免费观看日韩欧美| 免费成人你懂的| 欧美激情综合在线| 色综合 综合色| 精品一区二区三区免费观看 | 日韩精品视频网站| 欧美国产日本韩| 91精品啪在线观看国产60岁| 国产精品99久久久久久久女警| 亚洲综合一区在线| 国产日韩欧美电影| 日韩一区二区在线免费观看| 成年人国产精品| 国产精品一二三四区| 亚洲成av人在线观看| 中文字幕不卡在线观看| 精品国产一区二区三区久久影院| 一本大道综合伊人精品热热| 国产一区二区剧情av在线| 亚洲综合免费观看高清完整版 | 丁香五精品蜜臀久久久久99网站 | 综合久久综合久久| 久久久精品国产免大香伊| 日本久久精品电影| 99精品欧美一区二区三区综合在线| 精品亚洲成a人| 国产一区二区三区视频在线播放| 日本欧美肥老太交大片| 青青草国产精品亚洲专区无| 视频一区免费在线观看| 日韩黄色小视频| 美女网站色91| 七七婷婷婷婷精品国产| 久久成人精品无人区| 久久精品99国产精品| 国产又黄又大久久| 成人激情小说乱人伦| 在线观看欧美精品| 538在线一区二区精品国产| 日韩欧美在线影院| 国产丝袜在线精品| 一区二区高清免费观看影视大全| 亚洲图片欧美激情| 亚洲精品乱码久久久久| 亚洲欧美另类小说视频| 亚洲欧美日韩精品久久久久| 夜色激情一区二区| 亚洲国产日韩一区二区| 久久激情五月激情| 成人性视频网站| 欧美亚日韩国产aⅴ精品中极品| 成人av影视在线观看| 成人动漫视频在线| 在线不卡中文字幕| 欧美国产一区二区在线观看| 亚洲免费av高清| 秋霞av亚洲一区二区三| 粉嫩一区二区三区性色av| 日本高清不卡视频| 日韩一区二区三区在线| 国产精品的网站| 五月天婷婷综合| 99久久精品国产毛片| 欧美精品一级二级三级| 国产精品你懂的在线| 亚洲一区二区三区免费视频| 国产一区不卡在线| 欧美日韩国产一级片| 国产精品美女久久久久高潮| ...中文天堂在线一区| 亚洲免费色视频| 国产夫妻精品视频| 欧美日韩国产系列| 亚洲欧美一区二区久久| 岛国精品在线播放| 久久精品一区八戒影视| 午夜视频在线观看一区| 91麻豆6部合集magnet| 国产婷婷精品av在线| 国产又粗又猛又爽又黄91精品| 欧美高清视频一二三区| 亚洲电影欧美电影有声小说| 91色.com| 亚洲国产毛片aaaaa无费看| 91极品视觉盛宴| 亚洲香肠在线观看| 欧美片在线播放| 奇米综合一区二区三区精品视频| 欧美性大战久久久久久久蜜臀| 久久精品视频一区二区三区| 青草国产精品久久久久久| 91精品欧美久久久久久动漫 | 不卡的av在线| 一区二区三区日本| 6080日韩午夜伦伦午夜伦| 日本午夜精品一区二区三区电影| 欧美一区二区美女| 成人在线综合网| 婷婷成人综合网| 国产欧美日韩亚州综合 | 欧美电影免费观看高清完整版在线| 婷婷国产v国产偷v亚洲高清| 欧美v亚洲v综合ⅴ国产v| 久久精品久久99精品久久| 国产精品久久久久久久久免费丝袜 | 99久久精品99国产精品| 亚洲综合另类小说| 精品国产乱码久久久久久浪潮| 国内精品自线一区二区三区视频| 成人欧美一区二区三区视频网页 | 久久精品欧美一区二区三区麻豆 | 国产 欧美在线| 日韩二区三区四区| 亚洲乱码国产乱码精品精的特点 | 亚洲一区二区三区四区中文字幕 | 亚洲区小说区图片区qvod| 日韩一区二区电影在线| 色悠久久久久综合欧美99| 国产一区二区三区四| 日日摸夜夜添夜夜添国产精品| 国产色产综合色产在线视频| 欧美一区在线视频| 欧美丰满少妇xxxxx高潮对白| 不卡的看片网站| 99久久久久久99| 91久久线看在观草草青青| 久热成人在线视频| 日韩精品一级中文字幕精品视频免费观看| 精品国产凹凸成av人导航| 99久久久国产精品| 精品系列免费在线观看| 成人av网址在线观看| 成人av免费在线观看| 夫妻av一区二区| 成人av在线影院| 在线视频一区二区三区| 欧美日韩中文字幕一区| 欧美一级搡bbbb搡bbbb| 欧美精品一区二| 国产精品久久久久四虎| 亚洲第一福利视频在线| 偷窥国产亚洲免费视频| 亚洲成人一区二区在线观看| 国产高清亚洲一区| 欧美日韩在线播放三区| 久久精品一区二区三区四区|