首页 > GacUI纯C++和使用xml的区别

GacUI纯C++和使用xml的区别

GacUI中使用纯C++和搭配xml来编辑资源有什么区别呢?
除了xml可以更方便地进行排版以及更方便的进行后续修改之外,还有其他的什么好处吗?是否xml能做到的,用C++同样能全部做到呢?

以前只在Android开发的介绍看到过,用Java写程序逻辑,用XML来写用户界面,可以减少相互之间的依赖和影响。(当然我没有认真研究过Android开发的具体细节,只是略有涉猎。)那么GacUI中使用XML是不是出于同样的目的,甚至是有更多的目的?

因为没有真正写过一个复杂一点的GUI程序,想借此折腾一下这方面的东西,顺带观摩和借鉴一下轮子哥的宏伟建筑。尤其是使用XML写GUI这方面(经常有,有了C++,就有了一切的想法),如果我想学习这一方面,可否大概描述一下应该遵循怎么样的路子?

感激不尽, @vczh


GacUI的release一共有四个cpp文件,分别是
Vlpp.cpp / GacUI.cpp
Workflow.cpp / GacUIReflection.cpp

它们的作用分别是
Vlpp.cpp : 我自己写的一个方便自己写跨平台C++代码的库
GacUI.cpp : GacUI本体
Workflow.cpp : 一个能跟C++类做深度交互(甚至是脚本的class继承自C++的interface都能做到的)脚本引擎
GacUIReflection.cpp : 反射用的大量的字符串和代码

如果你使用C++来写GacUI,那么只需要前两个文件。如果你使用XML来写GacUI,由于最后XML经过GacGen.exe编译成了一堆Workflow脚本,所以你需要所有的文件(这个时候编译出来的体积会比较大)。不过我最近正在做一个事情,就是把Workflow翻译回C++,这样使用XML的时候就不需要运行时反射了。

==========================================================

至于XML的好处嘛,跟XAML是差不多的,而且我有高度自由的data source / data binding的功能。因此你可以使用XML来创建窗口、控件、皮肤、样式等很多东西,然后我会帮你把这些东西翻译成Workflow的同时,还给你生成很多C++的壳。所以这些类在C++和脚本里面都可以互相使用。举个简单的例子,我写一个窗口里面有三个文本框,前两个文本框更改内容的时候,第三个文本框会显示他们的和:

<Window Text="加法">
    <Table AlignmentToParent="left:0 top:0 right:0 bottom:0" CellPadding="5">
        <att.Rows>
            <CellOption>composeType:MinSize</CellOption>
            <CellOption>composeType:MinSize</CellOption>
            <CellOption>composeType:MinSize</CellOption>
        </att.Rows>
        <att.Columns>
            <CellOption>composeType:Percentage percentage:1.0</CellOption>
        </att.Columns>
        
        <Cell Site="row:0 column"0>
            <SinglelineTextBox ref.Name="textBox1" Text="1">
                <att.BoundsComposition-set PreferredMinSize="y:30" AlignmentToParent="left:0 top:0 right:0 bottom:0"/>
            </SinglelineTextBox>
        </Cell>
        <Cell Site="row:0 column"0>
            <SinglelineTextBox ref.Name="textBox2" Text="2">
                <att.BoundsComposition-set PreferredMinSize="y:30" AlignmentToParent="left:0 top:0 right:0 bottom:0"/>
            </SinglelineTextBox>
        </Cell>
        <Cell Site="row:0 column"0>
            <SinglelineTextBox ref.Name="textBox3" Text-bind="(cast int textBox1.Text) + (cast int textBox2.Text) ?? '<ERROR>'">
                <att.BoundsComposition-set PreferredMinSize="y:30" AlignmentToParent="left:0 top:0 right:0 bottom:0"/>
            </SinglelineTextBox>
        </Cell>
    </Table>
</Window>
【热门文章】
【热门文章】