Programming/GUI2008. 10. 21. 00:50
요약.
1. button with stock item
gtk_button_new_from_stock, gtk_button_new_from_stock ()

2. toggle button
- toggle 버튼 생성
gtk_toggle_button_new, gtk_toggle_button_new ()
gtk_toggle_button_new_with_label, gtk_toggle_button_new_with_label() gtk_toggle_button_new_with_mnemonic, gtk_toggle_button_new_with_mnemonic ()

- toggle 버튼 상태 얻기
gtk_toggle_button_get_active, gtk_toggle_button_get_active ()

- toggle 버튼 상태 변경
gtk_widget_set_sensitive, gtk_widget_set_sensitive ()
gtk_toggle_button_set_active, gtk_toggle_button_set_active ()

3. widgets flags
위젯들이 가지고 있는 기본 속성들이 있는데 2번 에서본 gtk_widget_set_sensitiver도 toggle button이 가지고 있는 GTK_SENSITIVE 속성을 변경해 줌으로서 버튼이 눌렸다 떼어지도록 동작하게 하는것입니다. widgets flags는 http://library.gnome.org/devel/gtk/stable/GtkWidget.html 에서 참조하기 바랍니다. 설명 및 widget 속성을 변경하기 위한 api가 나와있습니다.

4. check button
gtk_check_button_new, gtk_check_button_new ()
gtk_check_button_new_with_label, gtk_check_button_new_with_label ()
gtk_check_button_new_with_mnemonic, gtk_check_button_new_with_mnemonic ()
체크버튼은 toggle 시그널을 사용합니다. 그리하여 check 버튼이 check 되어있는지 확인하기 위하여 toggle 버튼에서 사용하는 함수와 동일한 함수를 사용합니다.

5. radio button
gtk_radio_button_new, gtk_radio_button_new ()
gtk_radio_button_new_from_widget, gtk_radio_button_new_from_widget ()
gtk_radio_button_new_with_label, gtk_radio_button_new_with_label ()
gtk_radio_button_new_with_label_from_widget, gtk_radio_button_new_with_label_from_widget ()
gtk_radio_button_new_with_mnemonic, gtk_radio_button_new_with_mnemonic ()
gtk_radio_button_new_with_mnemonic_from_widget, gtk_radio_button_new_with_mnemonic_from_widget ()

6. text entry, spin button, horizontal and vertical scales, font button 
생략...ㅡㅡ

7. color button
- 버튼 생성
gtk_color_button_new, gtk_color_button_new ()
gtk_color_button_new_with_color, gtk_color_button_new_with_color ()

- 버튼에서 설정된 칼라 값 가져오기
gtk_color_button_get_color, gtk_color_button_get_color ()

- 위젯의 컬러 속성 바꾸기
gtk_widget_modify_fg, gtk_widget_modify_fg ()

GTK+에서는 컬러값을 GdkColor 구조체로 관리합니다.
구조체는 다음과 같고 많이 쓰이는 헥사값으로 구조체를 채우기 위해서
gboolean gdk_color_parse(const gchar *color_string, GdkColor *color); 와 같은 API를 사용합니다.
struct GdkColor
{
  guint32 pixel;
  guint16 red;
  guint16 green;
  guint16 blue;
}

8. file choose button
- 버튼 생성
gtk_file_chooser_button_new, gtk_file_chooser_button_new ()

- 초기 폴더 설정
gtk_file_chooser_set_current_folder, gtk_file_chooser_set_current_folder ()

- 필터 생성
gtk_file_filter_new, gtk_file_filter_new ()

- 필터 이름 설정
gtk_file_filter_set_name, gtk_file_filter_set_name ()

- 필터에 패턴 설정
gtk_file_filter_add_pattern, gtk_file_filter_add_pattern ()

- 필터를  file choose button 에 등록
gtk_file_chooser_add_filter, gtk_file_chooser_add_filter ()

- file choose button에 설정된 파일이름 가져오기
gtk_file_chooser_get_filename, gtk_file_chooser_get_filename ()

GtkFileChooserButton은 GtkFileChooser의 인터페이스만 구현하고 상속받지는 않았음.

