




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、*(本文從從網(wǎng)上整整理得到到,源地地址 HYPERLINK /caimouse/archive/2008/09/07/2893806.aspx htttp:/t/caaimoousee/arrchiive/20008/009/007/2289338066.asspx)谷歌瀏覽覽器的源源碼分析析(1) HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit
2、=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes);saveit.focus(); o 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏隨著網(wǎng)絡(luò)絡(luò)技術(shù)的的發(fā)展,越越來越多多應(yīng)用都都已經(jīng)離離不開網(wǎng)網(wǎng)絡(luò),特特別像人人類大腦腦一樣的的知識(shí)庫庫的搜索索引擎,更更加是離離不開功功能強(qiáng)大大的云計(jì)計(jì)算。不不過,即即便云計(jì)計(jì)算非常常強(qiáng)
3、大,但但它還不不能直接接地把結(jié)結(jié)果呈現(xiàn)現(xiàn)給用戶戶,這樣樣就需要要一個(gè)客客戶端來來呈現(xiàn)出出來,這這個(gè)客戶戶端就是是瀏覽器器?,F(xiàn)在在越來越越多人上上網(wǎng),他他們每一一次上網(wǎng)網(wǎng),都離離不開瀏瀏覽的使使用,這這已經(jīng)是是一個(gè)不不可缺少少的軟件件了。這這里介紹紹和分析析谷歌推推出有創(chuàng)創(chuàng)新的瀏瀏覽器,它它的速度度比其它它瀏覽器器快很多多,那么么它是怎怎么實(shí)現(xiàn)現(xiàn)的呢?又采用用了什么么樣的技技術(shù)能達(dá)達(dá)到這樣樣呢?又又比如它它的標(biāo)簽簽頁是每每一個(gè)進(jìn)進(jìn)程進(jìn)行行顯示的的,這到到底又是是怎么樣樣實(shí)現(xiàn)的的呢?下下面來通通過分析析它的源源碼,一一一地解解開這種種高新技技術(shù)的使使用,以以及這種種高效算算法的奧奧秘。谷歌瀏覽覽器
4、的英英語名稱稱為Chhromme,它它的意義義是鉻。鉻是一一種有光光澤的、藍(lán)灰色色的堅(jiān)硬硬金屬元元素。不不失光澤澤,抗腐腐蝕,最最早在鉻鉻鐵礦中中發(fā)現(xiàn)。用作催催化劑,可可加強(qiáng)鋼鋼合金的的強(qiáng)度和和生產(chǎn)不不銹鋼,可可以做防防腐鍍層層和玻璃璃制品中中的顏料料。原子子序數(shù)224;原原子量551.9996;比重77.188;化合合價(jià)2,33,6。谷歌起起這個(gè)名名稱,可可能是想想讓這個(gè)個(gè)瀏覽器器永遠(yuǎn)不不失去光光澤,永永遠(yuǎn)那么么吸引人人。鉻是是無毒,化化學(xué)性質(zhì)質(zhì)很穩(wěn)定定,有延延展性,含含雜質(zhì)時(shí)時(shí)硬而脆脆。熔點(diǎn)點(diǎn)18557C,沸沸點(diǎn)26672CC,密度度單晶為為7.222克/厘米33,多晶晶為7.14克克/厘
5、米米3;鉻鉻,原子子序數(shù)224,原原子量551.999611。鉻的的名稱來來自希臘臘文Chhromma,意意為顏色色。因?yàn)闉檫@種元元素以多多種不同同顏色的的化合物物存在,故故被稱為為“多彩彩的元素素”。可可用于制制不銹鋼鋼,汽車車零件,工工具,磁磁帶和錄錄像帶等等。鉻鍍鍍?cè)诮饘賹偕峡梢砸苑冷P,也也叫可多多米,堅(jiān)堅(jiān)固美觀觀。紅、綠寶石石的色彩彩也來自自于鉻。作為現(xiàn)現(xiàn)代科技技中最重重要的金金屬,以以不同百百分比熔熔合的鉻鉻鎳鋼千千變?nèi)f化化,種類類繁多,令令人難以以置信。谷歌的開開發(fā)人員員稱,雖雖然網(wǎng)絡(luò)絡(luò)的發(fā)展展日新月月異,但但作為網(wǎng)網(wǎng)絡(luò)平臺(tái)臺(tái)的瀏覽覽器,卻卻沒有跟跟上網(wǎng)絡(luò)絡(luò)發(fā)展的的步伐。谷歌傾傾心
6、打造造的免費(fèi)費(fèi)瀏覽器器就是希希望能跟跟隨著網(wǎng)網(wǎng)絡(luò)的發(fā)發(fā)展而不不斷升級(jí)級(jí)換代,完完美的切切合網(wǎng)絡(luò)絡(luò)時(shí)代的的潮流。據(jù)了解,谷谷歌員工工每天使使用的最最多的應(yīng)應(yīng)用程序序就是瀏瀏覽器,通通過瀏覽覽器,查查看新聞聞資訊,觀觀看視頻頻聊天,玩玩網(wǎng)絡(luò)游游戲。谷谷歌的員員工說,如如果能夠夠開發(fā)出出一種全全新的瀏瀏覽器,才才能夠滿滿足人們們使用應(yīng)應(yīng)用程序序和網(wǎng)站站管理員員的要求求。谷歌歌希望能能夠提供供一種速速度更快快,穩(wěn)定定性更高高,安全全性更強(qiáng)強(qiáng)的瀏覽覽器。因因此Goooglle CChroome誕誕生了!為了學(xué)習(xí)習(xí)這個(gè)瀏瀏覽器,需需要通過過網(wǎng)絡(luò)把把這份達(dá)達(dá)到1GG以上的的代碼下下載下來來,需要要的時(shí)間間就
7、需要要好幾個(gè)個(gè)小時(shí),然然后再把把硬盤空空間清空空為100G左右右大小,最最后配置置好VCC 20005,就就可以編編譯這個(gè)個(gè)“可多多米”了了。在我我的電腦腦上編譯譯,共需需要兩個(gè)個(gè)小時(shí)左左右,才才完全編編譯完成成,最后后生成下下面的可可多米,如如下圖:缺省編譯譯出來的的可多米米是英語語版本的的,從關(guān)關(guān)于對(duì)話話框里就就可以看看到。下下面是編編譯出來來的目錄錄圖片,如如下:上面是調(diào)調(diào)試版本本的輸出出文件,所所以程序序大小都都比較大大,沒有有經(jīng)過優(yōu)優(yōu)化的處處理。整整個(gè)程序序的大小小,需要要編譯1137個(gè)個(gè)工程,共共1G多多的源碼碼大小,這這是一個(gè)個(gè)非常旁旁大的一一個(gè)工程程。谷歌瀏瀏覽器的的源碼分分析
8、(22) HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,s
9、tatus=no,resizable=yes);saveit.focus(); o 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏這么大的的工程,我我從哪里里開始呢呢?我認(rèn)認(rèn)為從界界面開始始,這樣樣才可以以快速地地深入研研究。下下面就可可以先嘗嘗試修改改一個(gè)cchroome的的關(guān)于對(duì)對(duì)話框,上上一次看看到它是是英語的的,那么么我就來來把它改改成中文文的吧,這這樣有目目標(biāo)了。從chhromme的工工程里可可以看到到它是支支持多種種語言的的,在WWinddowss平臺(tái)上上支持多多語言的的標(biāo)準(zhǔn)做做法,就就是寫多多個(gè)語言言的DLLL。因因此,cchroome也也不例外外,從aapp工工程集里里,就可可以看到
10、到如下圖圖所示:上面顯示示了多種種語言的的動(dòng)態(tài)連連接庫資資源,其其中zhh-CNN是簡(jiǎn)體體中文的的。接著打開開資源文文件的字字符串編編輯,如如下圖:把上面的的字符串串修改為為 “關(guān)關(guān)于 可可多米”,然然后把這這個(gè)工程程重新編編譯一下下,就會(huì)會(huì)生成下下面的文文件:然后運(yùn)行行自己編編譯的可可多米,就就會(huì)顯示示出修改改的成果果,如下下圖:可以看到到關(guān)于對(duì)對(duì)話框的的標(biāo)題,就就變成我我上面修修改的了了。這樣樣學(xué)習(xí)它它的修改改,就是是幾分鐘鐘的事情情,哈哈哈這樣就學(xué)學(xué)習(xí)了可可多米開開發(fā)漢化化的工作作,這是是本地化化的重要要做的一一件事情情,也學(xué)學(xué)習(xí)到怎怎么樣支支持多語語言的實(shí)實(shí)現(xiàn)方式式。那么么它的關(guān)關(guān)于對(duì)
11、話話框是從從那里顯顯示出來來的呢?怎么樣樣把字符符串更新新到上面面的呢?下一次次再告訴訴你。 谷歌歌瀏覽器器的源碼碼分析(3) HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t)
12、,saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes);saveit.focus(); o 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏前面修改改了chhromme關(guān)于于對(duì)話框框,并且且編譯顯顯示出來來了,那那么它是是在那里里調(diào)用顯顯示的呢呢?現(xiàn)在在就帶你你去了解解它。由由于它是是界面顯顯示,那那么不用用想,直直接到界界面的工工程里查查找它,也也就是到到目錄ssrcchrromeebrrowsservieews里里查看到到文件aabouut_cchroome_vieew.ccc。這個(gè)文件件
13、里聲明明了一個(gè)個(gè)類AbbouttChrromeeVieew,它它就是主主要負(fù)責(zé)責(zé)初始化化對(duì)話框框、布局局、顯示示字符串串等等,比比如顯示示“關(guān)于于可樂米米”的字字符串,就就是這樣樣實(shí)現(xiàn)的的,先調(diào)調(diào)用函數(shù)數(shù):#0011stdd:wwstrringg AbbouttChrromeeVieew:GettWinndowwTittle() cconsst reeturrn ll10nn_uttil:GeetSttrinng(IIDS_ABOOUT_CHRROMEE_TIITLEE);獲取資源源里的對(duì)對(duì)話框標(biāo)標(biāo)題,接接著:在上面的的斷點(diǎn)里里就是響響應(yīng)菜單單,然后后創(chuàng)建關(guān)關(guān)于對(duì)話話框,主主要調(diào)用用函數(shù)CCr
14、eaateCChroomeWWinddow來來創(chuàng)建窗窗口,把把AbooutCChroomeVVieww窗口綁綁定到這這個(gè)窗口口類型里里。由于于可多米米都是統(tǒng)統(tǒng)一的窗窗口樣式式,那么么它是通通過創(chuàng)建建一樣的的窗口類類CusstommFraameWWinddow來來實(shí)現(xiàn)的的。為了顯示示窗口的的標(biāo)題,是是通過下下面的函函數(shù)關(guān)系系調(diào)用:1Broowseer:ExeecutteCoommaand瀏覽器器執(zhí)行菜菜單命令令。2ChrromeeVieews:Wiindoow:CreeateeChrromeeWinndoww創(chuàng)建窗窗口。3ChrromeeVieews:CuustoomFrrameeWinndow
15、w:IInitt初始化化窗口。4ChrromeeVieews:Wiindoow:Iniit初始化化窗口標(biāo)標(biāo)題。5AbooutCChroomeVVieww:GGetWWinddowTTitlle從關(guān)于于對(duì)話框框獲取標(biāo)標(biāo)題。理解上面面的函數(shù)數(shù)關(guān)系調(diào)調(diào)用就知知道怎么么樣顯示示標(biāo)題了了,因此此也知道道關(guān)于對(duì)對(duì)話框所所有內(nèi)容容是由類類AbooutCChroomeVVieww來管理理的,但但窗口的的樣式是是由CuustoomFrrameeWinndoww類來管管理的。通過上面面的分析析,了解解了關(guān)于于對(duì)話框框的標(biāo)題題顯示過過程,你你想修改改成什么么樣的內(nèi)內(nèi)容,就就要看你你的需要要了。下下一次再再仔細(xì)地地分
16、析有有關(guān)于對(duì)對(duì)話框怎怎么樣組組織其它它信息,比比如重要要的升級(jí)級(jí)功能。谷歌瀏瀏覽器的的源碼分分析(44) HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t),saveit,scr
17、ollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes);saveit.focus(); o 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏關(guān)于對(duì)話話框,主主要實(shí)現(xiàn)現(xiàn)了讓用用戶查看看當(dāng)前軟軟件的版版本、軟軟件信息息和檢查查升級(jí)的的功能。因此這這個(gè)類主主要繼續(xù)續(xù)ChrromeeVieews:Viiew類類、ChhrommeViiewss:DDiallogDDeleegatte和GooogleeUpddateeStaatussLisstenner。其中CChroomeVViewws:Vieew實(shí)現(xiàn)現(xiàn)窗口的的布局和和顯示
18、問問題,CChroomeVViewws:DiaaloggDellegaate實(shí)實(shí)現(xiàn)了事事件響應(yīng)應(yīng),或者者窗口某某時(shí)是否否可以顯顯示按鈕鈕的問題題,GoooglleUppdatteSttatuusLiisteenerr是用來來實(shí)現(xiàn)接接收更新新程序狀狀態(tài)信息息。這個(gè)類的的聲明如如下:classs AAbouutChhrommeViiew : ppubllic ChrromeeVieews:Viiew,ppubllic ChrromeeVieews:DiialoogDeeleggatee,ppubllic GooogleeUpddateeStaatussLisstenner pubblicc:exx
19、pliicitt AbbouttChrromeeVieew(PProffilee* pproffilee);viirtuual AbbouttChrromeeVieew();/ Innitiialiize thee coontrrolss onn thhe ddiallog.vooid Iniit();/ Ovverrriddden froom CChroomeVViewws:Vieew:viirtuual voiid GGetPPrefferrredSSizee(CSSizee *oout);viirtuual voiid LLayoout();viirtuual voiid VViewwH
20、ieerarrchyyChaangeed(bbooll iss_addd,CChroomeVViewws:Vieew* parrentt,CChroomeVViewws:Vieew* chiild);/ Ovverrriddden froom CChroomeVViewws:DiaaloggDellegaate:viirtuual intt GeetDiialoogBuuttoons() cconsst;viirtuual stdd:wwstrringg GeetDiialoogBuuttoonLaabell(DiialoogBuuttoon bbuttton) coonstt;viirtuu
21、al boool IIsDiialoogBuuttoonEnnablled(DiaaloggButttonn buuttoon) connst;viirtuual boool IIsDiialoogBuuttoonViisibble(DiaaloggButttonn buuttoon) connst;viirtuual boool CCanRResiize() cconsst;viirtuual boool CCanMMaxiimizze() coonstt;viirtuual boool IIsAllwayysOnnTopp() connst;viirtuual boool HHasAAlw
22、aaysOOnToopMeenu() cconsst;viirtuual boool IIsMoodall() connst;viirtuual stdd:wwstrringg GeetWiindoowTiitlee() connst;viirtuual boool AAcceept();viirtuual ChrromeeVieews:Viiew* GeetCoonteentssVieew();/ Ovverrriddden froom GGooggleUUpdaateSStattusLListteneer:viirtuual voiid OOnReeporrtReesullts(Gooog
23、leeUpddateeUpggraddeReesullt rresuult,GooogleeUpddateeErrrorCCodee errrorr_coode,connst stdd:wwstrringg& vverssionn);priivatte:/ Thhe vvisiiblee sttatee off thhe CChecck FFor Upddatees bbuttton.ennum CheeckBButttonSStattus CHEECKBBUTTTON_HIDDDENN = 0,CHEECKBBUTTTON_DISSABLLED,CHEECKBBUTTTON_ENAABLEE
24、D,;/ Uppdatte tthe UI to shoow tthe staatuss off thhe uupgrradee.vooid UpddateeStaatuss(GoooglleUppdatteUppgraadeRResuult ressultt,GoooglleUppdatteErrrorrCodde eerroor_ccodee);Prrofiile* prrofiile_;/ UII ellemeentss onn thhe ddiallog.ChhrommeViiewss:IImaggeViiew* abboutt_dllg_bbackkgrooundd_;Chhromm
25、eViiewss:LLabeel* aboout_tittle_labbel_;ChhrommeViiewss:TTexttFieeld* veersiion_labbel_;ChhrommeViiewss:TTexttFieeld* maain_texxt_llabeel_;/ UII ellemeentss wee addd tto tthe parrentt viiew.sccopeed_pptr tthroobbeer_;ChhrommeViiewss:IImaggeViiew succcesss_iindiicattor_;ChhrommeViiewss:IImaggeViiew u
26、pddatee_avvaillablle_iindiicattor_;ChhrommeViiewss:IImaggeViiew timmeouut_iindiicattor_;ChhrommeViiewss:LLabeel uupdaate_labbel_;/ Keeepss trrackk off thhe vvisiiblee sttatee off thhe CChecck FFor Upddatees bbuttton.ChheckkButttonnStaatuss chheckk_buuttoon_sstattus_;/ Thhe cclasss tthatt coommuunicc
27、atees wwithh Goooglle UUpdaate to finnd oout if an upddatee iss/ avvaillablle aand askks iit tto sstarrt aan uupgrradee.GoooglleUppdatte* goooglee_uppdatter_;/ Ouur ccurrrentt veersiion.sttd:wsttrinng ccurrrentt_veersiion_;/ Thhe vverssionn Goooglle UUpdaate repportts iis aavaiilabble to us.sttd:wst
28、trinng nnew_verrsioon_aavaiilabble_;DIISALLLOWW_EVVIL_CONNSTRRUCTTORSS(AbbouttChrromeeVieew);通過關(guān)于于對(duì)話框框的分析析,可以以理解到到chrromee瀏覽器器窗口基基本組成成,以及及窗口繼繼承關(guān)系系,還有有事件的的響應(yīng)方方式。前前面三次次分析,主主要是入入門的分分析,也也是了解解這么一一個(gè)大工工程的一一種手段段。比如如測(cè)試整整個(gè)工程程是否可可以編譯譯,是否否可以修修改代碼碼等等。后面的的分析會(huì)會(huì)以瀏覽覽器輸入入HTTTP連接接開始,直直到打開開網(wǎng)頁顯顯示為一一個(gè)主線線,做一一個(gè)基本本的分析析。谷歌瀏覽
29、覽器的源源碼分析析(5) HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,
30、top=20,status=no,resizable=yes);saveit.focus(); o 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏當(dāng)用戶打打開瀏覽覽器之后后,最希希望輸入入的地方方,是瀏瀏覽器的的連接框框。目前前谷歌瀏瀏覽器把把輸入連連接框與與搜索引引擎輸入入合并到到一起,可可以說完完美的組組合,讓讓界面更更加簡(jiǎn)潔潔,方便便實(shí)用,并并且它自自動(dòng)完成成的功能能更加強(qiáng)強(qiáng)勁,如如下圖所所示:上面輸入入了 HYPERLINK http:/www.c/ wwww.cc時(shí),它它就會(huì)自自動(dòng)地在在后面添添加智能能選擇的的連接,并并且可以以GOOOGLEE里搜索索輸入的的內(nèi)容,又又如下面面:上面在輸輸
31、入框里里輸入我我的名字字,就會(huì)會(huì)自動(dòng)彈彈出查找找的內(nèi)容容,或者者可能搜搜索的連連接。這這些功能能都比較較完美的的實(shí)現(xiàn),這這可以說說是史無無前例的的輸入創(chuàng)創(chuàng)新,真真正人性性化的體體現(xiàn),那那么它又又是怎么么樣實(shí)現(xiàn)現(xiàn)的呢?其主要要功能是是在文件件srccchhrommebbrowwserrauutoccomppletteaautoocommpleete_ediit.ccc里實(shí)實(shí)現(xiàn),具具體的實(shí)實(shí)現(xiàn)方式式內(nèi)容等等下一次次再去分分析。谷歌瀏瀏覽器的的源碼分分析(66) HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None
32、?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes);saveit.focus(); o 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏前面已經(jīng)經(jīng)介紹了了這么引
33、引人的輸輸入自動(dòng)動(dòng)完成功功能,并并且可以以在輸入入超級(jí)連連接框里里直接通通過GOOOGLLE搜索索所有的的內(nèi)容,這這是比較較大的創(chuàng)創(chuàng)新,不不但可以以節(jié)省界界面的占占用面積積,還很很方便大大家查詢?cè)兊男枰?,比如如記不住住的連接接,根本本不需要要去記了了,只要要你記住住需要的的內(nèi)容就就行了。這樣既既不需要要到什么么門戶網(wǎng)網(wǎng)站去找找連接,也也不需要要去記住住眾多的的網(wǎng)站,這這個(gè)功能能是非常常方便的的。這個(gè)輸入入框的自自動(dòng)完成成的功能能,是比比較智能能化的。因?yàn)樗鼤?huì)根據(jù)據(jù)以往的的輸入自自動(dòng)完成成,或者者智能提提示所需需要的連連接或者者內(nèi)容。下面就來來先看這這個(gè)類的的定義:#0011/ Proovi
34、ddes thee immpleemenntattionn off ann eddit conntrool wwithh a droop-ddownn#0022/ auttocoomplletee boox. Thee boox iitseelf is impplemmentted in auttocoomplletee_poopupp.ccc#0033/ Thiis ffilee immpleemennts thee eddit boxx annd mmanaagemmentt foor tthe poppup.#0044/#0055/ Thiis iimpllemeentaatioon i
35、is ccurrrenttly appproppriaate forr thhe UURL barr, wwherre tthe#0066/ auttocoomplletee drropddownn iss allwayys ddispplayyed beccausse ttherre iis aalwaays a#0077/ deffaullt iitemm. FFor webb paage auttofiill andd ottherr apppliicattionns, thiis iis#0088/ proobabbly nott appproopriiatee. WWe mmay w
36、annt tto aadd a fflagg too deeterrminne wwhicch#0099/ of theese moddes were in.#0100claass AuttocoomplleteeEdiit#0111: ppubllic CWiindoowImmplAuttocoomplleteeEdiit,#0122CRiichEEdittCtrrl,#0133CWiinTrraitts ,#0155pubblicc CRRichhEdiitCoommaandss,#0166pubblicc Meenu:Deeleggatee 類AuttocoomplleteeEdiit繼
37、承承了類CCWinndowwImppl、類類CRiichEEdittCommmannds、類Meenu:Deeleggatee。其中中類CWWinddowIImpll實(shí)現(xiàn)了了Winndowws窗口口,它是是WTLL里的窗窗口模板板類,主主要用來來創(chuàng)建窗窗口界面面類,并并且使用用類CRRichhEdiitCttrl作作為基類類,類CCRicchEdditCCtrll主要調(diào)調(diào)用Wiindoows里里的編輯輯類。類類CRiichEEdittCommmannds實(shí)實(shí)現(xiàn)RiichEEditt的命令令功能。Mennu:Dellegaate類類是實(shí)現(xiàn)現(xiàn)智能下下拉式菜菜單的提提示界面面。因此此,要學(xué)學(xué)習(xí)開發(fā)發(fā)
38、chrromee,需要要先學(xué)習(xí)習(xí)WTLL的開發(fā)發(fā),它是是一套基基于模板板的窗口口框架。下一次次再仔細(xì)細(xì)地分析析自動(dòng)完完成的實(shí)實(shí)現(xiàn)過程程。谷歌瀏瀏覽器的的源碼分分析(77) HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.locati
39、on.href)+&c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes);saveit.focus(); o 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏當(dāng)我們鍵鍵入字母母或者文文字開始始時(shí),那那么類AAutoocommpleeteEEditt就會(huì)從從窗口消消息里獲獲取到相相應(yīng)的字字母或者者文字,然然后根據(jù)據(jù)輸入的的信息到到本地或或者網(wǎng)絡(luò)絡(luò)上保存存的信息息庫里查查找相應(yīng)應(yīng)的輸入入提示,這這就是自自動(dòng)完成成的實(shí)現(xiàn)現(xiàn)。下面面就來先先分析輸輸入的函函數(shù):#0011vvo
40、idd AuutoccomppletteEddit:OnnChaar(TTCHAAR cch, UINNT rrepeeat_couunt, UIINT flaags) #0022/ Doontt leet aalt-entter beeep.Noot ssuree thhis is neccesssaryy, aas tthe staandaard#0033/ allt-eenteer wwilll hiit DDisccarddWMSSysCCharr() andd geet tthroown awaay, andd#0044/ cttrl-altt-ennterr dooesnnt se
41、eem tto rreacch hheree foor ssomee reeasoon?Att leeastt noot oon#0055/ myy syysteem sstilll, thiis iis hharmmlesss aand mayybe neccesssaryy inn ottherr loocalles.下面把a(bǔ)alt-entter組組合鍵消消息過濾濾掉。#0066iff (cch = VVK_RRETUURN & (fllagss & KF_ALTTDOWWN)#0077retturnn;#0088#0099/ Esscappe iis pproccesssed in On
42、KKeyDDownn.Donnt lett anny WWM_CCHARR meessaagess prropaagatte#0100/ ass wee doontt waant thee RiichEEditt too doo annythhingg fuunkyy.下面把EESC鍵鍵的消息息過濾掉掉。#0111iff (cch = VVK_EESCAAPE & !(fflaggs & KFF_ALLTDOOWN)#0122retturnn;#0133下面把TTAB鍵鍵的消息息過濾掉掉。#0144iff (cch = VVK_TTAB) #0155/ Donnt addd taabs to
43、thee innputt.#0166retturnn;#0177#0188這里處理理其它有有用的按按鍵消息息。#0199HaandlleKeeysttrokke(GGetCCurrrenttMesssagge()-mmesssagee, cch, reppeatt_coountt, fflaggs);#0200AutoocommpleeteEEditt:OOnChhar函函數(shù)是WWTL里里的WMM_CHHAR消消息處理理,當(dāng)用用戶鍵入入字母時(shí)時(shí)就會(huì)觸觸發(fā)這個(gè)個(gè)消息。這個(gè)函函數(shù)先跳跳過幾個(gè)個(gè)不要處處理的消消息,最最后調(diào)用用函數(shù)HHanddleKKeysstrooke來來處理,如如下:#0011v
44、voidd AuutoccomppletteEddit:HaandlleKeeysttrokke(UUINTT meessaage, TCCHARR keey,#0022UUINTT reepeaat_ccounnt, UINNT fflaggs) 凍結(jié)RiichEEditt的更新新。#0033SccopeedFrreezze ffreeeze(thiis, GettTexxtObbjecctMoodell();處理消息息變化前前的動(dòng)作作。#0044OnnBefforeePosssibbleCChannge();處理消息息#0055DeefWiindoowPrroc(messsagge, ke
45、yy, MMAKEELPAARAMM(reepeaat_ccounnt, flaags);處理消息息變化后后的動(dòng)作作。#0066OnnAftterPPosssiblleChhangge();#0077在這里為為什么要要進(jìn)行窗窗口的消消息凍結(jié)結(jié)呢?又又為什么么需要進(jìn)進(jìn)行消息息處理和和消息變變化后處處理呢?谷歌瀏瀏覽器的的源碼分分析(88) HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelect
46、ion():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes);saveit.focus(); o 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏上一次說說到處理理WM_CHAAR消息息,當(dāng)用用戶每鍵鍵入一個(gè)個(gè)字符時(shí)時(shí),萬能能連接框框就會(huì)去去進(jìn)行一一次查找找的過程程,然后后把智能能提示信信息
47、顯示示出來。說到AAutoocommpleeteEEditt:HHanddleKKeysstrooke函函數(shù)的操操作,那那么它為為什么需需要凍結(jié)結(jié)這個(gè)函函數(shù)的使使用呢?現(xiàn)在就就來分析析這部份份的內(nèi)容容。如下下:ScoppedFFreeeze freeezee(thhis, GeetTeextOObjeectMModeel();在這行代代碼里,首首先會(huì)調(diào)調(diào)用函數(shù)數(shù)GettTexxtObbjecctMoodell()來來獲取一一個(gè)文檔檔ITeextDDocuumennt接口口,然后后再使用用它的功功能。這這個(gè)函數(shù)數(shù)的代碼碼如下:#0011IITexxtDoocummentt* AAutoocomm
48、pleeteEEditt:GGetTTexttObjjecttModdel() cconsst 先判斷這這個(gè)接口口是否獲獲取到,如如果已經(jīng)經(jīng)獲取到到就不再再去重復(fù)復(fù)獲取了了。#0022iff (!texxt_oobjeect_moddel_) #0033/ Thiis iis llaziily iniitiaalizzed, innsteead of beiing iniitiaalizzed in thee#0044/ connstrructtor, inn orrderr too avvoidd huurtiing staartuup pperfformmancce.這里使用用了智能能指針
49、來來獲取IIRicchEdditOOle接接口。#0055CCoomPttr olle_iinteerfaace;獲取到的的IRiichEEdittOlee接口綁綁定到智智能指針針里。#0066olee_innterrfacce.AAttaach(GettOleeIntterffacee();下面通過過=操作作符獲取取ITeextDDocuumennt接口口,如果果你深入入去分析析這個(gè)賦賦值操作作符,會(huì)會(huì)看到它它自動(dòng)去去調(diào)用IIRicchEdditOOle的的接口IIUnkknowwn:QueeryIInteerfaace來來查詢到到ITeextDDocuumennt接口口,這個(gè)個(gè)過程對(duì)對(duì)于程
50、序序員來說說是完全全不用關(guān)關(guān)心的,這這就是使使用muutabble CCoomQIIPtrr teext_objjectt_moodell_定義義的作用用。#0077texxt_oobjeect_moddel_ = olee_innterrfacce;#0088#0099reeturrn ttextt_obbjecct_mmodeel_;#0100通過上面面的分析析,可見見使用CCCommQIPPtr智智能指針針可以省省了很多多COMM調(diào)用的的操作,這這真是模模板類的的強(qiáng)大功功能的使使用之處處。當(dāng)把把ITeextDDocuumennt接口口獲取回回來之后后,對(duì)于于RicchEddit操操作就可
51、可以輕松松訪問了了,SccopeedFrreezze類生生成一個(gè)個(gè)局部對(duì)對(duì)象,這這個(gè)對(duì)象象實(shí)現(xiàn)了了對(duì)RiichEEditt自動(dòng)凍凍結(jié)和解解凍結(jié)的的功能,這這個(gè)過程程是通過過局部對(duì)對(duì)象在棧棧里生命命周期的的特性應(yīng)應(yīng)用。如如下面的的代碼:#0011AAutoocommpleeteEEditt:SScoppedFFreeeze:SccopeedFrreezze(AAutoocommpleeteEEditt* eeditt,#0022IITexxtDoocummentt* ttextt_obbjecct_mmodeel)#0033: eeditt_(eeditt),#0044ttextt_obbjec
52、ct_mmodeel_(texxt_oobjeect_moddel) #0055/ Frreezze tthe scrreenn.#0066iff (ttextt_obbjecct_mmodeel_) #0077lonng ccounnt;#0088texxt_oobjeect_moddel_-FFreeeze(&coountt);#0099#0100#0111#0122AAutoocommpleeteEEditt:SScoppedFFreeeze:SScoppedFFreeeze() #0133/ Unnfreeezee thhe sscreeen.#0144/ NOOTE: Iff thh
53、is desstruuctoor iis rreacchedd whhilee thhe eeditt iss beeingg deestrroyeed (forr#0155/ exxampple, beecauuse we douublee-cllickked thee eddit of a ppopuup aand cauusedd itt too#0166/ trranssforrm tto aan uuncoonsttraiinedd wiindoow), itt wiill no lonngerr haave an HWNND, andd#0177/ teext_objjectt_m
54、oodell_ mmay poiint to a ddesttroyyed objjectt, sso ddo nnothhingg heere.#0188iff (eeditt_-IsWWinddow() & ttextt_obbjecct_mmodeel_) #0199lonng ccounnt;#0200texxt_oobjeect_moddel_-UUnfrreezze(&couunt);#0211if (coountt = 0) 這里需要要手動(dòng)地地更新窗窗口的顯顯示。#0222/ WWe nneedd too UppdatteWiindoow() heere inssteaad oo
55、f IInvaaliddateeRecct() beecauuse, ass#0233/ ffar as I ccan telll, thee eddit likkes to synnchrronoouslly eerasse iits bacckgrrounnd#0244/ wwhenn unnfreeeziing, thhus reqquirringg uss too syynchhronnoussly reddraww iff wee doontt#0255/ wwantt fllickker.#0266eeditt_-UpddateeWinndoww();#0277#0288#0299
56、從上面的的代碼可可以看到到構(gòu)造函函數(shù)里凍凍結(jié),析析構(gòu)造函函數(shù)里解解凍結(jié),如如果需要要就會(huì)自自動(dòng)更新新窗口的的顯示。通過上面面的分析析,學(xué)會(huì)會(huì)使用RRichhEdiit的凍凍結(jié)窗口口的輸入入,并且且解凍結(jié)結(jié)和更新新窗口的的顯示,也也同時(shí)學(xué)學(xué)會(huì)使用用智能指指針來操操作COOM接口口的方便便性,最最后還學(xué)學(xué)會(huì)了使使用棧對(duì)對(duì)象的生生命周期期來方便便對(duì)加鎖鎖和解鎖鎖的操作作,以便便降低代代碼的出出錯(cuò)率。谷歌瀏覽覽器的源源碼分析析(9) HYPERLINK javascript:d=document;t=d.selection?(d.selection.type!=None?d.selection.cre
57、ateRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes);saveit.focus(); o 收藏到我的網(wǎng)摘中,并分享給我的朋友 收藏為了處理理字符消消息實(shí)現(xiàn)現(xiàn)自動(dòng)完完成的功功能,這這是怎么
58、么樣實(shí)現(xiàn)現(xiàn)的呢?其實(shí)是是先記錄錄字符消消息響應(yīng)應(yīng)前的字字符串以以及選中中狀態(tài),接接著再處處理消息息,最后后才查詢?cè)兛赡艿牡妮斎?,做做出智能能提示?0011vvoidd AuutoccomppletteEddit:OnnBefforeePosssibbleCChannge() #0022/ Reecorrd oour staate.記錄當(dāng)前前已經(jīng)輸輸入的字字符串。#0033teext_befforee_chhangge_ = GGetTTextt();記錄當(dāng)前前選中的的字符位位置。#0044GeetSeelecctioon(ssel_befforee_chhangge_);#0055seele
59、cct_aall_befforee_chhangge_ = IIsSeelecctAlll(ssel_befforee_chhangge_);#0066上面就保保存字符符消息響響應(yīng)前的的狀態(tài),接接著下來來就是消消息響應(yīng)應(yīng)后的處處理了,如如下:#0011bbooll AuutoccomppletteEddit:OnnAftterPPosssiblleChhangge() #0022/ Prreveent thee usser froom sseleectiing thee pphanntomm neewliine att thhe eend of thee#0033/ eddit.IIf tth
60、eyy trry, we jusst ssileentlly mmovee thhe eend of thee seelecctioon bbackk too#0044/ thhe eend of thee reeal texxt.判斷用戶戶新選中中狀態(tài)。#0055CHHARRRANGGE nnew_sell;#0066GeetSeelecctioon(nnew_sell);#0077coonstt innt llenggth = GGetTTexttLenngthh();#0088iff (neww_seel.ccpMiin leengtth) | (neew_ssel.cpMMax lle
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年消防設(shè)施操作員之消防設(shè)備基礎(chǔ)知識(shí)押題練習(xí)試題A卷含答案
- 小學(xué)重點(diǎn)考試試題及答案
- AI智慧城市建設(shè)與城市管理優(yōu)化研究
- 辦公系統(tǒng)使用簡(jiǎn)明教程與操作手冊(cè)
- 個(gè)人辦公用品采購(gòu)合同規(guī)范
- 現(xiàn)代物理學(xué)理論前沿探討閱讀題集
- 數(shù)字化圖書館建設(shè)協(xié)議
- 中醫(yī)藥兒童知識(shí)培訓(xùn)課件
- 馬匹買賣合同
- 物理光學(xué)及量子力學(xué)考點(diǎn)復(fù)習(xí)題集
- 結(jié)直腸癌免疫治療
- 電力計(jì)量人員培訓(xùn)課件
- 富氫水完整課件
- 國(guó)家臨床版3.0手術(shù)操作編碼(ICD-9-CM3)
- JGT454-2014 建筑門窗、幕墻中空玻璃性能現(xiàn)場(chǎng)檢測(cè)方法
- A320飛機(jī)空調(diào)系統(tǒng)非正常操作A要點(diǎn)分析
- 我的家鄉(xiāng)湖北襄陽介紹
- 邏輯判斷課件
- 社會(huì)心理學(xué):社會(huì)心理學(xué)的研究方法完整版
- 預(yù)防住院患者跌倒墜床的防范措施及宣教
- 地坪漆施工合同地坪漆施工合同范本
評(píng)論
0/150
提交評(píng)論