人力资源google chrome 源代码 分析_第1页
人力资源google chrome 源代码 分析_第2页
人力资源google chrome 源代码 分析_第3页
人力资源google chrome 源代码 分析_第4页
人力资源google chrome 源代码 分析_第5页
已阅读5页,还剩131页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、*(本文从从网上整整理得到到,源地地址 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 收藏到我的网摘中,并分享给我的朋友 收藏随着网络络技术的的发展,越越来越多多应用都都已经离离不开网网络,特特别像人人类大脑脑一样的的知识库库的搜索索引擎,更更加是离离不开功功能强大大的云计计算。不不过,即即便云计计算非常常强

3、大,但但它还不不能直接接地把结结果呈现现给用户户,这样样就需要要一个客客户端来来呈现出出来,这这个客户户端就是是浏览器器。现在在越来越越多人上上网,他他们每一一次上网网,都离离不开浏浏览的使使用,这这已经是是一个不不可缺少少的软件件了。这这里介绍绍和分析析谷歌推推出有创创新的浏浏览器,它它的速度度比其它它浏览器器快很多多,那么么它是怎怎么实现现的呢?又采用用了什么么样的技技术能达达到这样样呢?又又比如它它的标签签页是每每一个进进程进行行显示的的,这到到底又是是怎么样样实现的的呢?下下面来通通过分析析它的源源码,一一一地解解开这种种高新技技术的使使用,以以及这种种高效算算法的奥奥秘。谷歌浏览览器

4、的英英语名称称为Chhromme,它它的意义义是铬。铬是一一种有光光泽的、蓝灰色色的坚硬硬金属元元素。不不失光泽泽,抗腐腐蚀,最最早在铬铬铁矿中中发现。用作催催化剂,可可加强钢钢合金的的强度和和生产不不锈钢,可可以做防防腐镀层层和玻璃璃制品中中的颜料料。原子子序数224;原原子量551.9996;比重77.188;化合合价2,33,6。谷歌起起这个名名称,可可能是想想让这个个浏览器器永远不不失去光光泽,永永远那么么吸引人人。铬是是无毒,化化学性质质很稳定定,有延延展性,含含杂质时时硬而脆脆。熔点点18557C,沸沸点26672CC,密度度单晶为为7.222克/厘米33,多晶晶为7.14克克/厘

5、米米3;铬铬,原子子序数224,原原子量551.999611。铬的的名称来来自希腊腊文Chhromma,意意为颜色色。因为为这种元元素以多多种不同同颜色的的化合物物存在,故故被称为为“多彩彩的元素素”。可可用于制制不锈钢钢,汽车车零件,工工具,磁磁带和录录像带等等。铬镀镀在金属属上可以以防锈,也也叫可多多米,坚坚固美观观。红、绿宝石石的色彩彩也来自自于铬。作为现现代科技技中最重重要的金金属,以以不同百百分比熔熔合的铬铬镍钢千千变万化化,种类类繁多,令令人难以以置信。谷歌的开开发人员员称,虽虽然网络络的发展展日新月月异,但但作为网网络平台台的浏览览器,却却没有跟跟上网络络发展的的步伐。谷歌倾倾心

6、打造造的免费费浏览器器就是希希望能跟跟随着网网络的发发展而不不断升级级换代,完完美的切切合网络络时代的的潮流。据了解,谷谷歌员工工每天使使用的最最多的应应用程序序就是浏浏览器,通通过浏览览器,查查看新闻闻资讯,观观看视频频聊天,玩玩网络游游戏。谷谷歌的员员工说,如如果能够够开发出出一种全全新的浏浏览器,才才能够满满足人们们使用应应用程序序和网站站管理员员的要求求。谷歌歌希望能能够提供供一种速速度更快快,稳定定性更高高,安全全性更强强的浏览览器。因因此Goooglle CChroome诞诞生了!为了学习习这个浏浏览器,需需要通过过网络把把这份达达到1GG以上的的代码下下载下来来,需要要的时间间就

7、需要要好几个个小时,然然后再把把硬盘空空间清空空为100G左右右大小,最最后配置置好VCC 20005,就就可以编编译这个个“可多多米”了了。在我我的电脑脑上编译译,共需需要两个个小时左左右,才才完全编编译完成成,最后后生成下下面的可可多米,如如下图:缺省编译译出来的的可多米米是英语语版本的的,从关关于对话话框里就就可以看看到。下下面是编编译出来来的目录录图片,如如下:上面是调调试版本本的输出出文件,所所以程序序大小都都比较大大,没有有经过优优化的处处理。整整个程序序的大小小,需要要编译1137个个工程,共共1G多多的源码码大小,这这是一个个非常旁旁大的一一个工程程。谷歌浏浏览器的的源码分分析

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 收藏到我的网摘中,并分享给我的朋友 收藏这么大的的工程,我我从哪里里开始呢呢?我认认为从界界面开始始,这样样才可以以快速地地深入研研究。下下面就可可以先尝尝试修改改一个cchroome的的关于对对话框,上上一次看看到它是是英语的的,那么么我就来来把它改改成中文文的吧,这这样有目目标了。从chhromme的工工程里可可以看到到它是支支持多种种语言的的,在WWinddowss平台上上支持多多语言的的标准做做法,就就是写多多个语言言的DLLL。因因此,cchroome也也不例外外,从aapp工工程集里里,就可可以看到

10、到如下图图所示:上面显示示了多种种语言的的动态连连接库资资源,其其中zhh-CNN是简体体中文的的。接着打开开资源文文件的字字符串编编辑,如如下图:把上面的的字符串串修改为为 “关关于 可可多米”,然然后把这这个工程程重新编编译一下下,就会会生成下下面的文文件:然后运行行自己编编译的可可多米,就就会显示示出修改改的成果果,如下下图:可以看到到关于对对话框的的标题,就就变成我我上面修修改的了了。这样样学习它它的修改改,就是是几分钟钟的事情情,哈哈哈这样就学学习了可可多米开开发汉化化的工作作,这是是本地化化的重要要做的一一件事情情,也学学习到怎怎么样支支持多语语言的实实现方式式。那么么它的关关于对

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 收藏到我的网摘中,并分享给我的朋友 收藏前面修改改了chhromme关于于对话框框,并且且编译显显示出来来了,那那么它是是在那里里调用显显示的呢呢?现在在就带你你去了解解它。由由于它是是界面显显示,那那么不用用想,直直接到界界面的工工程里查查找它,也也就是到到目录ssrcchrromeebrrowsservieews里里查看到到文件aabouut_cchroome_vieew.ccc。这个文件件

13、里声明明了一个个类AbbouttChrromeeVieew,它它就是主主要负责责初始化化对话框框、布局局、显示示字符串串等等,比比如显示示“关于于可乐米米”的字字符串,就就是这样样实现的的,先调调用函数数:#0011stdd:wwstrringg AbbouttChrromeeVieew:GettWinndowwTittle() cconsst reeturrn ll10nn_uttil:GeetSttrinng(IIDS_ABOOUT_CHRROMEE_TIITLEE);获取资源源里的对对话框标标题,接接着:在上面的的断点里里就是响响应菜单单,然后后创建关关于对话话框,主主要调用用函数CCr

14、eaateCChroomeWWinddow来来创建窗窗口,把把AbooutCChroomeVVieww窗口绑绑定到这这个窗口口类型里里。由于于可多米米都是统统一的窗窗口样式式,那么么它是通通过创建建一样的的窗口类类CusstommFraameWWinddow来来实现的的。为了显示示窗口的的标题,是是通过下下面的函函数关系系调用:1Broowseer:ExeecutteCoommaand浏览器器执行菜菜单命令令。2ChrromeeVieews:Wiindoow:CreeateeChrromeeWinndoww创建窗窗口。3ChrromeeVieews:CuustoomFrrameeWinndow

15、w:IInitt初始化化窗口。4ChrromeeVieews:Wiindoow:Iniit初始化化窗口标标题。5AbooutCChroomeVVieww:GGetWWinddowTTitlle从关于于对话框框获取标标题。理解上面面的函数数关系调调用就知知道怎么么样显示示标题了了,因此此也知道道关于对对话框所所有内容容是由类类AbooutCChroomeVVieww来管理理的,但但窗口的的样式是是由CuustoomFrrameeWinndoww类来管管理的。通过上面面的分析析,了解解了关于于对话框框的标题题显示过过程,你你想修改改成什么么样的内内容,就就要看你你的需要要了。下下一次再再仔细地地分

16、析有有关于对对话框怎怎么样组组织其它它信息,比比如重要要的升级级功能。谷歌浏浏览器的的源码分分析(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 收藏到我的网摘中,并分享给我的朋友 收藏关于对话话框,主主要实现现了让用用户查看看当前软软件的版版本、软软件信息息和检查查升级的的功能。因此这这个类主主要继续续ChrromeeVieews:Viiew类类、ChhrommeViiewss:DDiallogDDeleegatte和GooogleeUpddateeStaatussLisstenner。其中CChroomeVViewws:Vieew实现现窗口的的布局和和显示

18、问问题,CChroomeVViewws:DiaaloggDellegaate实实现了事事件响应应,或者者窗口某某时是否否可以显显示按钮钮的问题题,GoooglleUppdatteSttatuusLiisteenerr是用来来实现接接收更新新程序状状态信息息。这个类的的声明如如下: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);通过关于于对话框框的分析析,可以以理解到到chrromee浏览器器窗口基基本组成成,以及及窗口继继承关系系,还有有事件的的响应方方式。前前面三次次分析,主主要是入入门的分分析,也也是了解解这么一一个大工工程的一一种手段段。比如如测试整整个工程程是否可可以编译译,是否否可以修修改代码码等等。后面的的分析会会以浏览览器输入入HTTTP连接接开始,直直到打开开网页显显示为一一个主线线,做一一个基本本的分析析。谷歌浏览

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 收藏到我的网摘中,并分享给我的朋友 收藏当用户打打开浏览览器之后后,最希希望输入入的地方方,是浏浏览器的的连接框框。目前前谷歌浏浏览器把把输入连连接框与与搜索引引擎输入入合并到到一起,可可以说完完美的组组合,让让界面更更加简洁洁,方便便实用,并并且它自自动完成成的功能能更加强强劲,如如下图所所示:上面输入入了 HYPERLINK http:/www.c/ wwww.cc时,它它就会自自动地在在后面添添加智能能选择的的连接,并并且可以以GOOOGLEE里搜索索输入的的内容,又又如下面面:上面在输输

31、入框里里输入我我的名字字,就会会自动弹弹出查找找的内容容,或者者可能搜搜索的连连接。这这些功能能都比较较完美的的实现,这这可以说说是史无无前例的的输入创创新,真真正人性性化的体体现,那那么它又又是怎么么样实现现的呢?其主要要功能是是在文件件srccchhrommebbrowwserrauutoccomppletteaautoocommpleete_ediit.ccc里实实现,具具体的实实现方式式内容等等下一次次再去分分析。谷歌浏浏览器的的源码分分析(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 收藏到我的网摘中,并分享给我的朋友 收藏前面已经经介绍了了这么引

33、引人的输输入自动动完成功功能,并并且可以以在输入入超级连连接框里里直接通通过GOOOGLLE搜索索所有的的内容,这这是比较较大的创创新,不不但可以以节省界界面的占占用面积积,还很很方便大大家查询询的需要要,比如如记不住住的连接接,根本本不需要要去记了了,只要要你记住住需要的的内容就就行了。这样既既不需要要到什么么门户网网站去找找连接,也也不需要要去记住住众多的的网站,这这个功能能是非常常方便的的。这个输入入框的自自动完成成的功能能,是比比较智能能化的。因为它它会根据据以往的的输入自自动完成成,或者者智能提提示所需需要的连连接或者者内容。下面就来来先看这这个类的的定义:#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实现了了Winndowws窗口口,它是是WTLL里的窗窗口模板板类,主主要用来来创建窗窗口界面面类,并并且使用用类CRRichhEdiitCttrl作作为基类类,类CCRicchEdditCCtrll主要调调用Wiindoows里里的编辑辑类。类类CRiichEEdittCommmannds实实现RiichEEditt的命令令功能。Mennu:Dellegaate类类是实现现智能下下拉式菜菜单的提提示界面面。因此此,要学学习开发发

38、chrromee,需要要先学习习WTLL的开发发,它是是一套基基于模板板的窗口口框架。下一次次再仔细细地分析析自动完完成的实实现过程程。谷歌浏浏览器的的源码分分析(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 收藏到我的网摘中,并分享给我的朋友 收藏当我们键键入字母母或者文文字开始始时,那那么类AAutoocommpleeteEEditt就会从从窗口消消息里获获取到相相应的字字母或者者文字,然然后根据据输入的的信息到到本地或或者网络络上保存存的信息息库里查查找相应应的输入入提示,这这就是自自动完成成的实现现。下面面就来先先分析输输入的函函数:#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.下面把aalt-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函函数是WWTL里里的WMM_CHHAR消消息处理理,当用用户键入入字母时时就会触触发这个个消息。这个函函数先跳跳过几个个不要处处理的消消息,最最后调用用函数HHanddleKKeysstrooke来来处理,如如下:#0011v

44、voidd AuutoccomppletteEddit:HaandlleKeeysttrokke(UUINTT meessaage, TCCHARR keey,#0022UUINTT reepeaat_ccounnt, UINNT fflaggs) 冻结RiichEEditt的更新新。#0033SccopeedFrreezze ffreeeze(thiis, GettTexxtObbjecctMoodell();处理消息息变化前前的动作作。#0044OnnBefforeePosssibbleCChannge();处理消息息#0055DeefWiindoowPrroc(messsagge, ke

45、yy, MMAKEELPAARAMM(reepeaat_ccounnt, flaags);处理消息息变化后后的动作作。#0066OnnAftterPPosssiblleChhangge();#0077在这里为为什么要要进行窗窗口的消消息冻结结呢?又又为什么么需要进进行消息息处理和和消息变变化后处处理呢?谷歌浏浏览器的的源码分分析(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 收藏到我的网摘中,并分享给我的朋友 收藏上一次说说到处理理WM_CHAAR消息息,当用用户每键键入一个个字符时时,万能能连接框框就会去去进行一一次查找找的过程程,然后后把智能能提示信信息

47、显示示出来。说到AAutoocommpleeteEEditt:HHanddleKKeysstrooke函函数的操操作,那那么它为为什么需需要冻结结这个函函数的使使用呢?现在就就来分析析这部份份的内容容。如下下:ScoppedFFreeeze freeezee(thhis, GeetTeextOObjeectMModeel();在这行代代码里,首首先会调调用函数数GettTexxtObbjecctMoodell()来来获取一一个文档档ITeextDDocuumennt接口口,然后后再使用用它的功功能。这这个函数数的代码码如下:#0011IITexxtDoocummentt* AAutoocomm

48、pleeteEEditt:GGetTTexttObjjecttModdel() cconsst 先判断这这个接口口是否获获取到,如如果已经经获取到到就不再再去重复复获取了了。#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接口口,如果果你深入入去分析析这个赋赋值操作作符,会会看到它它自动去去调用IIRicchEdditOOle的的接口IIUnkknowwn:QueeryIInteerfaace来来查询到到ITeextDDocuumennt接口口,这个个过程对对于程

50、序序员来说说是完全全不用关关心的,这这就是使使用muutabble CCoomQIIPtrr teext_objjectt_moodell_定义义的作用用。#0077texxt_oobjeect_moddel_ = olee_innterrfacce;#0088#0099reeturrn ttextt_obbjecct_mmodeel_;#0100通过上面面的分析析,可见见使用CCCommQIPPtr智智能指针针可以省省了很多多COMM调用的的操作,这这真是模模板类的的强大功功能的使使用之处处。当把把ITeextDDocuumennt接口口获取回回来之后后,对于于RicchEddit操操作就可

51、可以轻松松访问了了,SccopeedFrreezze类生生成一个个局部对对象,这这个对象象实现了了对RiichEEditt自动冻冻结和解解冻结的的功能,这这个过程程是通过过局部对对象在栈栈里生命命周期的的特性应应用。如如下面的的代码:#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) 这里需要要手动地地更新窗窗口的显显示。#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、从上面的的代码可可以看到到构造函函数里冻冻结,析析构造函函数里解解冻结,如如果需要要就会自自动更新新窗口的的显示。通过上面面的分析析,学会会使用RRichhEdiit的冻冻结窗口口的输入入,并且且解冻结结和更新新窗口的的显示,也也同时学学会使用用智能指指针来操操作COOM接口口的方便便性,最最后还学学会了使使用栈对对象的生生命周期期来方便便对加锁锁和解锁锁的操作作,以便便降低代代码的出出错率。谷歌浏览览器的源源码分析析(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 收藏到我的网摘中,并分享给我的朋友 收藏为了处理理字符消消息实现现自动完完成的功功能,这这是怎么

58、么样实现现的呢?其实是是先记录录字符消消息响应应前的字字符串以以及选中中状态,接接着再处处理消息息,最后后才查询询可能的的输入,做做出智能能提示。#0011vvoidd AuutoccomppletteEddit:OnnBefforeePosssibbleCChannge() #0022/ Reecorrd oour staate.记录当前前已经输输入的字字符串。#0033teext_befforee_chhangge_ = GGetTTextt();记录当前前选中的的字符位位置。#0044GeetSeelecctioon(ssel_befforee_chhangge_);#0055seele

59、cct_aall_befforee_chhangge_ = IIsSeelecctAlll(ssel_befforee_chhangge_);#0066上面就保保存字符符消息响响应前的的状态,接接着下来来就是消消息响应应后的处处理了,如如下:#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.判断用户户新选中中状态。#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等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论