본문 바로가기
컴퓨터 관련/Linux || Unix

GTK+ 컨테이너 Widget [1] Paned Window Widget

by _BlankSpace 2017. 4. 23.

이번에는 GTK+ 컨테이너 Widget 방법을 소개하려고 한다.

그 중, Paned Window Widget을 설명하겠다.

- paned window widget은 두 영역으로 나누어서 임의대로 화면 크기를 조절할 수 있는 기능을 제공한다.

- 두 영역은 handle로 비율을 바꿀 수 있다.

- 분할은 수평(HPaned)적이거나 수직(VPaned)적으로 나눌 수 있다.

- 분할된 공간에는 하나의 widget만 넣을 수 있다. 하지만 분할된 공간안에 또 다른 paned window widget을 넣는다면 공간을 더 분할할 수 있다.

예제 출처 : https://developer.gnome.org/gtk-tutorial/stable/x1335.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <stdio.h>
#include <gtk/gtk.h>
   
static GtkWidget *create_list( void )
{
 
    GtkWidget *scrolled_window;
    GtkWidget *tree_view;
    GtkListStore *model;
    GtkTreeIter iter;
    GtkCellRenderer *cell;
    GtkTreeViewColumn *column;
    int i;
   
    scrolled_window = gtk_scrolled_window_new (NULLNULL);
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                    GTK_POLICY_AUTOMATIC, 
                    GTK_POLICY_AUTOMATIC);
   
    model = gtk_list_store_new (1, G_TYPE_STRING);
    tree_view = gtk_tree_view_new ();
    gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
    gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (model));
    gtk_widget_show (tree_view);
   
    for (i = 0; i < 10; i++) {
        gchar *msg = g_strdup_printf ("Message #%d", i);
        gtk_list_store_append (GTK_LIST_STORE (model), &iter);
        gtk_list_store_set (GTK_LIST_STORE (model), 
                        &iter,
                            0, msg,
                        -1);
    g_free (msg);
    }
   
    cell = gtk_cell_renderer_text_new ();
 
    column = gtk_tree_view_column_new_with_attributes ("Messages",
                                                       cell,
                                                       "text"0,
                                                       NULL);
  
    gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view),
                       GTK_TREE_VIEW_COLUMN (column));
 
    return scrolled_window;
}
   
static void insert_text( GtkTextBuffer *buffer )
{
   GtkTextIter iter;
 
   gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
 
   gtk_text_buffer_insert (buffer, &iter,   
    "From: pathfinder@nasa.gov\n"
    "To: mom@nasa.gov\n"
    "Subject: Made it!\n"
    "\n"
    "We just got in this morning. The weather has been\n"
    "great - clear but cold, and there are lots of fun sights.\n"
    "Sojourner says hi. See you soon.\n"
    " -Path\n"-1);
}
   
/* Create a scrolled text area that displays a "message" */
static GtkWidget *create_text( void )
{
   GtkWidget *scrolled_window;
   GtkWidget *view;
   GtkTextBuffer *buffer;
 
   view = gtk_text_view_new ();
   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
 
   scrolled_window = gtk_scrolled_window_new (NULLNULL);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                          GTK_POLICY_AUTOMATIC,
                   GTK_POLICY_AUTOMATIC);
 
   gtk_container_add (GTK_CONTAINER (scrolled_window), view);
   insert_text (buffer);
 
   gtk_widget_show_all (scrolled_window);
 
   return scrolled_window;
}
   
int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *vpaned;
    GtkWidget *list;
    GtkWidget *text;
 
    gtk_init (&argc, &argv);
   
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Paned Windows");
    g_signal_connect (window, "destroy",
                  G_CALLBACK (gtk_main_quit), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
    gtk_widget_set_size_request (GTK_WIDGET (window), 450400);
 
    /* create a vpaned widget and add it to our toplevel window */
   
    vpaned = gtk_vpaned_new ();
    gtk_container_add (GTK_CONTAINER (window), vpaned);
    gtk_widget_show (vpaned);
   
    /* Now create the contents of the two halves of the window */
   
    list = create_list ();
    gtk_paned_add1 (GTK_PANED (vpaned), list);
    gtk_widget_show (list);
   
    text = create_text ();
    gtk_paned_add2 (GTK_PANED (vpaned), text);
    gtk_widget_show (text);
    gtk_widget_show (window);
 
    gtk_main ();
 
    return 0;
}
 
cs

실행화면은 다음과 같습니다.

1
2
3
GtkWidget* gtk_hpaned_new (void)
 
GtkWidget* gtk_vpaned_new (void)
cs
1
2
3
void gtk_paned_add1 (GtkPaned* paned, GtkWidget* child)
 
void gtk_paned_add2 (GtkPaned* paned, GtkWidget* child)
cs

gtk_paned_add1()은 좌 또는 상단, gtk_paned_add2()은 우 또는 하단에 자식 widget을 더한다.

1
2
3
4
5
6
7
gtk_paned_pack1 (GtkPaned* paned, GtkWidget* child, gboolean resize,
 
gboolean shrink);
 
gtk_paned_pack2 (GtkPaned* paned, GtkWidget* child, gboolean resize,
 
gboolean shrink);
cs

gtk_paned_add1() 또는 add2()와 같은 기능을 한다.

paned : a paned widget

child : 붙일 자식 widget

resize : paned widget의 사이즈를 바꿀 때, 자식 widget을 확장할 것인 지.

shrink : 자식 widget의 요구보다 더 작게 만들어질 것인지.

댓글