Chromium UI框架view

如果把widget当作画板,那么view就相当于铺在画板上的画纸。widget上面不会画什么东西,我们的界面元素都是画在view上,然后view又盖在widget上面。 在non_client_view.h的注视里面可以看到以下的内容: chromium ui view

可以看到最底层是Widget,然后RootView盖在Widget上面。RootView包含了NonClientView,而NonClientView又包含NonClientFrameView和ClientView。View不仅可以显示元素,而且可以当作容器包含其他的View。所有的View形成了一个树状的层次结构,低底层的根是RootView。 RootView附着在一个Widget上面,Widget从操作系统里面接受事件,转换成与View兼容的事件,然后再传递给RootView。RootView则按照树状层次结构一层层的传递事件。

听起来还是很抽象,我们可以实际动手试一试,我们利用views::PrintViewHierarchy(this)打印出RootView的View Hierarchy,如下面所示:

RootView 0 0,0,856,416 0B602878
  ui/views/window/NonClientView 0 0,0,856,416 0B60D160
    NativeFrameView 0 0,0,856,416 0B5E1740
    ui/views/window/ClientView 0 0,0,856,416 0B620C60
      WidgetDelegateView 0 0,0,856,416 0B5DAE8C
        views/Combobox 0 5,5,851,29 0B5E2F10
          CustomButton 0 0,0,0,24 0B5E3138
          CustomButton 0 0,0,846,24 0B5E3350
        View 0 5,29,851,395 0B5FB900
          View 0 0,0,846,366 0B5E0DF0
            LabelButton 0 0,0,79,366 0B620D78
              View 0 0,0,79,366 0B6234E8
              ImageView 0 6,183,6,183 0B621008
              Label 0 6,0,73,366 0B621160
            LabelButton 0 89,0,190,366 0B6256C0
              View 0 0,0,101,366 0B625E28
              ImageView 0 6,183,6,183 0B625948
              Label 0 6,0,95,366 0B625AA0
            LabelButton 0 200,0,280,366 0B626748
              View 0 0,0,80,366 0B62AEF0
              ImageView 0 6,183,6,183 0B628D98
              Label 0 6,0,74,366 0B6269D0
            LabelButton 0 290,0,383,366 0B62BA38
              View 0 0,0,93,366 0B62FE38
              ImageView 0 6,183,6,183 0B62B810
              Label 0 6,0,87,366 0B62BCC0
            LabelButton 0 393,0,463,366 0B631F70
              View 0 0,0,70,366 0B6344C8
              ImageView 0 6,183,6,183 0B6321F8
              Label 0 6,0,64,366 0B632350
            LabelButton 0 473,0,566,366 0B6351A8
              View 0 0,0,93,366 0B6355A8
              ImageView 0 6,183,6,183 0B634B20
              Label 0 6,0,87,366 0B635430
            LabelButton 0 576,0,645,366 0B636570
              View 0 0,0,69,366 0B63A970
              ImageView 0 6,183,6,183 0B635CB8
              Label 0 6,0,63,366 0B6367F8
        Label 0 5,395,851,411 0B5E48D0

在ui/views/examples下面有个views_examples_exe工程,演示了Chromium UI框架的各种例子:

chromium ui view

chromium ui view