如何在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
相关产品推荐
相关产品推荐

