/* 绘图软件 draw.c */
#include <gtk/gtk.h>
static GtkWidget *window = NULL;
static GdkPixmap *pixmap = NULL;
static gboolean
scribble_configure_event (GtkWidget *widget,GdkEventConfigure *event,gpointer data)
{if (pixmap)g_object_unref (G_OBJECT (pixmap));pixmap = gdk_pixmap_new (widget->window,widget->allocation.width,widget->allocation.height,-1);gdk_draw_rectangle (pixmap,widget->style->white_gc,TRUE,0,0,widget->allocation.width,widget->allocation.height);return TRUE;
}
static gboolean scribble_expose_event (GtkWidget *widget,GdkEventExpose *event,gpointer data)
{gdk_draw_drawable (widget->window,widget->style->fg_gc[GTK_WIDGET_STATE (widget)],pixmap,event->area.x, event->area.y,event->area.x, event->area.y,event->area.width, event->area.height);return FALSE;
}
static void draw_brush (GtkWidget *widget, gdouble x, gdouble y)
{GdkRectangle update_rect;update_rect.x = x - 3;update_rect.y = y - 3;update_rect.width = 6;update_rect.height = 6;gdk_draw_rectangle (pixmap,widget->style->black_gc,TRUE,update_rect.x, update_rect.y,update_rect.width, update_rect.height);gdk_window_invalidate_rect (widget->window,&update_rect,FALSE);
}
static gboolean scribble_button_press_event (GtkWidget *widget,GdkEventButton *event,gpointer data)
{if (pixmap == NULL)return FALSE;if (event->button == 1)draw_brush (widget, event->x, event->y);return TRUE;
}
static gboolean scribble_motion_notify_event (GtkWidget *widget,GdkEventMotion *event,gpointer data)
{int x, y;GdkModifierType state;if (pixmap == NULL)return FALSE;gdk_window_get_pointer (event->window, &x, &y, &state);if (state & GDK_BUTTON1_MASK)draw_brush (widget, x, y);return TRUE;
}
static gboolean checkerboard_expose (GtkWidget *da, GdkEventExpose *event,gpointer data)
{gint i, j, xcount, ycount;GdkGC *gc1, *gc2;GdkColor color;
#define CHECK_SIZE 10
#define SPACING 2gc1 = gdk_gc_new (da->window);color.red = 30000;color.green = 0;color.blue = 30000;gdk_gc_set_rgb_fg_color (gc1, &color);gc2 = gdk_gc_new (da->window);color.red = 65535;color.green = 65535;color.blue = 65535;gdk_gc_set_rgb_fg_color (gc2, &color);xcount = 0;i = SPACING;while (i < da->allocation.width){j = SPACING;ycount = xcount % 2;while (j < da->allocation.height){GdkGC *gc;if (ycount % 2)gc = gc1;elsegc = gc2;gdk_draw_rectangle (da->window, gc, TRUE,i, j, CHECK_SIZE, CHECK_SIZE);j += CHECK_SIZE + SPACING;++ycount;}i += CHECK_SIZE + SPACING;++xcount;}g_object_unref (G_OBJECT (gc1));g_object_unref (G_OBJECT (gc2));return TRUE;
}
int main (int argc,char* argv[])
{GtkWidget *frame;GtkWidget *vbox;GtkWidget *da;GtkWidget *label;gtk_init(&argc,&argv);window = gtk_window_new (GTK_WINDOW_TOPLEVEL);gtk_window_set_title (GTK_WINDOW (window), "绘图软件");g_signal_connect (G_OBJECT(window), "delete_event",G_CALLBACK (gtk_main_quit), NULL);gtk_container_set_border_width (GTK_CONTAINER (window), 10);vbox = gtk_vbox_new (FALSE, 8);gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);gtk_container_add (GTK_CONTAINER (window), vbox);label = gtk_label_new (NULL);gtk_label_set_markup (GTK_LABEL (label),"<u>绘图区域</u>");gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);frame = gtk_frame_new (NULL);gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);da = gtk_drawing_area_new ();gtk_widget_set_size_request (da, 100, 100);gtk_container_add (GTK_CONTAINER (frame), da);g_signal_connect (da, "expose_event",G_CALLBACK (scribble_expose_event), NULL);g_signal_connect (da, "configure_event",G_CALLBACK (scribble_configure_event), NULL);g_signal_connect (da, "motion_notify_event",G_CALLBACK (scribble_motion_notify_event), NULL);g_signal_connect (da, "button_press_event",G_CALLBACK (scribble_button_press_event), NULL);gtk_widget_set_events (da, gtk_widget_get_events (da)| GDK_LEAVE_NOTIFY_MASK| GDK_BUTTON_PRESS_MASK| GDK_POINTER_MOTION_MASK| GDK_POINTER_MOTION_HINT_MASK);gtk_widget_show_all (window);gtk_main();return FALSE;
}

