• <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

            很近沒有更新了,閑話少說,直奔主題。

             

            微軟做任何技術的思路:在實現一個標準的時候,往往預留出一個通用的擴展機制。呃,貌似很多大公司都是如此,通過擴展把開發者跟自己捆綁。舉例:微軟的ie可以嵌入ActiveX控件、可以用BHO擴展;richedit中支持OLE擴展。這種擴展機制主要是基于其OLE框架,這也是微軟操作系統框架的基石。開發層面目前的趨勢是,淡化OLE強調.NET,有一種無奈叫騎虎難下,有一種錯誤叫脫離群眾,在開發平臺、技術百花齊放,開發資源極大豐富的今天,開發者對微軟的依賴已經不那么強烈,以至于現在的Windows開發者有點小苦逼,尤其是C++開發者有一種被拋棄的感覺,扯遠了。

             

            談談OLE/COM/ACTIVEX的關系。很模糊,有一些說不清,有歷史原因,也有普及程度關系。侯捷說玩模板有三境界:會用標準庫,讀懂標準庫源碼,會用模板做設計。我覺得COM相關的也是如此,使用COM組件往往是容易。我的理解:OLE是技術規范,COM是語言規范,而ACTIVEX則是用這2東東來實做的可服用組件的稱謂。對于OLE的支撐主要在MFC庫中,而ATL庫則是更純粹的OLE/COM框架。MFCOFFICE有一衣帶水的關系,OFFICE的應用框架促使著MFC的發展(早期如此,但UI方面早已分道揚鑣),OFFICE的應用模型也就是MFC的應用開發模型。

             

            之所以提及MFCOFFICE,只是想說通用的擴展機制沒有那么多條條框框,即便是ACTIVEX框架這種東西。對于OLE實踐,也就是微軟最熱衷,其中Windows操作系統和OFFICE系列軟件要最典型,其它則很牽強。OLE技術標準接口只有極少數是必須實現,而大部分則是可選實現或者部分實現,其中richedit更是如此。OLE對服務器和客戶端都做了行為規范,如果一方(一般是服務器)自行決定如何實施,則另一方也只需對應實現。

             

            呃,我說了這么多,只是為了闡述我的險惡用心,或許沒人明白。ATL框架定義了四個標準導出函數用于規范注冊、反注冊、加載、卸載,這些跟實際的OLE功能無關,尤其是在richedit擴展中。或許你在網上諸多示例中看到用ATL模板創建一個控件然后如何簡單的插入位圖就以為掌握了核心科技,那么我就要潑冷水了,這些東西無關大局。既然Windows能用OLE搭建框架,既然MFC可以實踐OLE,那么我們也可以用純正的C++代碼玩OLE,我的意思無非就是沒必要遵循ATL,也沒必要一定去注冊一個東西,問題的核心不是這些東西,目前我們僅僅是為了插入一個動畫。

             

            Richedit是一個不完全的OLE實踐,前面提到能完全實踐OLE的框架不多。因為richedit實現了圖文混排,所以在IM領域很受歡迎,尤其是早期(現在基于chromium的擴展或許可以改變現狀)。Richedit是一個容器,可以容納OLE控件進入,典型的擴展就是動畫控件。基于ATL框架開發,你可以實現一個標準的控件,但當你面對一個非標準的容器時,那些條條框框顯得不是那么重要,這也是為什么能做好動畫控件不容易的原因。

             

            根據我的調查(呃,通過實踐,通過QueryInterface觀察),我發現實現一個richedit中的動畫控件只需要實現二個接口:IOleObjectIViewObject2,前者為了融入到richedit環境中,后者為了渲染顯示。由于richedit默認只喜好無窗口模式,所以針對IOleInPlaceSiteWindowless之類的,你去實現意義也不大,因為人家容器不認你,當然還有IPersist系列接口,對于標準的環境有用(比如IDE),但這里并不是很需要,所以認清核心問題能減少很多困惑。更顯然的是我的控件沒有用ATL框架,因為此控件脫離了richedit環境生存的意義也不大,更有甚者我沒必要讓使其成為標準(也沒可能),僅僅是為了在一個系統中的richedit中更好地展示。實現的接口越少,引入的麻煩越少,這樣才能使精力集中在主要問題上。

             

            綜上所述,我的控件是一個C++類,只實現了兩個接口:

             

            X_BEGIN_INTERFACE_MAP(IMRichPicture, ObjectRootBase)
              X_INTERFACE_PART(IMRichPicture, IID_IOleObject, OleObject)
              X_INTERFACE_PART(IMRichPicture, IID_IViewObject, ViewObject)
              X_INTERFACE_PART(IMRichPicture, IID_IViewObject2, ViewObject)
            X_END_INTERFACE_MAP()

             

             

            其中大部分接口都可以無視,因為我們只需要這個控件在richedit中能夠占位(長寬),能夠展示(效率關鍵),至于其他的可編程、在位激活、對象識別都不重要。我觀察了QQ的動畫控件,呃,比現在網上流行的要改變很多(網上內容沒有與時俱進)。現在的`QQ的動畫控件很簡單(后面會講述如何找到這個控件),看起來只是作為一個占位工具,如何觸發動畫則是由host控制。觀其接口:

            interface IRichFrameObj : IDispatch {
                };
            interface IRichPicObj : IDispatch {
                    [id(0x00000001), propput, helpstring("property src")]
                    HRESULT src([in] BSTR rhs);
                    [id(0x00000002), propput, helpstring("property static")]
                    HRESULT na([inlong rhs);
                    [id(0x00000003), propput, helpstring("property autoHeight")]
                    HRESULT autoHeight([inlong rhs);
                    [id(0x00000004), propput, helpstring("property autoWidth")]
                    HRESULT autoWidth([inlong rhs);
                    [id(0x00000005), propput, helpstring("property maxAutoWidth")]
                    HRESULT maxAutoWidth([inint rhs);
                    [id(0x00000006), propput, helpstring("property onerror")]
                    HRESULT onerror([in] BSTR rhs);
                    [id(0x00000007), propput, helpstring("property objid")]
                    HRESULT objid([in] BSTR rhs);
                };

             

            IrichFrameObj的作用我不是很理解居然一個接口都沒有而后者模糊的能夠理解一些src大概就是動畫圖片路徑,auto系列是為了動態縮放。現在的QQ只允許一個自定義動畫,依據老衲猜測,因為自定義動畫往往是截圖,比較大,在一行容易引起點擊時視圖跳躍。再有其他的屬性是為了識別所用,無法推測具體行為。

             

            呃,事情看起來沒有那么復雜,的確,我只實現了2個接口,而其中大部分也都是返回E_NOTIMPL,因為richedit確實沒有那么標準,你實現的再標準也無濟于事。當然richeit也在更新,win8sdk對其改動最大,但win7sdk也暴露了一些更早的功能,這或許是目前實現的最大亮點(技術含量,高風險高回報,一般人難以置信)。

             

            對于動畫控件闡述到此為止,或許很多人會很失望,但也僅僅如此,因為它本身什么都沒有,尤其是在你真正明白之后,所以這里或許你會很失望,但是真正的內容就這么多,我也不知怎么添油加醋。

             

            最后一個建議,希望尊重所有的玩技術的:

            1、中國官本位思想很嚴重,技術搞得不錯(或許是運氣)立馬轉管理

            2、文人相輕

            3、資本運作,體制運作,技術作用不明顯

            4、吃飽肚皮,難以維系理想

             

            大道無形,大音希聲,牛叉的技術很多都是巧工,而真正的產業才是大無畏的研發,我們只不過在投機取巧。

            posted on 2012-08-05 19:18 萬連文 閱讀(1708) 評論(0)  編輯 收藏 引用 所屬分類: richedit
            簡歷下載
            聯系我

            <2012年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            性欧美丰满熟妇XXXX性久久久| 99久久久国产精品免费无卡顿| 国产精品内射久久久久欢欢| 精品多毛少妇人妻AV免费久久| 亚洲国产精品无码久久久久久曰 | 国产99久久久久久免费看| 久久国产高清字幕中文| 久久男人中文字幕资源站| 久久久久久曰本AV免费免费| 国产91久久精品一区二区| 国产精品美女久久久久av爽 | 日日狠狠久久偷偷色综合免费| 蜜桃麻豆WWW久久囤产精品| 97久久综合精品久久久综合| 亚洲国产成人久久笫一页| 成人久久久观看免费毛片| 久久中文字幕视频、最近更新| 一本色道久久综合亚洲精品| 精品久久久久一区二区三区| 狠狠色丁香久久婷婷综合五月| 色播久久人人爽人人爽人人片aV| 99精品久久精品一区二区| 久久精品人人做人人爽电影| 精品久久久久久无码人妻热| 久久青青草原国产精品免费| 人妻精品久久无码区| 性做久久久久久免费观看| 国产—久久香蕉国产线看观看 | 国产精品天天影视久久综合网| 久久久精品国产免大香伊| 久久无码AV中文出轨人妻| 久久91亚洲人成电影网站| 日韩AV无码久久一区二区| 久久久精品国产免大香伊| 久久精品一区二区三区AV| 久久综合狠狠综合久久97色| 国产精品日韩欧美久久综合| 国产成人精品久久| 久久精品国产精品亚洲下载| 国内精品久久久久影院网站 | 亚洲熟妇无码另类久久久|