青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

萬星星@豌豆莢 歡迎加入我們
一個吃軟飯的男人!!!!!我只想寫程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0

研究背景

自職業生涯起到現在,我參與過三個im類產品,其中我主要負責的是界面庫開發。眾所周知,im軟件中有一個非常重要的控件用于消息展示,實現方式無外乎基于richedit(目前這一類為主要方式,代表:QQ)、基于webbrowser(代表:GTalk),可能會有基于WebKit的,我沒有刻意去搜集。很多時候對于相對簡單的情況,比如在游戲中,完全可以自己繪制。

 

我曾經模仿過GTalk的實現方式,由于當時自己經驗欠缺以及與公司寫頁面的人溝通上的問題,效果不是那么滿意,僅僅夠用,后來自己離開也沒再繼續做這方面研究。機制上這種方式是可行的,native端事情不多。

 

后來的工作中,主要是基于richedit在做,都是安排其他人負責。在開發過程中,遇到種種問題,用過各種不優雅的“伎倆”,由于欠缺OLE知識,做的人很痛苦,找不到樂趣。微軟官方有一個例子,然而只披露了使用技巧的冰山一角;codeproject也有少的可憐的幾個例子,經不住商業化應用;互聯網搜索的一些文章大多都是簡單的插入圖片等,聊勝于無。

 

《基于Chrome開源提取的界面開發框架》系列文章獲得了不少支持,在提取過程中我自己也成長很多。抽取出來的引擎要想用于商業化開發,我個人覺得欠缺的主要是富文本渲染這一塊,這使我開始研究richedit。斷斷續續,期間各種事情,幾經放棄。后來一個網友在這個問題上又找到我,臨時的幫助他解決問題之后,不禁感嘆,為什么互聯網上找不到一個優雅的解決方案甚至是深入的介紹?

 

網友megax的文章http://m.shnenglu.com/megax/archive/2012/03/22/168601.html中關于制作編輯器方面知識提及的http://www.catch22.net/tuts/neatpad讓我著實佩服,老外對待研究的態度真的很嚴謹,分享的開發性和持續性方面遠遠勝于我們。系列文章中的絕大多數概念知識我都接觸過,然而很多沒有深究,經驗遠遠不如文章主人。

 

Richedit的研究的大部分知識都在OLE方面。現在計算機的發展,技術的百花齊放,使得Windows平臺不再那么大行其道,Windows技術也不再那么不可一世,Mfc越來越被拋棄,Windows程序員誠惶誠恐,新生代早早把自己定位在更炫更酷更激情的技術平臺。在Windows Native開發沒有徹底失寵前,我打算把自己死啃得來的OLE知識發揮“余熱”,對richedit這個東西應用于im領域的問題解決一下,希望對其他人有幫助,也希望沒有重復造輪子。



研究目標

RicheditWindows底層的組件,甚至在2004年泄漏的Win2K代碼中都沒有,它是獨立于edit組件的,而edit位于ntuser中,亦相當底層,雖在泄漏代碼中出現,然而抽取出來的可能性不大。從某種角度來講,Reactos 就是抄襲的這份代碼,明眼人可以從其死灰復燃的更新列表中發覺。很奇怪的是Reactos 的代碼中有richedit,我也移植過,只是后來發現功能實在太弱,無可用性,遂放棄,至于Wine 是不是抄襲這份代碼,我無從得知,也沒精力再去跟蹤。

 

Richedit 的接口相當穩定,我在Win8中試驗過完全兼容,我想它應該會持續很久,所以值得去好好研究一把。

 

《基于Chrome開源提取的界面開發框架》的view框架,如果能有一個rtf格式的渲染利器,配以ole的展示,我想足以成為互聯網商業開發的UI解決方案。

 

Richedit 就機制上來講跟WebKit一樣,或者應該反過來說。Richedit窗口本身是對ITextServices的封裝,實現ITextHost接口與ITextServices交互提供平臺支持。ITextServices的支持分兩大類:基于文本的ITextDocument和基于oleIRichEditOle。作為ole容器,提供的功能主要通過實現幾個接口完成的,包括:IOleClientSiteIAdviseSinkIOleInPlaceSite,缺省的Richedit 貌似不支持定位激活,想要達到激活效果必須支持最后一個接口。與剪貼板和拖拽數據打交道需要支持統一數據傳輸接口IDataObject

 