编译与运行:

-bash-4.1$ gcc -o a draw.c `pkg-config --cflags --libs gtk+-2.0`
-bash-4.1$ ./a

GTK实现绘图功能(draw.c)相关推荐

  1. java使用重绘实现拖动_原生JS使用Canvas实现拖拽式绘图功能

    一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包含圆心坐标点和半径)等实体 2.原生JavaScript实现,不依赖任何第三方j ...

  2. 绘图神器draw.io(写文必备)

    绘图神器draw.io(写文必备) 作者:毛小悠. 写文时间:2020年10月22日 -- 学习,为了看到更大的世界. 前言 大家早上好,我是毛小悠,一个前端开发工程师. 最近发现一个绘图神器,没错, ...

  3. Matplotlib基础绘图功能 — 以折线图为例

    1 完善原始折线图 - 给图形添加辅助功能 为了更好地理解所有基础绘图功能,通过天气温度变化的绘图来融合所有的基础API使用 需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在1 ...

  4. ❤️你还在用visio画图吗?已经落伍啦!快来试试轻量级绘图神器draw.io吧!❤️

    引子 最近写模块文档,需要绘制一些程序流程示意图,之前一直用word+visio的组合,但是现在都是typora+xmind的轻组合了,所以这次也尝试了一个新的轻量级绘图工具draw.io.文末附上在 ...

  5. Qt 2D绘图功能简单总结

    文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...

  6. Python-OpenCV 笔记7 -- 绘图(Draw)

    Python-OpenCV 笔记7 – 绘图(Draw) 1.画直线 – cv2.line() 函数原型: cv2.line(img, pt1, pt2, color[, thickness[, li ...

  7. 绝了!Pandas绘图功能

    柱状图箱线图密度图条形图散点图折线图保存绘图总结 可视化是用来探索性数据分析最强大的工具之一.Pandas库包含基本的绘图功能,可以让你创建各种绘图.Pandas中的绘图是在matplotlib之上构 ...

  8. 熊猫tv新功能介绍_您应该知道的4种熊猫绘图功能

    熊猫tv新功能介绍 Pandas is a powerful package for data scientists. There are many reasons we use Pandas, e. ...

  9. 【Qt教程】3.4 - Qt5 QPainter绘图事件、绘图功能

    1. QPainter绘图事件 简介 Qt的绘图系统允许使用现同的API在屏幕和其他打印设备上进行绘制.整个绘图系统基于 QPainter.QPaintDevice.QPaintEngine 三个类. ...

最新文章

  1. 华为鸿蒙系统需要谷歌的服务器吗,华为P40或用鸿蒙系统?余承东:如果不能使用谷歌服务会考虑...
  2. iar升级芯片库_IAR 发布支持ARM Cortex系列的开发工具包
  3. 主成分分析 PCA算法
  4. #386. 【UNR #3】鸽子固定器
  5. linkedin上看到的CRM团队信息
  6. 【XML】Java对象数据的XML和JSON表示
  7. SAP License:SAP 系统参数设置
  8. 双击java安装包没有反应_win7系统双击JeR安装包没有任何反应的解决方法
  9. itextpdf 合并单元格 横向纵向
  10. 通过2048学习自定义view(二) 滑动事件监听 与 事件回调
  11. Excel绘制斜线表头
  12. 有哪些免费批量删除PDF文档的页码的方法
  13. js实现鼠标移动到div背景颜色变换,移开还原
  14. 七夕表白代码合集,建议收藏!!!
  15. 信息学奥赛一本通:1135:配对碱基链
  16. classes是什么意思怎么读_class是什么意思_class的翻译_音标_读音_用法_例句_爱词霸在线词典...
  17. 牛客—编程初学者入门训练—Kiki和酸奶(C语言实现)
  18. 小米文件管理连接服务器,小米文件管理器中的远程管理无法连接解决方法
  19. 本土英雄的退场和归来:Micromax教给了在印中国手机厂商哪些事?
  20. 微信机器人网页版接口详解

热门文章

  1. 【JDK源码分析】StringBuilder、StringBuilder、String、AbstractStringBuilder源码解析
  2. APP移动测试用例总结
  3. ECS Windows系统使用自带监视器查看IIS并发连接数
  4. Redis作为缓存服务器
  5. C/C++ 指针数组、二维数组
  6. shell实现https登录
  7. php 把图片转换成二进制流,php把图片转换成二进制流的方法
  8. 计算机考研哪个专业代码少,考研专业代码到底是什么意思
  9. XSSFWorkbook 设置单元格样式_如何设置Excel单元格才能只输入数字!
  10. string型c语言,C++中string字符串类型介绍