You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中结合使用GTK/GTK3与graphics.h?

在C语言中用GTK3实现点击按钮绘制正方形的功能

首先明确:graphics.h是Turbo C时代的DOS图形库,和现代GTK3完全不兼容——前者依赖老式DOS图形模式,后者基于现代窗口系统(X11/Win32/macOS Quartz),二者无法直接混用。想要实现点击按钮绘图的需求,直接用GTK3自带的绘图API即可,无需依赖graphics.h。

以下是完整实现代码:

#include <gtk/gtk.h>

// 全局变量标记是否需要绘制正方形
gboolean draw_square = FALSE;

// 绘图回调函数:在DrawingArea上绘制内容
static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data) {
    if (!draw_square) return FALSE;

    // 获取DrawingArea的尺寸
    gint width = gtk_widget_get_allocated_width(widget);
    gint height = gtk_widget_get_allocated_height(widget);

    // 设置绘图颜色为红色
    cairo_set_source_rgb(cr, 1.0, 0.0, 0.0);
    // 设置线宽
    cairo_set_line_width(cr, 2.0);

    // 计算正方形的位置(居中)
    gint square_size = MIN(width, height) / 2;
    gint x = (width - square_size) / 2;
    gint y = (height - square_size) / 2;

    // 绘制正方形
    cairo_rectangle(cr, x, y, square_size, square_size);
    cairo_stroke(cr);

    return FALSE;
}

// 按钮点击回调函数:触发绘图标记并刷新DrawingArea
static void on_button_clicked(GtkWidget *button, gpointer user_data) {
    draw_square = TRUE;
    // 强制刷新DrawingArea,触发on_draw_event
    gtk_widget_queue_draw(GTK_WIDGET(user_data));
}

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), "GTK3 绘图示例");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    // 创建垂直布局容器
    GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
    gtk_container_add(GTK_CONTAINER(window), vbox);
    gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);

    // 创建按钮
    GtkWidget *button = gtk_button_new_with_label("绘制正方形");
    gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);

    // 创建绘图区域
    GtkWidget *drawing_area = gtk_drawing_area_new();
    gtk_box_pack_start(GTK_BOX(vbox), drawing_area, TRUE, TRUE, 0);

    // 连接信号
    g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), drawing_area);
    g_signal_connect(drawing_area, "draw", G_CALLBACK(on_draw_event), NULL);

    // 显示所有部件
    gtk_widget_show_all(window);

    gtk_main();
    return 0;
}

编译与运行

在Linux环境下,确保已安装GTK3开发包(比如libgtk-3-dev),然后用以下命令编译:

gcc `pkg-config --cflags gtk+-3.0` -o gtk_draw_square gtk_draw_square.c `pkg-config --libs gtk+-3.0`

运行生成的可执行文件:

./gtk_draw_square

代码说明

  • 绘图逻辑:通过DrawingArea部件的draw信号触发绘图,使用Cairo绘图库(GTK3默认渲染后端)绘制正方形。
  • 按钮交互:点击按钮时设置draw_square标记为TRUE,并调用gtk_widget_queue_draw强制刷新绘图区域,触发重绘。
  • 兼容性:代码可在Linux、Windows(通过MSYS2/MinGW)、macOS等支持GTK3的平台运行,完全替代老式graphics.h的功能。

内容的提问来源于stack exchange,提问作者Wdofgok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:25:26