• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            萬星星@豌豆莢 歡迎加入我們
            一個吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0

            我對ole技術(shù)的了解源于com技術(shù)的學(xué)習(xí),認(rèn)識源于windows os上多年的編程,而深入理解卻來之多年的痛苦摸索、反復(fù)的體會,水到渠成的感覺終于有了。
            記得很久以前有個人加我qq,說想學(xué)mfc,問有什么辦法。我告訴它,得花2、3年時間才能入門,他說算了還是不學(xué)。我不知道是不是害了他,或者過早斷送了他學(xué)習(xí)C++的路。小的時候很盼望長大,可以賺錢自立;記得學(xué)習(xí)編程的時候很希望自己能夠入門。這種希望都變成了現(xiàn)時,自己走過的路只有自己清楚。有人說java好,有人說linux下編程來錢,有人說鉆研技術(shù)沒錢途,這些道理我明白只是自己可能并沒有那么大夢想,或許很小的夢想都能滿足我。
            對于我這個年齡的青年來說,ole技術(shù)真的很晦澀難懂,這并不是自夸。記得以前在公司的時候,有個boss對com很了解。我本身不太愛問別人技術(shù)細(xì)節(jié)問題,但是崇拜之情下我找了他:做控件的時候如何強(qiáng)制控制控件的尺寸。得到的答案是:具體你看看里面的代碼。當(dāng)時我沒有弄明白,只是暫時放棄。第二次是在研一的時候,問一個高級工程師(30多歲),如何在控件里面獲取當(dāng)前是設(shè)計時還是運行時。答案是:我回去看看在告訴你。結(jié)果是杳無音訊。我曾一度放棄com知識的進(jìn)一步學(xué)習(xí)有一年,只是因為身邊少了一個導(dǎo)師(在后來遇到了),或許自己很笨。
            不多說了,下面來看技術(shù)吧。
            問題是這樣的:開發(fā)環(huán)境里面一般都是支持activex控件插入的,比如vb編輯器、vc編輯器、office系列產(chǎn)品,在mfc里面有ole文檔。
            假設(shè)我們要做一個activex容器,支持activex的插入、設(shè)計時屬性編程的話,恐怕就需要一個載體(窗口),首先使其成為容器,支持插入,然后要提供idispatch接口為控件獲取環(huán)境屬性提供支持。為什么呢?我們首先來看看ATL.CComControlBase.GetAmbientUserMode方法:

            HRESULT GetAmbientUserMode(BOOL& bUserMode)
                
            {
                    CComVariant var;
                    HRESULT hRes 
            = GetAmbientProperty(DISPID_AMBIENT_USERMODE, var);
                    ATLASSERT(var.vt 
            == VT_BOOL || FAILED(hRes));
                    bUserMode 
            = var.boolVal;
                    
            return hRes;
                }


            進(jìn)一步:

            HRESULT GetAmbientProperty(DISPID dispid, VARIANT& var)
                
            {
                    HRESULT hRes 
            = E_FAIL;
                    
            if (m_spAmbientDispatch.p != NULL)
                        hRes 
            = m_spAmbientDispatch.GetProperty(dispid, &var);
                    
            return hRes;
                }


            其中m_spAmbientDispatch的獲取是在這里:

            inline HRESULT CComControlBase::IOleObject_SetClientSite(IOleClientSite *pClientSite)
            {
                ATLASSERT(pClientSite 
            == NULL || m_spClientSite == NULL);
                m_spClientSite 
            = pClientSite;
                m_spAmbientDispatch.Release();
                
            if (m_spClientSite != NULL)
                
            {
                    m_spClientSite
            ->QueryInterface(IID_IDispatch,
                        (
            void**&m_spAmbientDispatch.p);
                }

                
            return S_OK;
            }


            也就是activex控件在放到自己窩里面的時候設(shè)置的。這樣我們的容器就需要實現(xiàn)IDispatch以便控件查詢環(huán)境屬性。

            // this for activex control AMBIENT query
            STDMETHODIMP CActiveXCtrl::Invoke(
                              DISPID dispidMember, REFIID iid, LCID lcid,
                              WORD wFlags, DISPPARAMS
            * pdpParams, VARIANT* pvarResult,
                              EXCEPINFO
            * pExceptionInfo, UINT* piArgError)
            {
                
            if(dispidMember == DISPID_AMBIENT_USERMODE)
                
            {
                    VariantClear(pvarResult);
                    pvarResult
            ->vt = VT_BOOL;
                    pvarResult
            ->boolVal = VARIANT_FALSE;
                    
            return S_OK;
                }

                
            return E_NOTIMPL;
            }


            這里只是簡單的返回activex控件的用戶模式為設(shè)計時。我有一個測試,代碼如下:

            HRESULT OnDraw(ATL_DRAWINFO& di)
                
            {
                    RECT
            & rc = *(RECT*)di.prcBounds;
                    Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);

                    SetTextAlign(di.hdcDraw, TA_CENTER
            |TA_BASELINE);
                    BOOL bUserMode 
            = FALSE;
                    HRESULT hr 
            = GetAmbientUserMode(bUserMode);
                    
            if(bUserMode)
                    
            {
                        LPCTSTR pszText 
            = _T("ATL 3.0 : UserMode");

                        TextOut(di.hdcDraw, 
                            (rc.left 
            + rc.right) / 2
                            (rc.top 
            + rc.bottom) / 2
                            pszText, 
                            lstrlen(pszText));
                    }

                    
            else
                    
            {
                        LPCTSTR pszText 
            = _T("ATL 3.0 : DesignMode");
                        TextOut(di.hdcDraw, 
                            (rc.left 
            + rc.right) / 2
                            (rc.top 
            + rc.bottom) / 2
                            pszText, 
                            lstrlen(pszText));
                    }


                    
            return S_OK;
                }


            運行效果如下:

            微軟有一個控件叫owc11.chartspace.11,在設(shè)計時支持?jǐn)?shù)據(jù)選擇,而運行時不支持,來看看運行效果:



            posted on 2007-05-13 08:57 萬連文 閱讀(2583) 評論(2)  編輯 收藏 引用 所屬分類: ATL

            FeedBack:
            # re: OLE容器之環(huán)境屬性支持
            2007-05-13 17:33 | doodle
            WOW 很詳細(xì), 仔細(xì)學(xué)習(xí)。。。

            www.doodle8.cn 涂鴉基地,跟蹤最新的 web2.0 資源  回復(fù)  更多評論
              
            # re: OLE容器之環(huán)境屬性支持
            2014-07-01 12:52 | xuthus
            你好,有沒有研究過C#下的OLE容器設(shè)計。
            我正在做這方面的項目,不知道你有沒有興趣,有報酬。
            郵箱:xuthus@sina.com,隨時聯(lián)系我。  回復(fù)  更多評論
              
            簡歷下載
            聯(lián)系我

            <2008年12月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            国产99久久久国产精品~~牛| 97精品伊人久久久大香线蕉| 久久香综合精品久久伊人| 久久亚洲AV成人出白浆无码国产| 三上悠亚久久精品| 99热成人精品免费久久| 内射无码专区久久亚洲| 久久久无码人妻精品无码| 爱做久久久久久| 午夜欧美精品久久久久久久| 91性高湖久久久久| 蜜臀av性久久久久蜜臀aⅴ| 成人精品一区二区久久久| 久久亚洲日韩精品一区二区三区| 亚洲午夜精品久久久久久人妖| 精品伊人久久久| 成人午夜精品久久久久久久小说 | 国产视频久久| 伊人久久无码中文字幕| 精品欧美一区二区三区久久久| 老色鬼久久亚洲AV综合| 欧美一区二区久久精品| 99热精品久久只有精品| 少妇内射兰兰久久| 免费精品久久天干天干| 久久国产一片免费观看| 一本色道久久88加勒比—综合| 人妻无码中文久久久久专区| 合区精品久久久中文字幕一区| 亚洲成色999久久网站| 久久综合狠狠综合久久| 亚洲精品白浆高清久久久久久| 欧美日韩成人精品久久久免费看| 99久久99久久精品国产片| 精品久久一区二区三区| 国产精品久久永久免费| 国产亚洲婷婷香蕉久久精品 | 狠狠色婷婷综合天天久久丁香 | 老男人久久青草av高清| 亚洲国产成人久久一区WWW| 久久精品亚洲精品国产欧美|