Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 制作可变比例_C_User Interface_Gtk - Fatal编程技术网

C 制作可变比例

C 制作可变比例,c,user-interface,gtk,C,User Interface,Gtk,我正在建立一个程序,模拟任意区域内的物理现象(特别是电荷)(为了更有意义,它应该在皮米尺度附近,但其想法仍然是让用户对这些值进行一点处理,比如试图看到电荷在数公里内相互作用),使用缩放的Cairo绘图区域以提供足够的缩放功能 从用户的角度来看,应该有一种舒适的方式来改变刻度,无论是大值还是小值,因此我认为最符合逻辑的是创建一个gtk_刻度,其调整值会随着用户接近任一边缘而改变。现在,我必须承认我不是这里最有经验的程序员,恰恰相反,所以我为我可能犯的任何愚蠢行为道歉,但是下面的代码不应该工作吗 g

我正在建立一个程序,模拟任意区域内的物理现象(特别是电荷)(为了更有意义,它应该在皮米尺度附近,但其想法仍然是让用户对这些值进行一点处理,比如试图看到电荷在数公里内相互作用),使用缩放的Cairo绘图区域以提供足够的缩放功能

从用户的角度来看,应该有一种舒适的方式来改变刻度,无论是大值还是小值,因此我认为最符合逻辑的是创建一个gtk_刻度,其调整值会随着用户接近任一边缘而改变。现在,我必须承认我不是这里最有经验的程序员,恰恰相反,所以我为我可能犯的任何愚蠢行为道歉,但是下面的代码不应该工作吗

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并更改其
范围。它会有同样的效果,而不会有那么多麻烦