研究主要參考對象為QQ,目標為:支持粘貼格式、動畫ole控件、定制ole菜單、拖拽、文本操縱、窗口/無窗口的統一支持等,我會在下一篇列出詳細的大綱。



已做工作

OLE標準提供了大量工業化標準接口以及繁雜的交互規范,事實上除了微軟(以office系列產品為典范),鮮有軟件全盤實施。可以說MFC的大部分工作都是用在實現OLE,所以其臃腫大抵源于此,不得不臃腫,早些年我接觸wtl后得出,MFC - WTL == OLE,或許還有一些打印等方面設施,但我不覺得這些是主要特性。以我現在眼光來看待,把MFC拆分開,其集合類、打印框架、COM支持、OLE支持、文檔/視圖/框架模板(盡管現在用的極少,大多在行業軟件領域)、進程/線程/模塊狀態管理等,都還不錯,呃,貌似我快把它說全了,不好意思,我的老毛病又犯了,其實在心底,我還有那么一點不舍,即便我很多年沒有用它開發商業軟件了。我從MFC學到的東西太多太多,以至于我不肯說它的壞話。

 

再一次,我選擇了從MFC中抽取代碼。我嘗試過直接使用MFC,靜態鏈接以便偷偷的不告訴別人,以免“破壞形象”。但我不覺得我能做到,原因就是整個MFC耦合的比較緊密,我不想或者無法使用整個框架來對外提供服務,所以我不得不制造小輪子。我也試過直接實現,但是工作量還真不小,我怕自己等不及,故再次祭出看家本領,順藤摸瓜,牽出一個支持OLE的最小內核,經過1-2周我能騰出的時間,終于做到了,于是我寫下了開篇,后面我需要把整個思路刻畫出來。下面是一個示例,插入瀏覽器,支持定位激活:


 

這個例子不具備任何說明性,只是用來測試最小的OLE內核框架是否可以工作。

 

測試的接口如下:


 

這一篇到此為止!依然是閑話多,干貨少。我會努力的!

posted on 2012-05-20 20:01 萬連文 閱讀(4808) 評論(15)  編輯 收藏 引用 所屬分類: richedit

FeedBack:
# re: richedit研究開篇01
2012-05-20 22:36 | unkown
動畫ole控件,關鍵點在于定時刷新時,使用IOleInPlaceSite::GetWindowContext 獲取到動畫的范圍,然后InvalidateRect  回復  更多評論
  
# re: richedit研究開篇01
2012-05-20 22:50 | 萬連文
@unkown

感謝提示,動畫的效率需要考慮如何設計時鐘隊列,刷新也需要考慮當前屏幕的最小優化,好像據說直接InvalidateRect效率不高,有待進一步確認,不過技術細節差不多都鬧清楚了。  回復  更多評論
  
# re: richedit研究開篇01
2012-05-21 09:24 | unkown
呵呵,要用IOleInPlaceSite::GetWindowContext 獲取到動畫的rectPos范圍,然后InvalidateRect的這種方法,是因為直接調用FireViewChange,會引起Richedit重新排列刷新GIF當前所在的行,有滾動的問題尤其明顯。  回復  更多評論
  
# re: richedit研究開篇01
2012-05-21 15:13 | 飯中淹
我用RICHEDIT的WINDOWLESS模式,在codeproject上找到的代碼。
最后事情歸結為實現一個RTF的生成器,下載了最新的RTF文檔之后,我徹底萎了。
  回復  更多評論
  
# re: richedit研究開篇01[未登錄]
2012-05-29 07:31 | 路人甲
win2k 泄漏代碼里是有 richedit 控件源碼的. 下面是我整理的一份. 供參考.
http://winutilities.svn.sourceforge.net/svnroot/winutilities/richedit
  回復  更多評論
  
# re: richedit研究開篇01
2012-05-29 08:33 | 萬連文
@路人甲

參見:http://www.cnblogs.com/wlwel/archive/2012/05/20/2510761.html
發現你的代碼跟這個朋友給我的一樣,能解釋為是同一人嗎?  回復  更多評論
  
