国内阿里镜像下载 msys2-x86_64-latest.exe
以下是一个使用 GTK-3 实现打开文件对话框的完整 C 语言示例代码,适用于 Windows 和 Linux 平台:
1. 示例代码
编写 gtk_file_dialog.c 如下
#include <gtk/gtk.h>
// 计算屏幕尺寸的 1/2 并设置对话框尺寸限制
static void set_dialog_size_constraints(GtkWidget *dialog) {
// 获取屏幕尺寸
GdkScreen *screen = gtk_widget_get_screen(dialog);
int screen_width = gdk_screen_get_width(screen);
int screen_height = gdk_screen_get_height(screen);
// 计算最大尺寸(屏幕的 1/2)
int max_width = screen_width / 2;
int max_height = screen_height / 2;
// 设置对话框的默认尺寸和最大尺寸
gtk_window_set_default_size(GTK_WINDOW(dialog), max_width, max_height);
// 设置几何约束(限制最大尺寸)
GdkGeometry geometry_hints = {
.min_width = 400, // 最小宽度
.min_height = 300, // 最小高度
.max_width = max_width,
.max_height = max_height
};
gtk_window_set_geometry_hints(
GTK_WINDOW(dialog),
NULL, // 不指定具体控件
&geometry_hints,
GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE
);
}
// 点击按钮时触发打开文件对话框
static void on_open_button_clicked(GtkWidget *widget, gpointer data) {
GtkWidget *dialog = gtk_file_chooser_dialog_new(
"选择文件",
GTK_WINDOW(data),
GTK_FILE_CHOOSER_ACTION_OPEN,
"_取消", GTK_RESPONSE_CANCEL,
"_打开", GTK_RESPONSE_ACCEPT,
NULL
);
// 设置对话框尺寸约束
set_dialog_size_constraints(dialog);
// 添加文件过滤器(可选)
GtkFileFilter *filter = gtk_file_filter_new();
gtk_file_filter_set_name(filter, "文本文件 (*.txt)");
gtk_file_filter_add_pattern(filter, "*.txt");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
// 运行对话框
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
g_print("已选择文件: %s\n", filename);
g_free(filename);
}
gtk_widget_destroy(dialog);
}
// 主窗口和主循环
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "自适应文件对话框");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
GtkWidget *button = gtk_button_new_with_label("打开文件");
g_signal_connect(button, "clicked", G_CALLBACK(on_open_button_clicked), window);
gtk_container_add(GTK_CONTAINER(window), button);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
2. 编译命令(Windows 10 + MSYS2/Mingw-w64)
安装 GTK3 开发环境(如果尚未安装):
pacman -S mingw-w64-x86_64-gtk3
编译代码(假设文件名为
gtk_file_dialog.c
):
用 MSYS2 MINGW64 终端
which gcc
which pkg-config
gcc -o gtk_file_dialog.exe gtk_file_dialog.c $(pkg-config --cflags --libs gtk+-3.0)
3. 运行程序
Windows:
- 将 GTK 的运行时 DLL(如
libgtk-3-0.dll
)复制到程序目录(位于C:\msys64\mingw64\bin
)。 - 双击运行
gtk_file_dialog.exe
。
- 将 GTK 的运行时 DLL(如
Linux:
直接运行编译后的可执行文件:./gtk_file_dialog
4. 关键代码说明
创建对话框:
gtk_file_chooser_dialog_new("标题", 父窗口, 动作模式, 按钮列表...);
- 支持多种动作模式:
GTK_FILE_CHOOSER_ACTION_OPEN
:打开文件GTK_FILE_CHOOSER_ACTION_SAVE
:保存文件GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
:选择目录
- 支持多种动作模式:
获取文件路径:
gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
释放资源:
g_free(filename); // 释放文件路径内存 gtk_widget_destroy(dialog); // 销毁对话框
5. 常见问题
报错
undefined reference to gtk_*
:
确保编译命令中正确链接 GTK 库(通过pkg-config --libs gtk+-3.0
)。对话框不显示:
检查父窗口参数是否有效(示例中传递了主窗口window
)。Windows 上界面风格不匹配:
安装 GTK 主题库(如mingw-w64-x86_64-gtk3
已包含基本主题),或设置环境变量:export GTK_THEME=Windows-10
6. 扩展功能
添加文件过滤器(仅显示特定类型文件):
GtkFileFilter *filter = gtk_file_filter_new(); gtk_file_filter_set_name(filter, "文本文件 (*.txt)"); gtk_file_filter_add_pattern(filter, "*.txt"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
多文件选择:
gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
通过此示例,你可以快速实现一个符合 GTK-3 风格的跨平台文件对话框。