Archive for July 15th, 2005

XML动态工具栏

  既然菜单、页面、状态栏都是由XML配置动态生成的,工具栏也不例外。
  我理想中的工具栏应该是同时支持两种形式:一种就是最常见的普通工具栏,包括普通小按钮、Check风格的小按钮、带下拉小箭头可弹出菜单的小按钮和分隔符;另外就是类似IE的ReBar了,所有能够出现在对话框或者页面上的控件可以加载,而且在一个页面下,可以自由配置出多个ReBar(0~N,只要屏幕上放得下……)。
  首先就是要把XML配置定义出来,一个典型的配置如下(限于篇幅,每个控件下的Command子节点以及布局信息省略):
 
<ToolBars>
  <SystemBar id="3100" caption="系统工具栏">
    <Button id="3101" text="按钮1" image="0" />
    <Separator />
    <Check id="3102" text="按钮1" image="1" />
    <DropList id="3103" text="按钮6" image="7">
      <Commands />
      <MenuItem />
    </DropList>
  </SystemBar>
  <PageBar id="3200" caption="页面工具栏1">
    <Control id="3201" class="Text" caption="标题:" />
  </PageBar>
  <PageBar id="3300" caption="页面工具栏2">
    <Control id="3301" class="Check" caption="复选" />
  </PageBar>
</ToolBars>
 
  上述配置定义了一个普通工具栏和两个ReBar,前者加载四种类型的工具栏按钮各一个,其中DropList还带有下拉菜单的配置;后两者分别放置了一个Static文本和一个复选框。
  效果如图所示,嘿嘿,似乎还不错,至少功能上达到了,至于外观,那就请控件的设计者们考虑如何实现OWNER_DRAW风格吧。
 
  还有一点,普通工具栏上面放置了很多小图标,既然是都做成可配置的,当然不希望把这些图标都在程序资源中定死。万一某天上司希望加一个新功能按钮,而没有合适的图标,我岂不是要哭了?不过这也简单,写一个小程序编辑图片,生成一个CImageList对象,然后把这个对象序列化成一个dat文件,让我的工具栏加载的时候读取这个dat文件加载这个CImageList对象不就可以了吗?这个dat文件也成为了配置的一部分,这样再遇到上面那种情况也只需要重新发布一下dat文件就好了。
Advertisements

4 Comments