[Sharpui]居于dui思想的c++版wpf界面库(免费、开源)
代码托管:https://github.com/china520/sharpui
注:有些图像没贴上,大家可以从上面地址下载:)
1 什么是Sharpui
Sharpui是居于现在流行的DUI思想的一套界面库,可以方便实现半透明和各种界面效果,采用纯c++实现,分为引擎和控件两个部分,这两个部分采用动态库的形式提供,引擎部分处理了事件、资源、渲染、控制逻辑,同时提供了各种应用层面控件的实现基类,包括:Visual、Element、FrameworkElement、Control、ContentControl、Window、Panel、Popup,这些类封装了基础控件的实现细则,所有用户实现的控件都必须继承自这些类,对于需要呈现的控件必须继承至FrameworkElement。
控件部分提供的所有控件均采用DUI方式实现、分层绘制,实现各种常用的布局控件,可灵活实现界面的自动布局;Sharpui本身所有数据结构采用原生实现,内存自动管理,不依赖于std的任何容器,使得库的使用更加独立、编译更加简单,使用VS任意一个版本编译都可以用在其它版本里,不需要担心由于std版本原因而产生编译问题。
2 资源结构说明
Sharpui库资源包括图像、字体、光标等纯碎的资源,同时样式也定义在资源里;资源可以单独放在独立的文件里,也可以放在界面元素的资源描述节里;两者的描述格式是完全一致的,资源是可以继承,就是说子元素可以继承父元素的资源,以此类推,Application作为所有界面元素的根而存在。
资源除了系统默认提供之外,允许用户自定义自己的资源,由系统进行统一管理。
2.1 资源结构说明
Application格式描述如下:
独立资源格式如下:
在独立的资源描述文件里,使用ResourceDictionary作为根节点,在资源节点还可以通过Source属性合并其它资源。
资源采用x:Key进行定义,而且必须唯一。
界面元素资源格式如下:
在界面元素里,资源定义在元素类名+.Resources节点下。
2.2 样式说明
样式描述在资源节点下,以Style作为节点名称,样式可以定义自己的子样式,但是建议不要超过两层资源链定义。Style包括三个控制属性:TargetType、x:Key、BasedOn,Setter节点描述了样式的应用属性,属性值可以使用“{}”定义为引用某一个资源。
如果属性值是一个复合结构,可以使用<Setter Property=”Background”><Setter.Vaue>进行定义。对于需要通过触发条件控制的样式可以通过Style.Triggers节点进行定义。
完整的样式格式描述如下:
2.3 资源引用说明
资源引用采用界面元素->父界面元素->Application元素的层次进行继承引用。
资源引用采用两种方式进行标定:类型和名称,这里的资源不仅是诸如图像、光标等纯碎资源,还包括样式资源,比如<Setter Property="Background" Value="{mainbkgnd}" />,表示背景刷引用了"mainbkgnd"资源,也可以这样进行描述(<Setter Property="Background" Value="{x:Key mainbkgnd}" />),两者是等价的。
对于样式的引用有完全引用和部分引用两种方式,分别通过Style和BasedOn关键字标识。
Style:语法:<Element Style="{Window}" >,其仅仅定义为元素属性,一旦定义,其内容完全和其引用一致。
BasedOn:语法:<Style BasedOn="{ListBoxItem}" />,其仅仅定义在Style节点,如果Style节点定义了其它资源,将优先使用(本身定义的资源会覆盖引用资源)。
当BasedOn没有定义自己任何资源时,其意义等同Style;比如:
<Style TargetType="ListViewItem" BasedOn="{x:Type ListBoxItem}" />和<ListViewItem Style="{ListBoxItem}" >…是一样的。
3 系统布局说明
系统布局是Sharpui关键部分,所有元素的布局都是相对于其父界面元素进行计算的,一般界面元素分为垂直和水平方向上的布局,水平方向包括Left、Center、Right、Stretch四个属性;垂直方向包括Top、Center、Bottom、Stretch四个属性,系统对水平和垂直上的这四个属性进行默认实现。
布局结合了元素的Width、Height和Margin以及Padding进行计算得到最终结果。
除了Stretch属性外,其余属性都需要元素的Width和Height支持,就是说必须设置Width和Height值,否则元素将不可见。
对于Left和Top,其布局原理如下:
对于Right和Bottom布局原理如下:
对于Center布局原理如下:
对于Stretch布局原理如下:
Stretch自动填充满父界面元素整个空间,然后四个边减掉Margin设定的值。
对于元素大小的测量仅仅在元素准备载入时初始化一次,系统运行过程中,具体元素可以根据需要重新调用进行测量元素。