# re: richedit研究開篇01[未登錄]
2012-05-29 18:36 | 路人甲
@萬連文
不是的。我都忘了是取自 Nt4 還是 win2k 了。 工程里有舊版 WordPad 的完整源碼,微軟的示例程序, 全面展示了 richedit 的用法。 Enjoy it!!!
  回復  更多評論
  
# re: richedit研究開篇01
2012-05-29 19:31 | 萬連文
@路人甲
非常感謝你,這樣看來Nt4 里面的richedit 還是比較獨立的,再次謝謝你!  回復  更多評論
  
# re: richedit研究開篇01
2012-06-03 14:05 | weolar
嘿嘿,萬兄我又來了。我還嘗試過用ie2來做richedit:
http://bbs.pediy.com/showthread.php?t=137616  回復  更多評論
  
# re: richedit研究開篇01
2012-06-03 16:11 | 萬連文
@weolar
Greate! 只可惜我沒有帳戶,可以發我郵箱一份嗎?如果還能有閑暇的蛋疼的時間我一定會回頭再看看,是否還有能讓自己提升一把的亮點。  回復  更多評論
  
# re: richedit研究開篇01
2012-06-03 16:14 | 萬連文
@weolar
呃,我已經注冊,24小時之后可以下載。我記憶中,之前是見過,也想下載,那時候好像還需要邀請碼。發完上面的信息后,我抱著試一試的心情,點擊了注冊,居然不需要,難道以前是錯覺?  回復  更多評論
  
# re: richedit研究開篇01
2012-07-02 14:29 | M77
如果博主只是要RichEdit的功能,而且又不跨平臺,在Windows下直接用RichEdit就可以了,我記得chrome UI可以添加原生控件的。  回復  更多評論
  
# re: richedit研究開篇01
2012-07-02 17:11 | 萬連文
@M77
原生控件不是Windowless,效果有差距。  回復  更多評論
  
# re: richedit研究開篇01
2013-06-24 17:08 | zhenhua
我遇到一個問題,在richedit中插入網頁,只能顯示黑色的背景,請問這是什么原因!  回復  更多評論
  
# re: richedit研究開篇01[未登錄]
2013-06-25 10:52 | rich
請問這樣插入網頁為什么不行

IStorage* lpStorage = NULL;//存儲接口
IOleObject* lpOleObject = NULL;//OLE對象
LPLOCKBYTES lpLockBytes = NULL;//LOCKBYTE
IOleClientSite* lpOleClientSite = NULL;
CComPtr<IWebBrowser2> lpPolyCtl = NULL; //控件
CLSID clsid;
REOBJECT reobject;
HRESULT hr;
IRichEditOle *lpRichEditOle =m_RichEdit.GetIRichEditOle();
if(lpRichEditOle == NULL)
return ;
//創建PolyCtl對象并獲取接口
hr = ::CoCreateInstance(CLSID_WebBrowser,NULL,CLSCTX_INPROC,IID_IWebBrowser2,(LPVOID*)&lpPolyCtl);
//hr = ::CoCreateInstance(CLSID_InternetExplorer,NULL,CLSCTX_LOCAL_SERVER,IID_IWebBrowser2,(LPVOID*)&lpPolyCtl);
if( lpPolyCtl == NULL )
{
return ;
}

// USES_CONVERSION;
BOOL bRet = TRUE;

try{
hr = lpPolyCtl->QueryInterface(IID_IOleObject,(void **)&lpOleObject);//獲得數據對象接口
if( hr != S_OK )
AfxThrowOleException(hr);
hr = lpOleObject->GetUserClassID(&clsid);
if ( hr != S_OK)
AfxThrowOleException(hr);

hr = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);//創建LOCKBYTE對象
if (hr != S_OK)
AfxThrowOleException(hr);
ASSERT(lpLockBytes != NULL);

hr = ::StgCreateDocfileOnILockBytes(lpLockBytes,//創建復合文檔
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);
if (hr != S_OK)
{
VERIFY(lpLockBytes->Release() == 0);
lpLockBytes = NULL;
AfxThrowOleException(hr);
}

lpRichEditOle->GetClientSite(&lpOleClientSite);

