GTK+ 2.0 教学-比例框架 Aspect Frames

比例框架元件(The aspect frame widget)和框架元件(frame widget)差不多,除了它还会使子元件的外观比例(也就是宽和长的比例)保持一定值,如果需要,还会在元件中增加额外的可用空间。这很有用,例如,想 预览一个大的图片。当用户改变视窗的尺寸时,预览器的尺寸应该随之改变,但是外观比例要与原来图片的尺寸保持一致。

用下面的函式创建一个新的比例框架:

GtkWidget *gtk_aspect_frame_new( const gchar *label,
                                 gfloat       xalign,
                                 gfloat       yalign,
                                 gfloat       ratio,
                                 gboolean     obey_child);

xalignyalign参数的作用和创建对齐元件(Alignment widgets)时的一样。如果obey_child参数设置为 TRUE,子元件的长宽比例会和它所请求的理想长宽比例相匹配。否则,比例值由ratio参数指定。

用以下函式可以改变已有比例框架元件的选项:

void gtk_aspect_frame_set( GtkAspectFrame *aspect_frame,
                           gfloat          xalign,
                           gfloat          yalign,
                           gfloat          ratio,
                           gboolean        obey_child);

在下面的范例中,程式用一个比例框架元件显示一个绘图区,纵横比例总是 2:1,而不管用户如何改变顶层视窗的尺寸。

#include <gtk/gtk.h>

int main( int argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *aspect_frame;
    GtkWidget *drawing_area;
    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Aspect Frame");
    g_signal_connect (window, "destroy",
	              G_CALLBACK (gtk_main_quit), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);

    /* 创建一个比例框架,将它添加到顶层视窗中 */

    aspect_frame = gtk_aspect_frame_new ("2x1", /* label */
                                         0.5, /* center x */
                                         0.5, /* center y */
                                         2, /* xsize/ysize = 2 */
                                         FALSE /* ignore child's aspect */);

    gtk_container_add (GTK_CONTAINER (window), aspect_frame);
    gtk_widget_show (aspect_frame);

    /* 添加一个子元件到比例框架中 */

    drawing_area = gtk_drawing_area_new ();

    /* 要求一个200×200的视窗,但是比例框架会给出一个200×100
     * 的视窗,因为我们已经指定了2×1的比例值 */
    gtk_widget_set_size_request (drawing_area, 200, 200);
    gtk_container_add (GTK_CONTAINER (aspect_frame), drawing_area);
    gtk_widget_show (drawing_area);

    gtk_widget_show (window);
    gtk_main ();
    return 0;
}

Comments are closed.