当前位置:  技术问答>linux和unix

在线诚心求助 (gtk 问题)

    来源: 互联网  发布时间:2015-06-16

    本文导语:  个位高手, 小弟想在widget上画图, 比如: 先生成一个 window 然后在这个window上画出一个三角形, 图形的背景色就是窗口的颜色. 应该如何做?  我看了一些资料, 什么pixmap,gc, draw area, 把我搞晕了,特别是那个gc,不知...

个位高手, 小弟想在widget上画图, 比如: 先生成一个 window 然后在这个window上画出一个三角形, 图形的背景色就是窗口的颜色. 应该如何做? 
我看了一些资料, 什么pixmap,gc, draw area, 把我搞晕了,特别是那个gc,不知道该怎么用.
哪位高手给小弟解释一下.
用 gtk 1.2 的库.

|
/* File: gdkdrawing.c */
/* example from gtk+ package */
#include 

static GdkPixmap *pixmap = NULL;

static gint configure_event( GtkWidget *widget,GdkEventConfigure *event)
{
if (pixmap) gdk_pixmap_unref(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 gint expose_event( GtkWidget *widget, GdkEventExpose *event )
{
gdk_draw_pixmap(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 - 5;
update_rect.y = y - 5;
update_rect.width = 10;
update_rect.height = 10;
gdk_draw_rectangle (pixmap,
      widget->style->black_gc,
      TRUE,
      update_rect.x, update_rect.y,
      update_rect.width, update_rect.height);
gtk_widget_draw (widget, &update_rect);
}

static gint button_press_event( GtkWidget *widget,GdkEventButton *event)
{
if (event->button == 1 && pixmap != NULL)
draw_brush (widget, event->x, event->y);

return TRUE;
}

static gint motion_notify_event( GtkWidget *widget,
GdkEventMotion *event )
{
int x, y;
GdkModifierType state;

if (event->is_hint)
gdk_window_get_pointer (event->window, &x, &y, &state);
else {
x = event->x;
y = event->y;
state = event->state;
}
    
if (state & GDK_BUTTON1_MASK && pixmap != NULL)
draw_brush (widget, x, y);
  
return TRUE;
}

void quit ()
{
gtk_exit (0);
}

int main( int   argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *drawing_area;
GtkWidget *vbox;
GtkWidget *button;

//初始化
gtk_set_locale();
gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_name (window, "Drawing Area");

vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_widget_show (vbox);

gtk_signal_connect (GTK_OBJECT (window), "destroy",
      GTK_SIGNAL_FUNC (quit), NULL);

//建立绘图区
drawing_area = gtk_drawing_area_new ();
gtk_drawing_area_size(GTK_DRAWING_AREA(drawing_area), 200, 200);
gtk_box_pack_start(GTK_BOX(vbox), drawing_area, TRUE, TRUE, 0);
gtk_widget_show (drawing_area);

//建立信号触发
gtk_signal_connect (GTK_OBJECT (drawing_area), "expose_event",
      (GtkSignalFunc) expose_event, NULL);
gtk_signal_connect (GTK_OBJECT(drawing_area),"configure_event",
      (GtkSignalFunc) configure_event, NULL);
gtk_signal_connect (GTK_OBJECT (drawing_area), 
"motion_notify_event",
(GtkSignalFunc) motion_notify_event, NULL);
gtk_signal_connect (GTK_OBJECT (drawing_area), 
"button_press_event",
(GtkSignalFunc) button_press_event, NULL);

//设置事件掩码
gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK
 | GDK_LEAVE_NOTIFY_MASK
 | GDK_BUTTON_PRESS_MASK
 | GDK_POINTER_MOTION_MASK
 | GDK_POINTER_MOTION_HINT_MASK);

button = gtk_button_new_with_label ("退出");
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);

gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
     GTK_SIGNAL_FUNC (gtk_widget_destroy),
     GTK_OBJECT (window));
gtk_widget_show (button);

gtk_widget_show (window);

gtk_main ();

return 0;
}
给你个例子看看!

    
 
 

您可能感兴趣的文章:

  • 100分+一颗诚心 期待netfilter Hook程序解惑 每天都在线,期待交流
  • 在线求助!关于如何使用“信号”的方式来响应键盘按下的消息!在线急盼回复!
  • 急!!!小弟刚刚接触linux 在线求助<很简单的问题>
  • 新手的求助,高分,在线等待
  • 紧急求助:redhat9启动后黑屏(在线等待~~)
  • 在线求助:找不到猫,
  • 在线求助:苹果机无法启动!!
  • 求助!在线等待~~~~
  • 求助:linux下网卡问题(内详,在线等)
  • 在线紧急求助
  • 在线等待,求助LINUX下串口问题
  • 高分求助在线等...连接池的问题
  • 紧急求助!!!!!!在线等啊
  • 在线等待求助!如何升级、安装glib-2.2.2?
  • 高分求助,在线等
  • 求助:Linux redhat 9.0 下声音的问题~~在线等待
  • 在线求助!!急!!!!!
  • 求助!!!! GREP 、FIND问题 (在线等)
  • 求助:linux下有没有方法来恢复未知权限的文件的权限呢,在线等
  • 求助!为什么linux下FTP允许windows登录而不允许linux登录?在线等
  • [在线求助]一条关于sed的命令,高手进阿
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 简单的输入输出问题 在线等待 在线给分
  • 在线等,在线给分!(简单问题,急)
  • 在线等几个简单问题解答,答出一个在线加50分。
  • linux问题 secureCRT连接的问题 在线等急!~~
  • 关于red hat 8.0的问题,不够再给,(在线等)
  • linux下的vi中的乱码问题(急急急,在线等待!!!!!!,解决问题给高分)
  • 急!Linux下编程的问题(在线等)
  • 请教linux共享上网的问题!!!在线等,问题解决马上结贴
  • 装linux遇到问题,有高手在线帮忙吗?请发信息给我
  • FreeBSD安装问题!(在线等待)
  • 安装问题 急!!!在线等待
  • HP-UX重启后,FTP出现问题,在线等。。。。
  • 有关liunx启动的问题?在线等待!!!
  • (在线等)问一个u8和u16的问题
  • 有关日期,简单的问题!在线等!
  • jsp小问题(在线等待)
  • 在线等待!cmp的问题
  • Linux9.0下安装MySQL的问题(在线等)急!
  • vsftpd配置的奇怪问题,大侠帮忙!在线等!
  • jre的配置问题!在线等!
  • 基于Html5的mockups在线工具简介
  • 装MYSQL后启动错误! mysqld ended --在线急等!在线急等!在线急等!在线急等!-----
  • MyEclipse SVN插件SubEclipse 在线离线等几种安装方式介绍
  • 智能在线表单设计器 FreeForm智能在线表单设计器
  • Linux使用群24032501,保持20人在线,目标50人在线
  • 怎么用能让asp实现统计在线人数的功能。在线等待!!!帮忙送分!
  • 在线求教, 为什么不能开始除root之外的用户登录??...很急, 在线等
  • 我需要唯一用户在线,不能两个用户同时在线的JSP实现的设计文档
  • 在线等,在线给分!!!!!!!!!!
  • 如何判断在线用户,主要是如何判断用户关闭所有窗口(即他已经不在线了)?
  • 在线解压压缩 PclZip


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3