C语言:在 Win 10 上,编译 Gtk-3 打开文件对话框 的示例

发布于:2025-05-18 ⋅ 阅读:(16) ⋅ 点赞:(0)

国内阿里镜像下载 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)

  1. 安装 GTK3 开发环境(如果尚未安装):

    pacman -S mingw-w64-x86_64-gtk3
    
  2. 编译代码(假设文件名为 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

    1. 将 GTK 的运行时 DLL(如 libgtk-3-0.dll)复制到程序目录(位于 C:\msys64\mingw64\bin)。
    2. 双击运行 gtk_file_dialog.exe
  • Linux
    直接运行编译后的可执行文件:

    ./gtk_file_dialog
    

在这里插入图片描述


4. 关键代码说明

  1. 创建对话框

    gtk_file_chooser_dialog_new("标题", 父窗口, 动作模式, 按钮列表...);
    
    • 支持多种动作模式:
      • GTK_FILE_CHOOSER_ACTION_OPEN:打开文件
      • GTK_FILE_CHOOSER_ACTION_SAVE:保存文件
      • GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER:选择目录
  2. 获取文件路径

    gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
    
  3. 释放资源

    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 风格的跨平台文件对话框。


网站公告

今日签到

点亮在社区的每一天
去签到