
- 安装GTK3_x64版本并配置项目属性
可在WINDOWS下直接安装,也可先安装MSYS2然后通过它管理以后的安装包,有点类似linux下的pacman安装包管理。安装步骤从略,并假设安装在了如下位置:

开发时需include和lib,在poseidonFB下项目属性配置如下。

项目属性编译器配置如下:

编译器设置为 x64位编译

- 编写测试程序
vbscript
' 引入GTK 3库(需确保FB环境已关联GTK 3开发文件)
#DEFINE __USE_GTK3__
#Include Once "windows.bi"
#Include Once "gtk/gtk.bi"
#include once "utf_conv.bi"
#include once "crt/string.bi"
' 定义全局控件指针,供回调函数访问
Dim Shared btn1 As GtkWidget Ptr, btn2 As GtkWidget Ptr, btn3 As GtkWidget Ptr
'Dim Shared list_box As GtkWidget Ptr, combo_box As GtkWidget Ptr
Dim Shared text_box As GtkWidget Ptr, label As GtkWidget Ptr
Declare Sub Btn1_CB(ByVal widget As GtkWidget Ptr, ByVal idata As gpointer)
Declare Sub Btn2_CB(ByVal widget As GtkWidget Ptr, ByVal idata As gpointer)
Declare Sub Btn3_CB(ByVal widget As GtkWidget Ptr, ByVal idata As gpointer)
Declare Sub BuildUI(ByVal windowx As GtkWidget Ptr)
Declare Function toUTF8a(ByVal swStringIN as WString ptr) As ZString ptr
Function toUTF8(ByVal swStringIN as WString ptr) As ZString ptr
Dim wideStr as wstring * 50 = *sWStringIN
Static utf8str as zstring * 150
Dim utf8Size as Integer
utf8str = ""
utf8Size = WideCharToMultiByte(CP_UTF8, 0, @wideStr, -1, NULL, 0, NULL, NULL)
utf8Size = WideCharToMultiByte(CP_UTF8, 0, @wideStr, -1, @utf8str, utf8Size, NULL, NULL)
return @utf8str
End function
Function toUTF8a(ByVal swStringIN as WString ptr) As ZString ptr
Dim wideStr as wstring * 50 = *sWStringIN
Static utf8str as zstring * 150
Dim utf8Size as Integer
utf8str = ""
WCharToUTF( UTF_ENCOD_UTF8, @wideStr, len(wideStr) + 1, @utf8str, @utf8Size)
return @utf8str
End function
' 按钮1回调:文本框显示"Hello World, 问候世界!"
Sub Btn1_CB(ByVal widget As GtkWidget Ptr, ByVal idata As gpointer)
gtk_entry_set_text(GTK_ENTRY(text_box), toUTF8a("Hello World, 问候世界!")) ' 文本框赋值
End Sub
' 按钮2回调:退出程序
Sub Btn2_CB(ByVal widget As GtkWidget Ptr, ByVal idata As gpointer)
gtk_main_quit() ' 终止GTK消息循环,退出程序
End Sub
' 按钮3回调(预留扩展)
Sub Btn3_CB(ByVal widget As GtkWidget Ptr, ByVal idata As gpointer)
' 可在此添加自定义功能
End Sub
' 构建界面函数
Sub BuildUI(ByVal windowx As GtkWidget Ptr)
' 创建布局容器(垂直盒子)
Dim main_box As GtkWidget Ptr = gtk_vbox_new(GTK_ORIENTATION_VERTICAL, 10)
gtk_container_set_border_width(GTK_CONTAINER(main_box), 15) ' 内边距
gtk_container_add(GTK_CONTAINER(windowx), main_box)
' 顶部区域:标签+文本框+下拉框(水平盒子)
Dim top_box As GtkWidget Ptr = gtk_hbox_new(GTK_ORIENTATION_HORIZONTAL, 10)
label = gtk_label_new(toUTF8a("文本显示:"))
text_box = gtk_entry_new() ' 文本框
' 添加到顶部盒子
gtk_box_pack_start(GTK_BOX(top_box), label, FALSE, FALSE, 0)
gtk_box_pack_start(GTK_BOX(top_box), text_box, TRUE, TRUE, 0) ' 文本框水平拉伸
'gtk_box_pack_start(GTK_BOX(top_box), combo_box, FALSE, FALSE, 0)
gtk_box_pack_start(GTK_BOX(main_box), top_box, FALSE, FALSE, 0)
' 按钮区域:三个按钮(水平盒子)
Dim btn_box As GtkWidget Ptr = gtk_hbox_new(GTK_ORIENTATION_HORIZONTAL, 10)
btn1 = gtk_button_new_with_label(toUTF8a("显示/添加内容"))
btn2 = gtk_button_new_with_label(toUTF8a("退出程序"))
btn3 = gtk_button_new_with_label(toUTF8a("预留功能"))
' 绑定按钮事件
g_signal_connect(btn1, "clicked", G_CALLBACK(@Btn1_CB), NULL)
g_signal_connect(btn2, "clicked", G_CALLBACK(@Btn2_CB), NULL)
g_signal_connect(btn3, "clicked", G_CALLBACK(@Btn3_CB), NULL)
' 添加到按钮盒子
gtk_box_pack_start(GTK_BOX(btn_box), btn1, True, True, 0)
gtk_box_pack_start(GTK_BOX(btn_box), btn2, FALSE, FALSE, 0)
gtk_box_pack_start(GTK_BOX(btn_box), btn3, FALSE, FALSE, 0)
gtk_box_pack_start(GTK_BOX(main_box), btn_box, FALSE, FALSE, 0)
' 列表框:创建带模型的列表
Dim list_model As GtkListStore Ptr = gtk_list_store_new(1, G_TYPE_STRING)
Dim cell_renderer As GtkCellRenderer Ptr = gtk_cell_renderer_text_new()
' 显示所有控件
gtk_widget_show_all(GTK_WIDGET(windowx))
End Sub
' 主程序入口
Sub Main()
' 初始化GTK
gtk_init(NULL, NULL)
' 创建主窗口
Dim window1 As GtkWidget Ptr = gtk_window_new(GTK_WINDOW_TOPLEVEL)
gtk_window_set_title(GTK_WINDOW(window1), toUTF8a("FB + GTK 程序框架"))
gtk_window_set_default_size(GTK_WINDOW(window1), 700, 500) ' 初始大小
gtk_window_set_position(GTK_WINDOW(window1), GTK_WIN_POS_CENTER) ' 居中显示
' 绑定窗口关闭事件(点击右上角X也能退出)
g_signal_connect(window1, "destroy", G_CALLBACK(@gtk_main_quit), NULL)
' 构建界面
BuildUI(window1)
' 启动GTK消息循环
gtk_main()
End Sub
' 启动程序
Main()
说明:IUP使用UTF8,GTK3也使用UTF8,因此调用时都需要将宽字符转换为UTF8,以解决乱字符问题。
程序中有toUTF8和toUTF8a两个转换函数,toUTF8是基于window.bi的windows转换方式,在windows平台上适合,toUTF8a是基于c运行库crt下的string.bi和转换函数实现在,可以在其它平台上使用。
- 界面设计
界面设计是由豆包写的,做了些修改。问句如下:
"用freebasic和gtk写程序框架,包括3外button,1个textbox和1个label,点击button1时在textbox中显示hello world,在列表框中添加1项hello everyone,点击button2时结束并退出程序。"
如果喜欢RAD开发,可以使用glade界面设计工具

设计好的文件是UI为扩展名的xml文件,在程序中调出它,写回调函数,不需要摆放控件,需要修改时打开设计器再修改、保存,程序编译时会再调用新的界面ui文件。

界面设计基本思路
先考虑标准界面的摆放样子,然后考虑放大后的摆放样子,然后把它们放在先垂直boxsizer里面,再内放水平boxsizer,让组件在合适空间摆放,类似先设计个大房间,然后分区,在分区中摆放东西。适应这种方式的设计后,直接写代码摆放就变得容易了。Gtk, wxWidgets, IUP,界面设计思路类似。豆包是个好东西,只要描述的足够清楚,还是能给出不错的代码框架的。