0.7.8.0 2026-06-28 calvin
* 所有控件新增函数SetDefault用于设置缺省回车触发控件
* 正式对外发布
0.7.7.0 2026-06-27 calvin
* 新增guiiconname对象
0.7.6.0 2026-06-25 calvin
* 所有布局对象都新增函数CleanChildren用于清理所有下级
* VS2019新增Release构建模式
0.7.5.0 2026-06-24 calvin
* 重构了官网首页文字
* 优化了回调函数抛出异常机制
0.7.4.0 2026-06-19 calvin
* 控件sourceeditarea新增函数AppendLanguageSearchPath及XML属性
* 修复了一些问题
0.7.3.0 2026-06-17 calvin
* 布局对象scrollwindowlayout新增GTK4封装函数SetPropagateNaturalWidth/Height、SetMinContentWidth/Height、SetMaxContentWidth/Height,及XML标记
* 窗口对象window新增函数RemoveStatusbar
0.7.2.0 2026-06-13 calvin
* 完成所有窗口、布局、控件都支持用XML构建,完成文档补充
0.7.1.0 2026-05-24 calvin
* 尝试引入XML创建窗口
0.7.0.1 2026-05-22 calvin
* 所有源码中的中文的字符编码都统一转换成UTF-8
0.7.0.0 2026-03-26 calvin
* 跟随zlang v0.10.0.0做了调整
* 废弃guiimage,新增guipicture
* 正式对外发布
0.6.0.0 2025-12-09 calvin
* 跟随zlang v0.7.0.0做了调整
0.5.9.0 2025-11-08 calvin
* 移植到了Ubuntu v24
0.5.8.0 2025-10-21 calvin
* 补全中文别名
0.5.7.0 2025-10-02 calvin
* 编写文档
0.5.6.0 2025-09-21 calvin
* 所有控件新增函数SetExpand(bool)、SetAlign(int)
* 开始撰写文档
0.5.5.0 2025-09-20 calvin
* 新增guiflowboxlayout
* 内部:清理了ZlangDirectProperty_guiwidget_common内部无用属性
0.5.4.0 2025-09-19 calvin
* 新增对象guicenterboxlayout
0.5.3.0 2025-09-16 calvin
* guiwindow的全屏和取消全屏函数里会自动隐藏和显示菜单栏、工具栏和状态栏了
* 所有控件对象新增函数SetFocusable(bool)
0.5.2.0 2025-09-15 calvin
* guivideo新增函数SetAutoPlay(bool)、SetLoopPlay(bool)、SetMuted(bool)、SetVolume(double)、GetAutoPlay()、GetLoopPlay()、GetMuted()、GetVolume()、GetDuration()、GetTimestamp()、Seek(long)、SeekOffset(long)
0.5.1.0 2025-09-14 calvin
* guitable和guitreetable修改了定义列的相关内部实现和外部接口
* guitable支持图标(ICON)列类型
* guiwindow新增函数IconNamesToArray()
* 新增对象guiclipboard
0.5.0.0 2025-09-08 calvin
* guiwindow的Open等函数改名为OpenWindow
* gui*dialog的ModalOpen等函数改名为ModalOpenWindow
0.4.23.0 2025-09-07 calvin
* 调整了布局对象、控件对象的公共函数代码结构
* guivideo新增函数IsPrepared()、GetVideoWidth()、GetVideoHeight()
* guiwindow新增函数AddTimerEventCallback(string,int,functionptr)
* 新增对象guimonitor
0.4.22.0 2025-09-06 calvin
* guivideo新增函数Play()、Stop()、Pause()
* 为了guivideo能放出图像,需要附加安装编解码器,备忘pacman命令集合
0.4.21.0 2025-09-05 calvin
* 新增控件对象guivideo
0.4.20.0 2025-08-31 calvin
* 所有对象都新增函数SetCss(string)
* 修正了guitreetable的一个内部类型标识问题
* guilabel新增函数SetMarkupLabel(string)
0.4.19.0 2025-08-29 calvin
* 新增对象guitreecolumn_toggle、guitreecolumn_progress、guitreecolumn_int_text、guitreecolumn_double_text、guitreecolumn_string_text
* guitreetable新增函数AddTreeNodeDatas(guitreenode,array)、InsertTreeNodeDatasBefore(guitreenode,array)、InsertTreeNodeDatasAfter(guitreenode,array)
0.4.18.0 2025-08-28 calvin
* guitreetable的复选框列支持状态切换了
0.4.17.0 2025-08-26 calvin
* guitreetable新增函数GetSelectedRowData(int)、GetSelectedRowPath、IsRowSelected(string)
0.4.16.0 2025-08-23 calvin
* 新增guitreetable
0.4.15.0 2025-08-20 calvin
* 新增guipopoverlayout
0.4.14.0 2025-08-19 calvin
* 新增guicalendar
0.4.13.0 2025-08-18 calvin
* guilistbox新增函数GetItemCount()
* guicombobox新增函数InsertStringItem(int,string)、SetStringItem(int,string)、InsertItem(int,object,object)、SetItem(int,object,object)、Remove(int)、RemoveAll()、GetItemCount()
0.4.12.0 2025-08-17 calvin
* 调整了guitable内部数据结构,支持整型了
* guitable新增函数InsertRowDatas(int,array)
* guilistbox新增函数InsertStringItem(int,string)、SetStringItem(int,string)、InsertItem(int,object,object)、SetItem(int,object,object)、Remove(int)
0.4.11.0 2025-08-16 calvin
* guitable新增函数AppendRowDatas(array)、RemoveRow(int)、RemoveAllRows()、SetText(int,int,string)
0.4.10.0 2025-08-13 calvin
* guitable新增函数IsRowSelected(int)、GetSelectedRows()、GetSelectedRowsText(int,int)
0.4.9.0 2025-08-11 calvin
* 新增guitable
0.4.8.0 2025-08-07 calvin
* guilistbox新增函数ShowSeparators(bool)
* tested test/test_window_scrollwindowlayout_editarea_mouse_press_1.z
0.4.7.0 2025-08-05 calvin
* guibutton新增函数SetFrame(bool)、HasFrame()
* guieditarea向guisourceeditarea拉齐了函数
0.4.6.0 2025-08-02 calvin
* guilabel新增函数SetSelectable(bool)
0.4.5.0 2025-07-31 calvin
* guilabel新增函数SetWidthChars(int)、SetMaxWidthChars(int)
* guisourceeditarea新增函数GetCurrentColumnNo()、GetCurrentFileOffset()、SetCursorPositionEventCallback(functionptr)、SetHasSelectionEventCallback(functionptr)
* guiwindow新增函数GetStatusBar()
* 新增控件"notify::*"信号回调基础代码
0.4.4.0 2025-07-29 calvin
* guifontchooserdialog的函数GetFont改名为GetFontAndSize
* guisourceeditarea新增函数SetFontAndSize(string)
0.4.3.0 2025-07-28 calvin
* guiwindow新增函数GetTital()
0.4.2.0 2025-07-28 calvin
* guiwindow新增函数SetModal(bool)
* guisourceeditarea新增函数GotoLine(int)、GotoFileOffset(int)、GotoLineOffset(int)
0.4.1.0 2025-07-27 calvin
* 修正了控件回调函数里发生错误时没有把报错信息返回出来
* guisourceeditarea新增函数MoveLeftWord()、MoveRightWord()、SelectWord()、SelectLine()、AppendSelectLeftWord()、AppendSelectRightWord()
0.4.0.1 2025-07-26 calvin
* 调整了内部回调参数结构
0.4.0.0 2025-07-20 calvin
* 随zlang v0.6.0.0而调整代码
0.3.7.0 2025-07-17 calvin
* guisourceeditarea新增函数ReplaceAll(string,string,bool,bool)
* guisourceeditarea新增内部行为GtkOnSourceViewSelectionChanged
0.3.6.0 2025-07-16 calvin
* guisourceeditarea新增函数ReplacePrev(string,bool,bool,bool)、ReplaceNext(string,bool,bool,bool)
0.3.5.0 2025-07-15 calvin
* guisourceeditarea新增函数SetSearchHighLight(bool)、FindPrev(string,bool,bool,bool)
0.3.4.0 2025-07-14 calvin
* guisourceeditarea新增函数GetSelectedText()、FindNext(string,bool,bool,bool)
0.3.3.0 2025-07-13 calvin
* guiframelayout新增函数Create(win)
* guimessagedialog新增函数ModalOpen(guiwindow,string)
* guisourceeditarea新增函数AppendText(string,bool)
* guiwindow新增函数ShowTitlebarButtons(bool)、SetTransientFor(guiwindow)、Hide()
0.3.2.0 2025-07-11 calvin
* guiwindow新增函数Minimize、Unminimize、Fullscreen、Unfullscreen、IsActive、IsFullscreen、IsMaximized、SetWindowActiveEventCallback、SetWindowMaximizedEventCallback、SetWindowMinimizedEventCallback、SetWindowFullscreenedEventCallback
0.3.1.0 2025-07-09 calvin
* guisourceeditarea新增函数Undo、Redo
0.3.0.0 2025-07-05 calvin
* 从依赖gtk3迁移到gtk4,大改啊
* 去掉了通用函数SetAlignment,新增了SetHorizontalAlign、SetVerticalAlign、SetHorizontalExpand、SetVerticalExpand
* guilabel新增函数SetJustify
* 通用控件新增函数SetMargin_int、SetMargin_int_int_int_int、SetHorizontalMargin_int、SetVerticalMargin_int
0.2.4.0 2025-04-24 calvin
* 所有布局和控件对象新增函数Show
* 控件对象guilistbox新增函数SetRowActivatedEventCallback(functionptr)
0.2.3.0 2025-04-23 calvin
* 控件对象guisourceeditarea新增函数GetCurrentLine
* 所有布局和控件对象新增函数SetKeyPressEventCallback、SetKeyReleaseEventCallback
0.2.2.0 2025-04-22 calvin
* 新增对象guialign
* 所有布局和控件对象新增函数GetParentWithType(object)
* 控件对象guilabel新增函数Create(guiwindow,string,int)
* 控件对象guilistbox新增函数AppendStringItem(string,int)、AppendItem(object,object,int)
* 控件对象guisourceview新增函数SetCurrentLine(int)
0.2.1.0 2025-04-17 calvin
* guieditarea和guisourceeditarea新增函数SetChangedEventCallback
* guisourceeditarea新增函数TravelFirstLineText、TravelNextLineText、GetTravelLineNumber
* guipanedlayout新增函数Create
* 修正了内部CloseWindow时循环调用触发close的问题
0.2.0.0 2025-04-12 calvin
* 重构了窗口对象、布局对象、控件对象的内部数据结构
* 为每一个布局对象都创建Create*Layout这样的函数以多个地方复用,且guiwindow_obj传递逻辑移出Create*Layout函数
* 为每一个布局对象新增函数IsChildType、SetTag、GetTag
* 为每一个布局对象新增自己的Create函数
* guinotebooklayout布局对象新增函数IsCurrentPageType
* guipanedlayout布局对象新增函数GetChildWithType
* 修正了菜单项绑定快捷键的一个BUG
0.1.12.0 2025-03-28 calvin
* guinotebooklayout布局对象新增函数GetPageCount、GetPageByNo
* guiwindow窗口对象新增函数SetCloseWindowEventCallback代替老函数
0.1.11.0 2025-03-26 calvin
* 所有控件对象的函数SetSensitive改名为SetEnable
* guinotebooklayout布局对象新增函数SetCurrentPageByNo、GetCurrentPageNo、RemovePage
0.1.10.0 2025-03-25 calvin
* 全体布局对象新增函数GetChildByType
* guisourceeditarea控件对象新增函数SetModified、SaveFile
* guinotebooklayout布局对象新增函数GetCurrentPageByType
* 精简了guicombobox控件对象的直接属性
* 调整了所有布局对象和控件对象的直接属性中的字段顺序
0.1.9.0 2025-03-23 calvin
* guieditarea和guisourceeditarea新增函数SetModifiedChangedEventCallback、GetModified
* guinotebooklayout新增函数SetCurrentPageLabel
0.1.8.0 2025-03-21 calvin
* guimenuitem和guicheckmenuitem菜单项对象新增函数SetAcceleratorKey
0.1.7.0 2025-03-20 calvin
* 新增guikey枚举对象
0.1.6.0 2025-03-09 calvin
* 新增guicheckmenuitem控件对象
0.1.5.0 2025-03-09 calvin
* 新增公函GetFilenamePtr
* guisourceeditarea的LoadFile函数会自动尝试识别语言类型和加载语法高亮;z语言语法配置文件暂时放在zlang项目的GtkSourceView目录里层
0.1.4.0 2025-03-07 calvin
* guisourceeditarea控件对象新增函数LoadFile
0.1.3.0 2025-03-02 calvin
* 新增guisourceeditarea,依赖第三方开源库gtksourceview-3
0.1.2.0 2025-02-23 calvin
* guilabel控件对象新增函数SetLabel、GetLabel
* guiedit控件对象新增函数GetLabel
0.1.1.0 2025-02-21 calvin
* guiradiobutton控件对象修正了设置组的问题
* guiradiobutton控件对象修正了获得控件内空文本的问题
* 所有控件对象新增函数SetWidthSize、SetHeightSize、GetControlName
* guiradiobutton控件对象新增函数SetToggledEventCallback
* guiedit控件对象新增函数SetText
0.1.0.0 2025-02-20 calvin
* 函数原型调整:控件Create系列函数第一个参数必是guiwindow win,以前的只有设置事件回调函数时才前置传入参数guiwindow win被去掉了
0.0.23.0 2025-02-17 calvin
* 所有控件新增函数SetSensitiveTo,用于当前控件的可用性与一个guiradiobutton是否选中绑定
0.0.22.0 2025-02-16 calvin
* 修正了guiradiobutton分组设置控件名字的问题
* 调整了guiedit的Create系列函数原型
0.0.21.0 2025-02-15 calvin
* 新增guifilechooserdialog、guifontchooserdialog对话框对象
0.0.20.0 2025-02-14 calvin
* 新增guicolorchooserdialog对话框对象
0.0.19.0 2025-02-13 calvin
* guiwindow对象新增函数SetIcon、Resize、SetPosition、SetFullscreen、Maximize、Unmaximize、Iconify、SetResizable、SetDeletable、SetInteractiveDebugging
* 所有控件对象新增函数SetTooltipText、SetVisible、SetSensitive、GetWidth、GetHeight、IsVisible、IsSensitive
0.0.18.0 2025-02-12 calvin
* 新增guinotebooklayout布局对象
* 新增guilinkbutton控件对象
0.0.17.0 2025-02-10 calvin
* guicombobox控件对象新增函数AppendItem以支持加入各种显示对象和背景私有对象
0.0.16.0 2025-02-10 calvin
* guilistbox控件对象新增函数SetSelectedRowsChangedEventCallback
* guilistbox控件对象新增函数AppendItem以支持加入各种显示对象和背景私有对象
0.0.15.0 2025-02-09 calvin
* 新增guiseparator控件对象
* 新增guiorientation、guimouse枚举属性对象
* 窗口和所有控件新增鼠标击下和弹上事件回调,guilabel等特殊处理也支持了
* 支持鼠标点击弹出菜单
0.0.14.0 2025-02-07 calvin
* 新增guipanedlayout布局对象
0.0.13.0 2025-02-06 calvin
* 新增framelayout布局对象
* 控件设置事件回调时,变为只是保存,等guiwindow.Open时才真正注册事件回调函数
0.0.12.0 2025-02-05 calvin
* 控件Create和Set系列函数代码进行了重构,相似代码封装成宏,便于快速开发新控件和快速完善错误处理
* 所有布局对象支持递归创建,提供用户构建复杂界面能力
* 调整了guimenu系列控件对象和guitoolbar控件对象的接口模型
0.0.11.0 2025-02-04 calvin
* guiwindow窗口对象新增函数SetWindowType
* guiwindow函数SetWindowType支持guiwindow.DIALOG_WINDOW_TYPE了,对话框类型的窗口会自动设置内间距
* guiwindow函数SetWindowType支持guiwindow.SINGLE_DOCUMENT_WINDOW_TYPE了,自动创建guimenubar、guitoolbar、guiboxlayout对象,用户子布局对象下挂到guiboxlayout下,整出了一个DEMO:test_singledocumentwindowtype_1.z
0.0.10.0 2025-02-03 calvin
* 对回调事件处理的代码进行了抽象重构
* 窗口对象和所有控件对象新增公共函数SetFocusInEventProc、SetFocusOutEventProc
* guiedit控件对象新增函数SetPlaceHolder
* guiboxlayout布局对象新增函数SetMaginWidth
* guigridlayout布局对象新增函数SetSpacingWidth
* 新增guitoolbar控件对象
* 简化了一些代码
0.0.9.0 2025-02-02 calvin
* 新增guilevelbar控件对象、guiprogressbar控件对象
* 新增guiimage控件对象
* 新增guiswitch控件对象
0.0.8.0 2025-01-31 calvin
* 新增guitogglebutton控件对象
* 新增guimenubar、guimenu、guimenuitem控件对象
0.0.7.0 2025-01-30 calvin
* 新增guiradiobutton控件对象
0.0.6.0 2025-01-29 calvin
* 新增guicheckbutton控件对象
0.0.5.0 2025-01-27 calvin
* 新增guicombobox控件对象、guispinbutton控件对象、guieditarea控件对象
* 新增guiscrollwindow布局对象
0.0.4.0 2025-01-26 calvin
* 新增guilabel控件对象、guiedit控件对象、guilistbox控件对象
0.0.3.0 2025-01-22 calvin
* 新增guiaboutdialog对话框对象
0.0.2.0 2025-01-22 calvin
* 完成布局对象和控件对象之间的抽象代码结构设计
* 新增guifixedlayout布局对象、guiboxlayout布局对象、guigridlayout布局对象
* 提供初版消息对话框对象
0.0.1.0 2025-01-11 calvin
* 创建项目
--------------------------------------------------------
一、gtk-zlang介绍
gtk-zlang是基于zlang编程语言的GTK封装包装库,打造跨平台的开源GUI技术栈,让开发者快速开发跨平台的桌面应用软件。
二、底层优势
zlang编程语言是一门原创自研、支持中文编程、融合和创新语法设计并保持简洁高效、开箱即用、跨平台+高性能的编程语言;
GTK是一个免费、开源、跨平台的图形用户界面(GUI)开发工具包,它提供了一套丰富的控件(如按钮、对话框、菜单、滑块等)用于创建GUI图形界面应用程序,它支持Linux 、Windows和MacOS;
三、核心亮点
- 完整
GTK控件绑定
- 深度封装
GTK标准控件,用zlang代码可直接调用窗口、对话框、文本框、表格、树视图、弹窗、等全套控件,支持CSS样式、事件回调函数等;
- 原生跨平台桌面支持
- 依托
GTK跨平台特性,zlang源代码编写一次即可在Linux 、Windows和MacOS上运行;
- 轻量化GUI快速开发
- 使用简洁的类
C/C++/Java风格zlang代码快速构建GUI窗体和控件、以及事件回调处理逻辑,易上手,学习曲线平缓,一站式完成“静态界面、动态交互”桌面应用软件开发;
- 还能使用XML描述性配置来声明式构建窗体和控件,工作量再缩减一半以上,也更方便理解和修改;
gtk-zlang包装了GTK,同时还做了一定的封装,使得开发更加方便、集成、高效;
- 无缝联动
zlang生态
- 可直接复用
zlang标准库文件读写、网络、数据库等处理能力,以及第三方封装好的zlang对象库;
- 低资源占用
- 不同于
Electron的臃肿和占内存,zlang和gtk-zlang技术栈走的是另一条技术路线,解释语言zlang可以让开发者快速开发应用软件,应用逻辑细节处理都用C封装成zlang对象在zlang代码中直接调用,既可以快速开发原型和调试,又保证了运行性能、商业机密/算法专利和防篡改,同时还极大的缩小了安装包大小和内存占用;
- 开源驱动、持续迭代
gtk-zlang是开源的,这意味着它是社区驱动而不是商业公司控制,学习者可以访问完整源代码,开源开发者可以提交补丁和贡献特性;使用gtk-zlang完全免费,不像QT 需要支付高昂的授权费用;
四、功能和能力
gtk-zlang包装了丰富的窗体对象、布局对象、控件对象和工具对象,也封装了一些原生繁琐的常用操作,供zlang开发者调用,快速构建桌面应用软件。
以下是目前已经包装封装好的对象清单:
| 对象类型 |
对象清单 |
| 窗体对象 |
窗口、消息对话框、文件对话框、颜色对话框、字体对话框 |
| 布局对象 |
固定位置布局、盒子布局、对齐盒子布局、流式盒子布局、网格布局、滚动条布局、外框布局、标签页布局、分隔栏布局、弹出浮动窗体布局 |
| 控件对象 |
菜单栏类:菜单栏、菜单、菜单项
工具栏类:工具栏、工具栏分隔条
普通控件类:标签控件、行编辑控件、块编辑控件、高级块编辑控件
按钮和选择框类:按钮控件、切换按钮控件、数值调整按钮控件、链接按钮控件、单选框控件、多选框控件
列表和表格类:列表框控件、下拉列表框控件、表格控件、树型表格控件
杂类:容量控件、进度条控件、切换开关控件、日历控件、图像控件、图片控件、视频播放器控件、分割线控件 |
| 工具对象 |
鼠标、键、方向、控件对齐、文本对齐、监视器、剪贴板、许可协议 |
五、安装说明
安装说明
六、代码示例
hello world
国际惯例,学习一门新语言或新技术首先写一个简单完整的示例案例感受一下,表示我上手了。
import stdtypes stdio gtk ;
function int main( array args )
{
guiwindow win ;
try
{
win.SetTitle( "hello gtk-zlang" );
win.SetSize( 400 , 300 );
win.SetChild( <object> guilabel.Create(win,"Hello world").SetExpand(true).SetAlign(guialign.CENTER) );
win.OpenWindow();
catch
{
guimessagedialog.ModalOpenDialog( win , guimessagedialog.ERROR_TYPE , zexception.GetExceptionName() , zexception.GetExceptionDesc() , guibutton.BUTTONS_OK ) ;
}
}
return 0;
}