ZeroMemory(&reobject, sizeof(REOBJECT));//初始化一個對象
reobject.cbStruct = sizeof(REOBJECT);
reobject.clsid = clsid;
reobject.cp = REO_CP_SELECTION;
reobject.dvaspect = DVASPECT_CONTENT;
reobject.dwFlags = REO_BELOWBASELINE;
reobject.poleobj = lpOleObject;
reobject.polesite = lpOleClientSite;
reobject.pstg = lpStorage;


lpOleObject->SetClientSite(lpOleClientSite);//

hr = lpRichEditOle->InsertObject( &reobject );
if (hr != S_OK)
AfxThrowOleException(hr);
OleSetContainedObject(lpOleObject,TRUE);

hr = lpPolyCtl->Navigate(L"www.baidu.com",NULL,NULL,NULL,NULL);
if (hr != S_OK)
AfxThrowOleException(hr);
::SendMessage(m_RichEdit.GetSafeHwnd(), EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
lpOleObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, lpOleClientSite, 0,
m_RichEdit.m_hWnd, NULL);
lpOleObject->DoVerb(OLEIVERB_SHOW, NULL, lpOleClientSite, 0, m_RichEdit.m_hWnd,
NULL);
m_RichEdit.RedrawWindow();
}

catch( COleException* e )
{
TRACE(_T("OleException code:%d"),e->m_sc);
e->Delete();
bRet = FALSE;
}

// release the interface
//if( lpPolyCtl != NULL ) lpPolyCtl->Release();
if( lpOleObject != NULL ) lpOleObject->Release();
if( lpOleClientSite != NULL ) lpOleClientSite->Release();
if( lpStorage != NULL ) lpStorage->Release();

return ;  回復  更多評論
  
簡歷下載
聯系我

<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(66)

隨筆分類

隨筆檔案

