#001 std::wstring AboutChromeView::GetWindowTitle() const { return l10n_util::GetString(IDS_ABOUT_CHROME_TITLE); } |
获取资源里的对话框标题,接着:
在上面的断点里就是响应菜单,然后创建关于对话框,主要调用函数CreateChromeWindow来创建窗口,把AboutChromeView窗口绑定到这个窗口类型里。由于可多米都是统一的窗口样式,那么它是通过创建一样的窗口类CustomFrameWindow来实现的。
为了显示窗口的标题,是通过下面的函数关系调用:
1. Browser::ExecuteCommand 浏览器执行菜单命令。
2. ChromeViews::Window::CreateChromeWindow 创建窗口。
3. ChromeViews::CustomFrameWindow::Init 初始化窗口。
4. ChromeViews::Window::Init 初始化窗口标题。
5. AboutChromeView::GetWindowTitle 从关于对话框获取标题。
理解上面的函数关系调用就知道怎么样显示标题了,因此也知道关于对话框所有内容是由类AboutChromeView来管理的,但窗口的样式是由CustomFrameWindow类来管理的。
通过上面的分析,了解了关于对话框的标题显示过程,你想修改成什么样的内容,就要看你的需要了。下一次再仔细地分析有关于对话框怎么样组织其它信息,比如重要的升级功能。
关于对话框,主要实现了让用户查看当前软件的版本、软件信息和检查升级的功能。因此这个类主要继续ChromeViews::View类、ChromeViews::DialogDelegate和GoogleUpdateStatusListener.其中ChromeViews::View实现窗口的布局和显示问题,ChromeViews::DialogDelegate实现了事件响应,或者窗口某时是否可以显示按钮的问题,GoogleUpdateStatusListener是用来实现接收更新程序状态信息。
这个类的声明如下:
class AboutChromeView : public ChromeViews::View, public ChromeViews::DialogDelegate, public GoogleUpdateStatusListener { public: explicit AboutChromeView(Profile* profile); virtual ~AboutChromeView(); // Initialize the controls on the dialog. void Init(); // Overridden from ChromeViews::View: virtual void GetPreferredSize(CSize *out); virtual void Layout(); virtual void ViewHierarchyChanged(bool is_add, ChromeViews::View* parent, ChromeViews::View* child); // Overridden from ChromeViews::DialogDelegate: virtual int GetDialogButtons() const; virtual std::wstring GetDialogButtonLabel(DialogButton button) const; virtual bool IsDialogButtonEnabled(DialogButton button) const; virtual bool IsDialogButtonVisible(DialogButton button) const; virtual bool CanResize() const; virtual bool CanMaximize() const; virtual bool IsAlwaysOnTop() const; virtual bool HasAlwaysOnTopMenu() const; virtual bool IsModal() const; virtual std::wstring GetWindowTitle() const; virtual bool Accept(); virtual ChromeViews::View* GetContentsView(); // Overridden from GoogleUpdateStatusListener: virtual void OnReportResults(GoogleUpdateUpgradeResult result, GoogleUpdateErrorCode error_code, const std::wstring& version); private: // The visible state of the Check For Updates button. enum CheckButtonStatus { CHECKBUTTON_HIDDEN = 0, CHECKBUTTON_DISABLED, CHECKBUTTON_ENABLED, }; // Update the UI to show the status of the upgrade. void UpdateStatus(GoogleUpdateUpgradeResult result, GoogleUpdateErrorCode error_code); Profile* profile_; // UI elements on the dialog. ChromeViews::ImageView* about_dlg_background_; ChromeViews::Label* about_title_label_; ChromeViews::TextField* version_label_; ChromeViews::TextField* main_text_label_; // UI elements we add to the parent view. scoped_ptr<ChromeViews::Throbber> throbber_; ChromeViews::ImageView success_indicator_; ChromeViews::ImageView update_available_indicator_; ChromeViews::ImageView timeout_indicator_; ChromeViews::Label update_label_; // Keeps track of the visible state of the Check For Updates button. CheckButtonStatus check_button_status_; // The class that communicates with Google Update to find out if an update is // available and asks it to start an upgrade. GoogleUpdate* google_updater_; // Our current version. std::wstring current_version_; // The version Google Update reports is available to us. std::wstring new_version_available_; DISALLOW_EVIL_CONSTRUCTORS(AboutChromeView); }; |
#p#副标题#e#
通过关于对话框的分析,可以理解到chrome浏览器窗口基本组成,以及窗口继承关系,还有事件的响应方式。前面三次分析,主要是入门的分析,也是了解这么一个大工程的一种手段。比如测试整个工程是否可以编译,是否可以修改代码等等。后面的分析会以浏览器输入HTTP连接开始,直到打开网页显示为一个主线,做一个基本的分析。
当用户打开浏览器之后,最希望输入的地方,是浏览器的连接框。目前谷歌浏览器把输入连接框与搜索引擎输入合并到一起,可以说完美的组合,让界面更加简洁,方便实用,并且它自动完成的功能更加强劲,如下图所示:
上面输入了www.c时,它就会自动地在后面添加智能选择的连接,并且可以GOOGLE里搜索输入的内容,又如下面:
上面在输入框里输入我的名字,就会自动弹出查找的内容,或者可能搜索的连接。这些功能都比较完美的实现,这可以说是史无前例的输入创新,真正人性化的体现,那么它又是怎么样实现的呢?其主要功能是在文件srcchromebrowserautocompleteautocomplete_edit.cc里实现,具体的实现方式内容等下一次再去分析。
前面已经介绍了这么引人的输入自动完成功能,并且可以在输入超级连接框里直接通过GOOGLE搜索所有的内容,这是比较大的创新,不但可以节省界面的占用面积,还很方便大家查询的需要,比如记不住的连接,根本不需要去记了,只要你记住需要的内容就行了。这样既不需要到什么门户网站去找连接,也不需要去记住众多的网站,这个功能是非常方便的。
这个输入框的自动完成的功能,是比较智能化的。因为它会根据以往的输入自动完成,或者智能提示所需要的连接或者内容。
下面就来先看这个类的定义:
#001 // Provides the implementation of an edit control with a drop-down #002 // autocomplete box. The box itself is implemented in autocomplete_popup.cc #003 // This file implements the edit box and management for the popup. #004 // #005 // This implementation is currently appropriate for the URL bar, where the #006 // autocomplete dropdown is always displayed because there is always a #007 // default item. For web page autofill and other applications, this is #008 // probably not appropriate. We may want to add a flag to determine which #009 // of these modes we're in. #010 class AutocompleteEdit #011 : public CWindowImpl<AutocompleteEdit, #012 CRichEditCtrl, #013 CWinTraits<WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | #014 ES_NOHIDESEL> >, #015 public CRichEditCommands<AutocompleteEdit>, #016 public Menu::Delegate { |