• 我自己用 Ruby 在做 windows 下的桌面 app 框架,已初具效果,UI 已经做到运行时动态增删,达到 wysiwyg 了,而且手工配置的部分已经做到比 json,yaml,xml 直观太多了!

    这是手工配置文件的样子

    { applications{

    aio(CAppDemo){

    title=mls "aio 测量系统" version="0.0.2" software_version="0.0.0"

    font_name=mls "宋体" font_size=30

    prop_int=127{ title=mls "亮度" default=0 llimit=0 ulimit=444 mouse_wheel=1.0

    } def_prop_cmd_line

    begin_def_measure_val{

    prop_mesure_float=-0.0{ title=mls "半径" unit=UnitTypeMM

    std=0.0 correct=0.05 llimit=-0.5 ulimit=0.5 }

    end_def_measure_val}

    light_adj=127{ title=mls "亮度" }

    app_idle_time=0.0{ title=mls "程序空闲时间" unit=UnitTypeMS format="%6.3f" editable=false #read_only= true }

    app_idle_proc_time=0.0{

    title=mls "程序空闲处理时间" unit=UnitTypeMS format="%6.3f" }

    worktable{ pos{ x=0.0{ title=mls "X" llimit=-100.0 ulimit=100.0 } y=0.0{ title=mls "Y" } ff=0.0{ title=mls "Z" } } }

    time_for_show_caret=0.5{ title=mls "定时显示光标"

    llimit=0.1 ulimit=1.0 mouse_wheel=0.01 unit=UnitTypeMS

    }

    ui_config=false{ title="配置 UI" }

    test_mesure_val=0{

    }

    length_unit=UnitTypeMM{ title=mls "长度单位" vals=[UnitTypeMM,UnitTypeInch,UnitTypeMil] } angle_unit=UnitTypeDu{ title=mls "角度单位" vals=[UnitTypeDu,UnitTypeHuDu,UnitTypeDFM] } time_unit=UnitTypeS{ title=mls "时间单位" vals=[UnitTypeH,UnitTypeM,UnitTypeS,UnitTypeMS,UnitTypeUS] } vel_unit=UnitTypeMMPerS{ title=mls "速度单位" vals=[UnitTypeMMPerS,UnitTypeDuPerS,UnitTypePlusPerS] } show_dyn_prompt=true{ title=mls "显示动态提示" } user_type=PermissionUser{

    }

    } } }

  • 完善控件后,用 RAIO(我给这个框架起的名字)在做项目时,程序员只需要用内置的功能就可以用 wysiwyg 的方式快速生成 UI,然后接下来就是直接进入 app 逻辑的编写

  • 从 CObj 派生的类不需要写 attr_accessor,你只管按路径写法去读写你程序用到的属性,不存在就自动生成,而其默认值就是 nil 例: 写:$root.os.applications.app.main_frm.rect.val=[0,0,640,480] 读:$root.os.applications.app.main_frm.rect.val 这里除了$root 是需要主动生成之外,其它后面的路径节点都是不存在就动态产生,无需在类中先 attr_accessor

  • 配置文件的写法,比其它什么 json,yaml,xml 直观得太多了!

  • 当然也可以在自动产生的代码中加入手工写的代码来增加控件

  • 上面的 UI 配置是程序自动产生的,只有 app 配置是手定的

  • 已经可以运行中进行控件的增删及自由布局,并自动保存改变, UI 的设计不象现有的多数软件是在设计时进行,都在运行时通过鼠标拖拽完成,无需手写代码,真正达到 wysiwyg 的效果了

  • Kao,这格式都丢失了~!@#¥%……&*

  • 这是 UI 配置的样子 PermissionUser.password="" PermissionEngine.password="1" PermissionAdmin.password="11" PermissionSuper.password="111"

    { (CWinDlg, NameFrmMain){ (CWinTitleBar, at: AlignTypeTop, as: AlignSizeToTextHeight, name: NameAppTitleBar){ new_btn(FunWinClose) new_btn(FunWinMaximize) new_btn(FunWinMinimize) new_btn(FunMoveWin) new_btn(FunELine) new_btn(FunERect) new_btn(FunMakeUI) title="aio 测量系统 0.0.0" } (CWinStatusBar, at: AlignTypeBottom, as: AlignSizeToTextHeight, name: NameStatusBar){ (CWin, at: AlignTypeRight, as: 100){ title="CWin_7880" } (CWin, at: AlignTypeRight, as: 150, name: NameCmdStatistics){ title="1/0/1" } new_prop_win($root.os.applications.aio.prop_int, at: AlignTypeRight, as: 200) title="退出" } (CWinPanel, at: AlignTypeRight, as: 1019, name: NameRightBar){ (CWinTab, at: AlignTypeClient, as: 0){ (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridAppProp){ (CWin, at: AlignTypeRight, as: 150){ title="CWin_9300" } new_prop($root.os.applications.aio.app_idle_time) new_prop($root.os.applications.aio.app_idle_proc_time) new_prop($root.os.applications.aio.time_for_show_caret) new_prop($root.os.applications.aio.show_dyn_prompt, class: CWinPropbool) new_prop($root.os.applications.aio.refresh_wins) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_mesure_float) prop_split=300 title="程序属性" } (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridDocProp){ prop_split=300 title="文档属性" } (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridCmdProp){ prop_split=300 title="命令属性" } (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridActiveEntityProp){ prop_split=300 title="活动图元属性" } (CWinGridReport, at: AlignTypeClient, as: 0, name: NameReport){ title="报表" } active_page=0,NoNotical fir_visible=0 } (CWinPanel, at: AlignTypeTop, as: 300){ (CWinCoorBar, at: AlignTypeClient, as: 0, name: NameCoorBar){ prop_split=274 title="NameCoorBar" } (CWinLightCtrlBar, at: AlignTypeRight, as: 200, name: NameLightCtrlBar){ rings=4 areas=8 title="NameLightCtrlBar" } title="CWinPanel_12760" } title="NameRightBar" } (CWinPanel, at: AlignTypeClient, as: 0){ (CWinCanvas, at: AlignTypeClient, as: 0, name: :canvas){ title="canvas" } (CWinCmdBar, at: AlignTypeBottom, as: 300, name: NameCmdBar){ title="NameCmdBar" } title="CWinPanel_19580" } frm_rect.val=CRect.new [0, 0, 2560, 1600] modal_frm.val= true title="NameFrmMain" } }

  • 这是配置文件的样子 { applications{

    aio(CAppDemo){

    title=mls "aio 测量系统" version="0.0.2" software_version="0.0.0"

    font_name=mls "宋体" font_size=30

    prop_int=127{ title=mls "亮度" default=0 llimit=0 ulimit=444 mouse_wheel=1.0

    } def_prop_cmd_line

    begin_def_measure_val{

    prop_mesure_float=-0.0{ title=mls "半径" unit=UnitTypeMM

    std=0.0 correct=0.05 llimit=-0.5 ulimit=0.5 }

    end_def_measure_val}

    light_adj=127{ title=mls "亮度" }

    app_idle_time=0.0{ title=mls "程序空闲时间" unit=UnitTypeMS format="%6.3f" editable=false #read_only= true }

    app_idle_proc_time=0.0{

    title=mls "程序空闲处理时间" unit=UnitTypeMS format="%6.3f" }

    worktable{ pos{ x=0.0{ title=mls "X" llimit=-100.0 ulimit=100.0 } y=0.0{ title=mls "Y" } ff=0.0{ title=mls "Z" } } }

    time_for_show_caret=0.5{ title=mls "定时显示光标"

    llimit=0.1 ulimit=1.0 mouse_wheel=0.01 unit=UnitTypeMS

    }

    ui_config=false{ title="配置 UI" }

    test_mesure_val=0{

    }

    length_unit=UnitTypeMM{ title=mls "长度单位" vals=[UnitTypeMM,UnitTypeInch,UnitTypeMil] } angle_unit=UnitTypeDu{ title=mls "角度单位" vals=[UnitTypeDu,UnitTypeHuDu,UnitTypeDFM] } time_unit=UnitTypeS{ title=mls "时间单位" vals=[UnitTypeH,UnitTypeM,UnitTypeS,UnitTypeMS,UnitTypeUS] } vel_unit=UnitTypeMMPerS{ title=mls "速度单位" vals=[UnitTypeMMPerS,UnitTypeDuPerS,UnitTypePlusPerS] } show_dyn_prompt=true{ title=mls "显示动态提示" } user_type=PermissionUser{

    }

    } } }

  • 还好,坚持做了,有点收获了