相冊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美视频亚洲视频| 一区二区国产精品| 中文精品视频| 99热在这里有精品免费| 亚洲精品久久嫩草网站秘色| 亚洲人www| 一区二区三区四区五区精品视频| 亚洲高清av在线| 亚洲欧洲一区| 亚洲影院免费| 久久天天躁狠狠躁夜夜爽蜜月| 欧美自拍偷拍午夜视频| 老牛嫩草一区二区三区日本| 亚洲国产美女| 亚洲人成网站影音先锋播放| 亚洲无限av看| 久久久久欧美| 国产精品成人aaaaa网站| 国产一区二区精品丝袜| 亚洲精品中文字| 欧美伊人久久久久久午夜久久久久| 久久女同精品一区二区| 亚洲国产乱码最新视频| 亚洲欧美乱综合| 欧美激情黄色片| 国产亚洲女人久久久久毛片| 最新国产の精品合集bt伙计| 亚洲免费视频网站| 欧美高清成人| 亚洲欧美国产va在线影院| 美女999久久久精品视频| 国产精品乱码妇女bbbb| 精品91在线| 性色av一区二区三区红粉影视| 欧美大片一区| 欧美一区二区三区日韩| 欧美日韩综合视频| 亚洲黄页一区| 久久在线免费观看| 亚洲一区欧美一区| 欧美日韩高清不卡| 亚洲福利在线观看| 久久久久综合| 午夜视频一区| 国产精品免费视频观看| 一本久道久久综合狠狠爱| 免费中文日韩| 久久人人爽国产| 国产欧美va欧美va香蕉在| 亚洲精品在线观看免费| 免费观看久久久4p| 欧美一级午夜免费电影| 欧美三级欧美一级| 夜夜爽av福利精品导航| 亚洲国产精品激情在线观看| 久久久久久婷| 在线成人www免费观看视频| 久久精品一二三区| 午夜精品国产更新| 国产伦精品一区二区三区高清版| 亚洲天堂成人在线视频| 亚洲精品日产精品乱码不卡| 欧美成人午夜剧场免费观看| 亚洲欧洲综合另类| 亚洲精品看片| 欧美午夜女人视频在线| 亚洲影院色无极综合| 99re66热这里只有精品4| 欧美另类人妖| 亚洲免费在线播放| 午夜精品久久久久久久男人的天堂 | 亚洲欧美日韩在线一区| 国产精品乱码妇女bbbb| 午夜在线成人av| 午夜在线观看免费一区| 国产日韩精品在线播放| 久久夜色精品| 美国十次了思思久久精品导航| 亚洲国产精品成人综合色在线婷婷 | 久久综合给合久久狠狠色| 在线不卡中文字幕| 欧美国产视频一区二区| 欧美精品在线极品| 亚洲欧美韩国| 久久国产视频网| 亚洲欧洲一区二区三区在线观看| 99国产精品视频免费观看| 国产精品五区| 农村妇女精品| 欧美色区777第一页| 午夜一级久久| 久久综合九色综合欧美就去吻| 亚洲精品国产精品国自产在线 | 欧美激情四色| 欧美伊久线香蕉线新在线| 久久在精品线影院精品国产| 亚洲第一二三四五区| 久久国产精品电影| 亚洲国产精品热久久| 一本高清dvd不卡在线观看| 国产一区二区中文| 欧美承认网站| 国产精品日日摸夜夜添夜夜av| 免费成人av资源网| 欧美日韩国产综合视频在线| 久久久噜噜噜久久中文字幕色伊伊 | 美女主播精品视频一二三四| 欧美国产第一页| 亚洲尤物视频网| 久久九九99| 亚洲欧美日韩精品久久亚洲区| 狂野欧美一区| 欧美一激情一区二区三区| 欧美国产三区| 久久国产欧美精品| 欧美激情一区二区三区成人 | 亚洲人精品午夜在线观看| 一区二区毛片| 亚洲第一黄网| 欧美中日韩免费视频| 中文在线一区| 男人的天堂亚洲在线| 久久国产直播| 国产精品美女www爽爽爽| 亚洲国产成人久久综合一区| 在线观看日产精品| 欧美一区=区| 亚洲一区亚洲二区| 欧美激情一区二区三区四区| 玖玖玖国产精品| 国产目拍亚洲精品99久久精品| 99re66热这里只有精品3直播| 亚洲黄色在线视频| 免费在线国产精品| 欧美本精品男人aⅴ天堂| 国内精品视频666| 久久国产精品网站| 久久免费的精品国产v∧| 国产麻豆日韩欧美久久| 99精品国产高清一区二区| 亚洲国产视频直播| 久久久久**毛片大全| 久久久噜噜噜久久| 国产一在线精品一区在线观看| 欧美怡红院视频一区二区三区| 久久国产精品久久久久久久久久| 国产欧美精品久久| 欧美在线视频免费观看| 久久久夜精品| 亚洲国产欧美一区二区三区同亚洲 | 日韩一级网站| 国产精品99久久久久久久久久久久| 欧美激情精品久久久久久| 欧美激情精品久久久久久免费印度| 在线观看免费视频综合| 亚洲成在人线av| 香蕉成人久久| 久久人人爽人人爽爽久久| 在线观看av不卡| 欧美va天堂| 这里只有精品视频| 欧美一区午夜视频在线观看| 国内精品免费午夜毛片| 欧美高清视频一二三区| 一区二区三区国产在线| 欧美一区二区三区在线观看| 国产欧美一区二区精品性色| 久久乐国产精品| 亚洲精品资源| 欧美专区第一页| 最新成人在线| 国产精品主播| 欧美/亚洲一区| 一区二区三区免费网站| 麻豆亚洲精品| 亚洲影视综合| 亚洲激情综合| 国产精品丝袜白浆摸在线| 久久亚洲午夜电影| 一二三区精品| 鲁鲁狠狠狠7777一区二区| 亚洲天堂av图片| 亚洲高清精品中出| 国产欧美一区二区精品性色| 欧美激情一区在线观看| 久久成人精品一区二区三区| 99视频精品在线| 男人的天堂亚洲| 午夜精品久久| 日韩视频在线免费观看| 韩国亚洲精品| 国产欧美日韩视频一区二区三区 | 在线日韩中文字幕| 欧美日韩中文另类| 久久久久久久久蜜桃| 99亚洲伊人久久精品影院红桃| 久久视频这里只有精品| 欧美一级网站| 亚洲免费在线观看| 中日韩男男gay无套|