也可以用XML来构造窗口,效果同上:
import stdtypes stdio gtk ;
function int main( array args )
{
guiwindow win ;
try
{
win.BuildFromXml( "
<window title='hello gtk-zlang' size='400*300'>
<label expand='true' align='CENTER'>Hello world</label>
</window>
" );
win.OpenWindow();
catch
{
guimessagedialog.ModalOpenDialog( win , guimessagedialog.ERROR_TYPE , zexception.GetExceptionName() , zexception.GetExceptionDesc() , guibutton.BUTTONS_OK ) ;
}
}
return 0;
}
复杂对话框
...
function int main( array args )
{
guiwindow win ;
try
{
win.BuildFromXml( "
<window window-type='DIALOG_WINDOW_TYPE' title='win-zcrypto' control-default-margin='5'>
<notebooklayout>
<vboxlayout notebooklayout-title='Digest'>
<hboxlayout>
<label>Artimetic :</label>
<combobox name='digest_artimetic_COMBOBOX'>
<comboboxitem>MD4</comboboxitem>
<comboboxitem>MD5</comboboxitem>
<comboboxitem selected>SHA1</comboboxitem>
<comboboxitem>SHA224</comboboxitem>
<comboboxitem>SHA256</comboboxitem>
<comboboxitem>SHA384</comboboxitem>
<comboboxitem>SHA512</comboboxitem>
</combobox>
</hboxlayout>
<hseparator />
<gridlayout>
<r>
<c r-span='4' align='START'><label vertical-align='START'>Input :</label></c>
<c><radiobutton group='digest_input_FORMAT' label='TEXT' checked='true' /></c>
<c r-span='3'><scrollwindowlayout><editarea name='digest_input_EDITAREA' size='700*100' horizontal-expand='true' /></scrollwindowlayout></c>
</r>
<r>
<c />
<c><radiobutton group='digest_input_FORMAT' label='HEXSTR' /></c>
<c />
</r>
<r>
<c />
<c><radiobutton group='digest_input_FORMAT' label='BASE64' /></c>
<c />
</r>
<r>
<c />
<c><radiobutton group='digest_input_FORMAT' label='FILE' toggle-event-callback='radiobtn_digest_input_FORMAT_FILE_OnToggled' /></c>
<c><edit name='digest_input_filename_EDIT' horizontal-expand='true' /></c>
</r>
</gridlayout>
<hseparator />
<gridlayout>
<r>
<c r-span='3' align='START'><label vertical-align='START'>Salt :</label></c>
<c><radiobutton group='digest_salt_FORMAT' label='TEXT' checked='true' /></c>
<c r-span='3'><scrollwindowlayout><editarea name='digest_salt_EDIT' size='700*100' horizontal-expand='true' /></scrollwindowlayout></c>
</r>
<r>
<c />
<c><radiobutton group='digest_salt_FORMAT' label='HEXSTR' /></c>
<c />
</r>
<r>
<c />
<c><radiobutton group='digest_salt_FORMAT' label='BASE64' /></c>
<c />
</r>
</gridlayout>
<hseparator />
<button label='>>> Hash <<<' click-event-callback='btn_digest_calc_OnClick' name='digest_hash_BUTTON' horizontal-expand='true' horizontal-align='FILL' />
<hseparator />
<gridlayout>
<r>
<c r-span='2' align='START'><label vertical-align='START'>Output :</label></c>
<c><radiobutton group='digest_output_FORMAT' label='HEXSTR' checked='true' /></c>
<c r-span='2'><editarea name='digest_output_EDITAREA' size='600*100' horizontal-expand='true' /></c>
</r>
<r>
<c />
<c><radiobutton group='digest_output_FORMAT' label='BASE64' /></c>
<c />
</r>
</gridlayout>
</vboxlayout>
...
</notebooklayout>
</window>
" );
win.OpenWindow();
catch
{
stdout.Println( zexception.GetExceptionDesc() );
}
}
return 0;
}
...

多文档窗体(含菜单栏、工具栏、多标签布局、状态栏)
...
function int CreateWindow()
{
try
{
main_win.BuildFromXml( "
<window window-type='MULTIPLE_DOCUMENT_WINDOW_TYPE' title='ZEUX' maximize close-window-event-callback='CloseWindow'>
<menubar>
<menubaritem label='File'>
<menu>
<menusection>
<menuitem label='New' activate-event-callback='File_New_menuitem_OnClicked' accelerator-key='<ctrl>n' />
<menuitem label='Open' activate-event-callback='File_Open_menuitem_OnClicked' accelerator-key='<ctrl>o' />
<menuitem label='Save' activate-event-callback='File_Save_menuitem_OnClicked' accelerator-key='<ctrl>s' />
<menuitem label='Close' activate-event-callback='File_Close_menuitem_OnClicked' />
</menusection>
</menu>
</menubaritem>
<menubaritem label='Edit'>
<menu>
<menusection>
<menuitem label='Undo' activate-event-callback='Edit_Undo_menuitem_OnClicked' accelerator-key='<ctrl>z' />
<menuitem label='Redo' activate-event-callback='Edit_Redo_menuitem_OnClicked' accelerator-key='<ctrl>y' />
</menusection>
<menusection>
<menuitem label='Cut' activate-event-callback='Edit_Cut_menuitem_OnClicked' accelerator-key='<ctrl>x' />
<menuitem label='Copy' activate-event-callback='Edit_Copy_menuitem_OnClicked' accelerator-key='<ctrl>c' />
<menuitem label='Paste' activate-event-callback='Edit_Paste_menuitem_OnClicked' accelerator-key='<ctrl>v' />
<menuitem label='Delete' activate-event-callback='Edit_Delete_menuitem_OnClicked' accelerator-key='<ctrl>DEL' />
</menusection>
</menu>
</menubaritem>
<menubaritem label='Search'>
<menu>
<menusection>
<menuitem label='Find ...' activate-event-callback='Search_Find_menuitem_OnClicked' accelerator-key='<ctrl>f' />
<menuitem label='Find prev' activate-event-callback='Search_FindPrev_menuitem_OnClicked' accelerator-key='<ctrl>F3' />
<menuitem label='Find next' activate-event-callback='Search_FindNext_menuitem_OnClicked' accelerator-key='F3' />
<menuitem label='Replace ...' activate-event-callback='Search_Replace_menuitem_OnClicked' accelerator-key='<ctrl>r' />
</menusection>
</menu>
<menu>
<menusection>
<menuitem label='Advance move cursor'>
<menu>
<menusection>
<menuitem label='Move left word' activate-event-callback='Search_Advance_MoveLeftWord_menuitem_OnClicked' accelerator-key='<ctrl>LEFT' />
<menuitem label='Move right word' activate-event-callback='Search_Advance_MoveRightWord_menuitem_OnClicked' accelerator-key='<ctrl>RIGHT' />
</menusection>
</menu>
</menuitem>
<menuitem label='Basic select text'>
<menu>
<menusection>
<menuitem label='Select all' activate-event-callback='Search_BasicSelectText_SelectAll_menuitem_OnClicked' accelerator-key='<ctrl>a' />
<menuitem label='Select word' activate-event-callback='Search_BasicSelectText_SelectWord_menuitem_OnClicked' accelerator-key='<ctrl>w' />
<menuitem label='Select line' activate-event-callback='Search_BasicSelectText_SelectLine_menuitem_OnClicked' accelerator-key='<ctrl>l' />
</menusection>
</menu>
</menuitem>
<menuitem label='Advance select text'>
<menu>
<menusection>
<menuitem label='Append select left word' activate-event-callback='Search_AdvanceSelectText_AppendSelectLeftWord_menuitem_OnClicked' accelerator-key='<ctrl><shift>LEFT' />
<menuitem label='Append select right word' activate-event-callback='Search_AdvanceSelectText_AppendSelectRightWord_menuitem_OnClicked' accelerator-key='<ctrl><shift>RIGHT' />
</menusection>
</menu>
</menuitem>
<menuitem label='Goto'>
<menu>
<menusection>
<menuitem label='Goto line' activate-event-callback='Search_Goto_GotoLine_menuitem_OnClicked' accelerator-key='<ctrl>g' />
<menuitem label='Goto file offset' activate-event-callback='Search_Goto_GotoFileOffset_menuitem_OnClicked' />
<menuitem label='Goto line offset' activate-event-callback='Search_Goto_GotoLineOffset_menuitem_OnClicked' />
</menusection>
</menu>
</menuitem>
</menusection>
</menu>
</menubaritem>
<menubaritem label='View'>
<menu>
<menusection>
<menuitem label='Font ...' activate-event-callback='View_Font_menuitem_OnClicked' />
</menusection>
</menu>
</menubaritem>
<menubaritem label='Environment'>
<menu>
<menusection>
<menuitem label='Window popup menu' checked='false' activate-event-callback='Environment_WindowPopupMenu_menuitem_OnClicked' name='menubar_Environment_Window-popup-menu_menuitem' />
</menusection>
</menu>
</menubaritem>
<menubaritem label='Help'>
<menu>
<menusection>
<menuitem label='About' activate-event-callback='Help_About_menuitem_OnClicked' />
</menusection>
</menu>
</menubaritem>
</menubar>
<toolbar>
<button icon='document-new' click-event-callback='File_New_toolbuttonitem_OnClicked' tooltip='New File' />
<button icon='document-open' click-event-callback='File_Open_toolbuttonitem_OnClicked' tooltip='Open File' />
<button icon='document-save' click-event-callback='File_Save_toolbuttonitem_OnClicked' tooltip='Save File' />
<toolseparatoritem />
<button icon='edit-undo' click-event-callback='Edit_Undo_toolbuttonitem_OnClicked' tooltip='Undo' />
<button icon='edit-redo' click-event-callback='Edit_Redo_toolbuttonitem_OnClicked' tooltip='Redo' />
<toolseparatoritem />
<button icon='edit-cut' click-event-callback='Edit_Cut_toolbuttonitem_OnClicked' tooltip='Cut' />
<button icon='edit-copy' click-event-callback='Edit_Copy_toolbuttonitem_OnClicked' tooltip='Copy' />
<button icon='edit-paste' click-event-callback='Edit_Paste_toolbuttonitem_OnClicked' tooltip='Paste' />
<button icon='edit-delete' click-event-callback='Edit_Delete_toolbuttonitem_OnClicked' tooltip='Delete' />
<toolseparatoritem />
<button icon='application-exit' click-event-callback='File_Exit_toolbuttonitem_OnClicked' tooltip='Exit' />
</toolbar>
<statusbar>
<label name='Processing_Info' horizontal-expand='true' horizontal-align='CENTER' />
<label name='RowNo_ColNo_FileOffset' horizontal-expand='true' horizontal-align='CENTER' />
<label name='Newline_Mode' horizontal-expand='true' horizontal-align='CENTER' />
<label name='File_Encoding' horizontal-expand='true' horizontal-align='CENTER' />
</statusbar>
</window>
" );
main_win.ShowWindow();
keys_val = regedit.QueryKeys( regedit.HKEY_CLASSES_ROOT , '''*\shell\ZEUX''' ) ;
if( keys_val )
main_win.GetControlByName("menubar_Environment_Window-popup-menu_menuitem").SetChecked( true );
else
main_win.GetControlByName("menubar_Environment_Window-popup-menu_menuitem").SetChecked( false );
catch
{
message = string.FormatString( "exception name : %s\nexception desc : %s\nsource filename : %s:%d\nobject name : %s\nfunction name : %s\n"
, zexception.GetExceptionName() , zexception.GetExceptionDesc()
, zexception.GetExceptionSourceFilename() , zexception.GetExceptionSourceRow()
, zexception.GetExceptionObjectName() , zexception.GetExceptionFunctionName() ) ;
guimessagedialog.ModalOpenDialog( main_win , guimessagedialog.ERROR_TYPE , "Main_Window" , message , guibutton.BUTTONS_OK ) ;
return zexception.SetException();
}
}
return 0;
}
...

七、官方提供的控件使用代码示例目录
源代码包路径:\gtk\test\*.z。
八、官方开发的桌面应用软件
- msgdialog——用
zlang语言开发的模拟Windows消息对话框,可在应用中引用使用;
- zcrypto —— 用
zlang语言+gtk-zlang开发的桌面安全算法工具(包含命令行模式和图形模式);
- ZEUX —— 用
zlang语言+gtk-zlang开发的桌面文本/源代码编辑器;
- ZephPlayer —— 用
zlang语言+gtk-zlang开发的桌面多媒体播放器;
九、快速开始
- 源码仓库地址:https://gitee.com/calvinwilliams/gtk-zlang (仓库内含整套源代码、测试用例与详细介绍)
十、关于作者
gtk-zlang由独立开发者calvinwilliams从零研发,历时多年打造。