9. 연습문제
1. renameing files
- GtkFileChooseButton으로 파일을 선택
- GtkEntry 로 파일이름을 입력받음
- GtkFileChooserButton 으로 선택한 파일이름을 GtkEntry에서 입력받은 파일이름으로 변경
- 작업이 성공적으로 수행되면 GtkFileChooserButton과 GtkEntry 를 비활성화 시킴

2. Spin Button and Scales
- spin button 과 horizontal scale 을 생성후 둘다 같은 초기 값과 경계를 설정한다.
- check button 이 선택되면 spin button 과 horizontal scale은 같은 값으로 설정된다.
- spin button 과 horizontal scale은 정수와 실수 둘다 지원
(나머지 요구사항은 책을 대강 읽어서 인지 영어가 딸려서 인지 잘 이해가 안되네요..ㅡㅡ)

Posted by lotus

댓글을 달아 주세요

Programming/GUI2008. 9. 15. 18:09
gtk 를 공부하면서 정리차원에서 쓰는 글입니다.
gtk api는 http://library.gnome.org/devel/gtk/
tutorial은 http://library.gnome.org/devel/gtk-tutorial/stable/ 에서 확인할 수 있습니다.

1. 컴파일 하기
gcc -Wall -g helloworld.c -o helloworld `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`

pkg-config 에 대해서 모르고 계셨던 분은 쉘에다가 다음의 명령을 입력해 보면 어떻게 컴파일 되는지 확인 할수 있습니다.
$ pkg-config --cflags gtk+-2.0
$ pkg-config --libs gtk+-2.0

2. 예제 소스

#include <gtk/gtk.h>

static void destroy(GtkWidget* , gpointer);
static gboolean delete_event(GtkWidget *, GdkEvent *, gpointer);

int main(int argc, char *argv[])
{
    GtkWidget *window, *label;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title(GTK_WINDOW(window), "Hello world!");
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    gtk_widget_set_size_request(window, 200, 100);

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), NULL);

    label = gtk_label_new("Hello World");
    gtk_label_set_selectable(GTK_LABEL(label), TRUE);

    gtk_container_add(GTK_CONTAINER(window), label);
    gtk_widget_show_all(window);

    gtk_main();
    return 0;
}

static void destroy(GtkWidget *window, gpointer data)
{
    gtk_main_quit();
}

static gboolean delete_event(GtkWidget *window, GdkEvent *event, gpointer data)
{
    return FALSE;
}


3. 기타 api

void g_signal_emit_by_name(gpointer instance, const gchar *signal_name, ...);
void g_signal_stop_emission_by_name(gpointer instance, const gchar *signal_name);

void g_object_set_data(GObject *object, const gchar *key, gpointer data);
void g_object_get_data..

gint gtk_pending_event()

void g_signal_connect(gpointer object, const gchar *signal_name, GCallback handler, gpionter data);
void g_signal_connect_swapped
g_signal_connect와 g_signal_connect_swapped 차이점은 callback 함수에 전달되는 매개변수의 순서가 다르다는 점인데요.  아래 링크된 곳의 설명에 따르면 g_signal_connect에 사용되는 callback 함수와 형태가 다른 이미 정의된 어떤 (콜백)함수들을 사용하기 위함이라고 합니다. 
http://www.gtkforums.com/about1177.html


4.  요약
- 윈도우 생성과 소멸
- widget, window, label 과 관련된 몇가지 api
- signal과 event를 위젯으로 보내는 방법
- signal과 event 차이
- widget properties


5. 연습문제
2-1. 요구사항
- window 의 타이틀에 성을 표시하라.
- label에 이름을 표시하라
- window의 사이즈는 조작 불가
- 최소 사이즈는 300 x 100
- key_press_event가 발생하였을때 window의 제목과 label에 설정된 문자열을 바꾸어라.
(5번째 요구사항은 잘못해석해서 라벨에 설정된 문자열의 성과 이름이 본인의 이름하고
같을때 에만 교체 하도록 하는것 같은데 무조건 교체하도록 작성하였네요.)


2-2. 요구사항
 생략...-_-;;
GObject의 각 property들의 상태를 감시 할수 있는데 이들이 변할때 시그널을 전달하는 방법이 있습니다.  연습문제2-2는 GObject property 와  g_object_set과 g_object_set 사용에 관한 내용입니다.
Posted by lotus
TAG GTK

댓글을 달아 주세요