chromeUi框架学习笔记邱金武09年11月11日目录1.一个简单的程序.............................................................................................................................11.1.源码分析.................................................................................................................................22.UI消息机制....................................................................................................................................23.Chrome控件树...............................................................................................................................34.Chrome消息分发机制...................................................................................................................45.基本控件.........................................................................................................................................55.1.源码解析.................................................................................................................................75.2.Paint&&Layout........................................................................................................................85.3.事件处理.................................................................................................................................86.原生控件.........................................................................................................................................87.国际化...........................................................................................................................................107.1.Locale项目............................................................................................................................107.2.GRIT软件.............................................................................................................................117.3.Grd文件................................................................................................................................127.4.Grd文件的编译....................................................................................................................147.5.Locale初始化........................................................................................................................157.6.国际化小结...........................................................................................................................158.UI主题..........................................................................................................................................159.Chrome的版本信息.....................................................................................................................169.1.version文件的编译...............................................................................................................17学习Chrome源码也有一小段时间了,对该浏览器的UI部分小有了解,于是将自己的一些心得贴上来,希望对有需要的朋友有所帮助。说明:1.本人所使用的chrome源码比较早,所以下载最新的代码多少会和文中有些差异。2.代码在windows下使用visualstudio2008编译。3.源码下载地址()推荐阅读:部分的通用1代码主要在目录树的“src/chrome/views”目录下。其中1.controls目录封装用到的控件,例如Label、Textfield等2.widget目录主要封装系统相关的UI底层细节,特别是UI消息机制。3.window目录主要封装UIFrame相关的细节,例如窗口的标题栏、系统按钮以及Frame、Dialog等的代理2接口。如果想了解Chrome绘图技术,可以去Skia项目3看看1.一个简单的程序//test.h#includechrome/views/view.h#includechrome/views/window/window_delegate.hclassTestWindow:publicviews::View,publicviews::WindowDelegate{public:virtualView*GetContentsView(){returnthis;}virtualgfx::SizeGetPreferredSize(){returngfx::Size(400,300);}staticvoidCreateTestWindow();};////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////test.cpp#includetest.h#includechrome/views/window/window.hvoidTestWindow::CreateTestWindow(){views::Window::CreateChromeWindow(NULL,gfx::Rect(),newTestWindow)-Show();}1说“通用”是因为chrome的主窗口框架是单独定制的。2设计模式术语3@gmail.com1运行的结果如下:41.1.源码分析1.TestWindow需要继承自两个类views::View和views::WindowDelegate。1.在chrome中,任何控件5包括一个Frame都必须是一个View。2.一个顶层窗口(例如Frame、Dialog6)必须继承自views::WindowDelegate以便传递该窗口的一些参数,例如窗口的尺寸。2.GetPreferredSize()含义很明显是告诉系统初始窗口大小7为(400*300),这里其实可选。3.GetContentsView()函数将自己作为一个窗口的根View传给所附属的Frame(或Dialog)。4.中间的黑色是因为客户区没有任何东西,所以背景贴图和背景贴图未覆盖的地方被显示出来。5.内部的白色框是因为系统默认会在客户区画白色的边框。为了方面其他代码调用,这里提供一个静态函数CreateTestWindow()打开该窗口2.UI消息机制8Windows每一个控件都单独处理消息,chrome一个整的的窗口可以看做一个9(Windows)控件,所以所有控件的消息都会发到一块去,所以chromeUi框架有一套机制来4因为本人已替换chrome自带的frame贴图,所以风格和chrome并不一致。5这里忽略操作系统原生控件的某些特殊情况6Dialog继承自DialogDelegate,该代理继承自WindowDelegate7确切的说是窗口内部的根View的大小,实际窗口大小要大于该值。8针对windows平台9这里忽略原生控件的封装qiujinwu456@gmail.com2分发到具体的(Chrome)控件。Windows版本的chrome的UI部分基于WTL10。chrome通过在此处11中的绑定来获取windowsUI消息。接着Chrome内置的一套消息分发机制将该消息发送到具体的chrome控件。3.Chrome控件树前面提到,chrome每一个控件都是一个views::View。views::View可以认为是chrome中所有控件的基类。在这个类中定义了一个通用的操作和默认实现,例如鼠标单击处理函数,如果某控件需要自定义鼠标处理事件,可以在自己的类中覆盖基类的默认实现。每一个views::View可以包含子views::View。所以每一个都包含一个父views::View和若干子views::View的指针,下面是源码12的定义//Thisview'sparentView*parent_;//Thisview'schildren.typede