/*
* signal_callback.c
*
* Created on: 2011-3-4
* Author: root
*/
#include "signal_callback.h"
#include "graph.h"
#include <string.h>
#include <stdlib.h>
#include <cairo/cairo.h>
#include <math.h>
extern GtkWidget *window;
extern GdkPixmap *pixmap;
extern GtkWidget *drawing_area;
extern GtkWidget *src_combox, *dst_combox;
extern GtkWidget *entry;
struct graph_struct *my_graph;
struct Button_Status button_status;
double r = 15;
unsigned int count = 0;
unsigned int combox_item_num = 0;
int delete_side_len(unsigned int src_point_no, unsigned int dst_point_no, double *len);
double get_side_len(unsigned int src_point_no, unsigned int dst_point_no);
int set_side_len(unsigned int src_point_no, unsigned int dst_point_no, double len, double *old_len);
void draw_point(GtkWidget *widget, gdouble x, gdouble y, const gchar *text,unsigned int flag);
void draw_line(unsigned int src_point_no, unsigned int dst_point_no, double len, unsigned int flag);
void delete_point(gdouble x, gdouble y);
void clear_drawingarea(void);
void path_reshow_line();
void path_show_line(unsigned int i, unsigned int j, unsigned int **path);
/*下面三个函数仅仅是测试使用*/
void show_side(void);
void show_path(unsigned **data, unsigned int base);
void show_graph(double **data, unsigned int base);
/*
* 函数名称:init_button_status
* 函数参数:bs:按钮状态结构体指针
* 函数功能:外部接口、初始化按钮状态
* 返回值:无
* */
void init_button_status(struct Button_Status* bs)
{
bs->add_point_button = CLICKED_FALSE;
bs->delete_point_button = CLICKED_FALSE;
bs->add_side_button = CLICKED_FALSE;
bs->delete_side_button = CLICKED_FALSE;
bs->draw_button = CLICKED_FALSE;
bs->redraw_button = CLICKED_FALSE;
}
/*
* 函数名称:on_draw_area_expose_event
* 函数参数:widget 控件 event事件
* 函数功能:外部接口、回调函数,处理drawdingarea的暴露(expose)事件(信号)
* 返回值:TRUE;
* */
gint on_draw_area_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 TRUE;
}
/*
* 函数名称:on_draw_area_button_press_event
* 函数参数:widget 控件 event事件
* 函数功能:外部接口、回调函数,处理drawdingarea的鼠标左键按下press事件(信号),完成顶点的添加,并在界面上显示出顶点,在组合框里显示顶点名称此函数只在add_point_button = CLICKED_TRUE时生效
* 返回值:TRUE;
* */
gint on_draw_area_button_press_event(GtkWidget *widget, GdkEventButton *event)
{
unsigned int k = my_graph->point_cur_num;
if (CLICKED_TRUE == button_status.add_point_button && event->button == 1 && pixmap != NULL)
{
/*空间不足要增大空间*/
if (k >= my_graph->point_max_num)
{
my_graph->point_max_num *= 2;
my_graph->graph_point = realloc(my_graph->graph_point, sizeof(struct graph_point) * my_graph->point_max_num);
}
/* 添加顶点到顶点集合 */
my_graph->graph_point[k].x = event->x;
my_graph->graph_point[k].y = event->y;
my_graph->graph_point[k].no = k;
snprintf(my_graph->graph_point[k].name, 10, "N%u", k);
++(my_graph->point_cur_num);
/* 处理组合框combo_box_entry */
++combox_item_num;
gtk_combo_box_append_text(GTK_COMBO_BOX(src_combox), my_graph->graph_point[k].name);
gtk_combo_box_append_text(GTK_COMBO_BOX(dst_combox), my_graph->graph_point[k].name);
/*界面上划出顶点*/
draw_point(widget, event->x, event->y, my_graph->graph_point[k].name,0);
}
return TRUE;
}
/*
* 函数名称:on_draw_area_configure_event
* 函数参数:widget 控件 event事件
* 函数功能:外部接口、回调函数,处理drawdingarea的configure事件(信号),初次调用生成后端位图,并把画图区域设为白色背景
* 返回值:TRUE;
* */
gint on_draw_area_configure_event(GtkWidget *widget, GdkEventConfigure *event)
{
if (!pixmap)
//g_object_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;
}
/*
* 函数名称:on_query_button_clicked
* 函数参数:object 控件 user_data用户数据,两个参数目前都没有用到,仅仅是满足回调函数的格式
* 函数功能:外部接口、回调函数,处理“查询路径”按钮的单击事件(信号),分别获取起点和终点,然后查询路径,在界面上显示出路径长度和经过的节点。此函数只在draw_button = CLICKED_TRUE时生效
* 返回值:TRUE;
* */
gint on_query_button_clicked(GtkObject *object, gpointer user_data)
{
// printf("button_status.draw_button==%d\n", button_status.draw_button);
if (button_status.draw_button == CLICKED_FALSE)
return TRUE;
// printf("query_button\n");
gchar text[15] = "";/*获取顶点名称的字符串*/
int src_point_no = 0;/*起点*/
int dst_point_no = 0;/*终点*/
/*获取起点和终点,并检查起点与终点不能相同*/
memset(text, 0, 15);
strcpy(text, gtk_combo_box_get_active_text(GTK_COMBO_BOX(src_combox)));
if (text[0] == '\0') return TRUE;
src_point_no = atoi(text + 1);
// printf("src_point_no = %d\n", src_point_no);
memset(text, 0, 15);
strcpy(text, gtk_combo_box_get_active_text(GTK_COMBO_BOX(dst_combox)));
if (text[0] == '\0') return TRUE;
dst_point_no = atoi(text + 1);
// printf("dst_point_no = %d\n", dst_point_no);
if (src_point_no == dst_point_no)
{
show_message_dialog("起点和终点必须不同");
return TRUE;
}
/*检测两点之间是否存在通路*/
if (fabs(my_graph->min_path[src_point_no][dst_point_no] - DBL_MAX) > 1e-6)
{
snprintf(text, 15, "%.2lf", my_graph->min_path[src_point_no][dst_point_no]);
/*在输入框中显示路径长度*/
gtk_entry_set_text(GTK_ENTRY(entry), text);
/*src_point,dst_point是界面上的点,不是数组中的点*/
path_reshow_line();/*恢复图*/
/*在界面显示路径,变色,要对图的坐标进行映射*/
path_show_line(my_graph->tmp_point2[src_point_no], my_graph->tmp_point2[dst_point_no], my_graph->path);
} else
{
show_message_dialog("要查询的两点不存在通路!");
}
return TRUE;
}
/*
* 函数名称:on_redraw_button_clicked
* 函数参数:object 控件 user_data用户数据,两个参数目前都没有用到,仅仅是满足回调函数的格式
* 函数功能:外部接口、回调函数,处理“重新绘图”按钮的单击事件(信号),重置所有信息,清理内存,界面清屏等操作
* 返回值:TRUE;
* */
gint on_redraw_button_clicked(GtkObject *object, gpointer user_data)
{
// printf("redraw_button\n");
path_reshow_line();
// printf("button_status.draw_button==%d\n", button_status.draw_button);
/*清理内存,释放图的结构*/
clear_memory_double(my_graph->graph, my_graph->has_point_number);
clear_memory_double(my_graph->min_path, my_graph->has_point_number);
clear_memory_int(my_graph->path, my_graph->has_point_number);
if (my_graph->graph_point)
{
free(my_graph->graph_point);
my_graph->graph_point = NULL;
}
if (my_graph->graph_side)
{
free(my_graph->graph_side);
my_graph->graph_side = NULL;
}
if (my_graph->tmp_point)
{
free(my_graph->tmp_point);
my_graph->tmp_point = NULL;
}
if (my_graph->tmp_point2)
{
free(my_graph->tmp_point2);
my_graph->tmp_point2 = NULL;
}
if (my_graph->path_array)
{
free(my_graph->path_array);
my_graph->path_array = NULL;
}
if (my_graph)
free(my_graph);
/*重新初始化按钮状态和图的结构*/
init_button_status(&button_status);
if (1 == init_graph())
{
show_message_dialog("申请内存错误!");
exit(0);//弹出对话框
}
/*清理画图区域*/
clear_drawingarea();
/*清空组合框*/
while (combox_
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
path_flody.tar.gz (27个子文件)
path_flody
.project 2KB
发布
objects.mk 227B
makefile 971B
src
floyd.o 3KB
subdir.mk 845B
floyd.d 72B
main.d 0B
sources.mk 389B
.cproject 33KB
.settings
org.eclipse.cdt.ui.prefs 89B
调试
objects.mk 227B
GTK 717KB
makefile 999B
src
floyd.o 32KB
subdir.mk 887B
floyd.d 72B
signal_callback.o 365KB
main.d 38KB
main.o 337KB
signal_callback.d 38KB
sources.mk 389B
src
main.c 5KB
graph.h 2KB
signal_callback.h 1KB
signal_callback.c 28KB
floyd.c 5KB
最短路劲.glade 12KB
共 27 条
- 1
资源评论
gewentang
- 粉丝: 5
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功