跨平台
- 主要使用c++进行开发
- 通过base库和ui库,接管了系统的消息,不直接调用系统API
- 使用skia,统一了不同平台的绘制
DUI
- DirectUI意为直接在父窗口上绘图,子窗口和子控件不以实际窗口的方式创建,不包含系统窗口句柄
- 可以更灵活的组合出各种复杂控件和效果
- 更多的使用自绘,界面更酷炫
面向对象
- 大量使用设计模式,无处不在的观察者、委托、工厂等模式
- 大量使用MVC的界面逻辑分离模式
概念
view
- 控件或者容器
- 由于dui,他比windows的控件更灵活更高效,而且没有系统窗口句柄
widget
- 窗口、句柄封装,不一定有真实的系统窗口句柄
基础控件
Separator
- 分割线
Label
- 单行文字
- 其他
- Link 链接(可点击文字)
Button
LabelButton
- 文字按钮
- 其他
- MdTextButton:
- MenuButton:菜单按钮
- Checkbox:复选框
- RadioButton:单选框
ImageButton
- 图片按钮
ToggleButton
- 开关按钮
TextField
- 编辑框
ImageView
- 图片
ProgressBar
- 进度条
Combobox
- 组合框
EditableCombobox
- 可编辑组合框
创建控件
父view会将子view保存在children_列表,在析构时自动delete。
部分控件有特定的工厂、原型创建方式。
1 2 3 4 5 6 7 8 |
auto label_button = std::make_unique<LabelButton>(this, ASCIIToUTF16(kLabelButton)); label_button_ = AddChildView(std::move(label_button)); label_button2_ = new LabelButton(this, ASCIIToUTF16(kLabelButton)); AddChildView(label_button2_ ); md_button_ = container->AddChildView( MdTextButton::Create(this, base::ASCIIToUTF16("Material Design"))); |
控件布局
所谓布局,就是告诉告诉别人你自己有多大,你的所有子控件应该在什么位置,有多大。
第一种方法
- 通过重载View类的两个函数可以实现目的
1 2 3 |
virtual void Layout(); virtual gfx::Size CalculatePreferredSize() const; |
第二种方法
- 通过设置布局管理器来控制:View::SetLayoutManager
- LayoutManager是一个虚基类,一般需要实现两个纯虚函数
1 2 3 |
virtual void Layout(View* host) = 0; virtual gfx::Size GetPreferredSize(const View* host) const = 0; |
chromium的布局管理器
- FillLayout:填充布局
- 所有子控件叠起来,父控件大小取子控件的最大宽高
- BoxLayout:箱式布局
- 横向或者纵向排列子控件
- GridLayout:网格布局
- 分成几行几列,设置子控件占用哪个或者哪些格子
- FlexLayout:弹性布局
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!