C 制作可变比例
我正在建立一个程序,模拟任意区域内的物理现象(特别是电荷)(为了更有意义,它应该在皮米尺度附近,但其想法仍然是让用户对这些值进行一点处理,比如试图看到电荷在数公里内相互作用),使用缩放的Cairo绘图区域以提供足够的缩放功能 从用户的角度来看,应该有一种舒适的方式来改变刻度,无论是大值还是小值,因此我认为最符合逻辑的是创建一个gtk_刻度,其调整值会随着用户接近任一边缘而改变。现在,我必须承认我不是这里最有经验的程序员,恰恰相反,所以我为我可能犯的任何愚蠢行为道歉,但是下面的代码不应该工作吗C 制作可变比例,c,user-interface,gtk,C,User Interface,Gtk,我正在建立一个程序,模拟任意区域内的物理现象(特别是电荷)(为了更有意义,它应该在皮米尺度附近,但其想法仍然是让用户对这些值进行一点处理,比如试图看到电荷在数公里内相互作用),使用缩放的Cairo绘图区域以提供足够的缩放功能 从用户的角度来看,应该有一种舒适的方式来改变刻度,无论是大值还是小值,因此我认为最符合逻辑的是创建一个gtk_刻度,其调整值会随着用户接近任一边缘而改变。现在,我必须承认我不是这里最有经验的程序员,恰恰相反,所以我为我可能犯的任何愚蠢行为道歉,但是下面的代码不应该工作吗 g
gboolean scale_change(GtkWidget *w, gpointer p)
{
pdata *data = (pdata *) p;
//A struct with all the program data.
double temp;
data->scale = gtk_range_get_value(GTK_RANGE(data->vis_scale));
//data->scale is the value used to later scale cairo.
temp = log10(data->scale);
if (temp - floor(temp + 0.5) < DBL_EPSILON)
//Check if the value is a power of ten, to change the scale
{
data->sadj = gtk_adjustment_new( data->scale, 0.1*data->scale, 10.0*data->scale,
data->scale, 1, (data->scale) *
max(gtk_widget_get_allocated_height(data->drawarea),
gtk_widget_get_allocated_width(data->drawarea)));
gtk_range_set_adjustment(GTK_SCALE(data->vis_scale), data->sadj);
gtk_scale_set_digits(GTK_SCALE(data->vis_scale), (int) temp);
}
return TRUE;
}
gboolean刻度变化(GtkWidget*w,gpointer p)
{
pdata*数据=(pdata*)p;
//包含所有程序数据的结构。
双温;
数据->比例=gtk_范围_获取_值(gtk_范围(数据->可视比例));
//数据->缩放是用于以后缩放的值。
温度=log10(数据->刻度);
如果(温度-地板(温度+0.5)sadj=gtk_调整_新建(数据->比例,0.1*数据->比例,10.0*数据->比例,
数据->比例,1,(数据->比例)*
最大(gtk_小部件_获取_分配_高度(数据->绘图区域),
gtk_小部件_获取_分配的_宽度(数据->绘图区域));
gtk_范围设置调整(gtk_刻度(数据->可视刻度),数据->sadj);
gtk_刻度设置数字(gtk_刻度(数据->可视刻度),(内部)温度);
}
返回TRUE;
}
但是,既然不是,有没有更好的方法来实现这一点,或者我的想法完全不可能,或者至少非常不切实际?您可以使用GtkSpinButton并更改其
范围。它会有同样的效果,而不会有那么多麻烦