Widget의 생성
1. GTK에서는 화면의 구성요소를 생성하면 GtkWidget으로 반환한다.
Widget의 생성은 동적으로 메모리의 영역을 할당한다.
Widget의 생성함수 반환(return)타입은 GtkWidget의 포인터이다.
-
위의 두가지를쉽게 말해주겠다. 먼저 프로그램을 띄우고 하면에 보여주려면 Window부터 하나 있어야한다. GtkWindow가 바로 그것이다. 이놈을 생성하는 방법을 잠시 보자. GtkWidget* gtk_window_new (GtkWindowType type);
미리 말씀드렸듯이 return 타입이 GtkWidget* 즉 GtkWidget의 포인터다. gtk_window_new 함수내에서 메모리 영역을 동적으로 할당한뒤 이 주소를 반환하는것이다. 이때 GtkWindow 타입에 맞는 크기로 할당된다. GtkWindow는 GtkWidget을 상속받았기 때문에 GtkWidget으로 타입 캐스팅이 하여 반환하는것이 가능한 것이다.
-
1) 먼저 해당 타입에 맞게 메모리를 동적으로 할당한뒤,
2) 기본적인 사항들에 대해 처리하고,
3) GtkWidget의 포인터타입(GtkWidget*)으로 할당된 메모리의 주소를 반환한다. GtkWidget*
gtk_window_new (GtkWindowType type)
{
GtkWindow *window;
g_return_val_if_fail (type >= GTK_WINDOW_TOPLEVEL &&
type <= GTK_WINDOW_POPUP, NULL);
window = g_object_new (GTK_TYPE_WINDOW, NULL);
window->type = type;
return GTK_WIDGET (window);
}
-
해당 함수의 내용이다.
GtkWindow *window;
먼저 GtkWindow 타입의 포인터변수를 선언한다.
window = g_object_new (GTK_TYPE_WINDOW, NULL);
새로운 메모리의 영역을 동적으로 할당한다. 생소할 수도 있겠으나 자세한것은 나중에 glib관련된 내용을 따로보면 이해가 쉽다. malloc과 동일하다고 보기는 힘들지만 메모리의 영역을 동적으로 할당하는 역할에 있어서는 같다고 보면 된다.
return GTK_WIDGET (window);
GTK_WIDGET 매크로를 이용하여 GtkWidget 타입으로 타입 캐스팅(업캐스팅)을 하여 반환한다. GTK_WIDGET() 매크로는 GtkWidget을 상속받은 포인터변수를 GtkWidget으로 타입 캐스팅을 한다. 받대로 GtkWidget을 GtkWindow으로 타입캐스팅(다운캐스팅)할때는 GTK_WINDOW()를 이용한다. 대부분의 구성요소들이 위와 같다. 실제 gtkwindow.h 소스를 보면 아래와 같이 정의되어 있다.
#define GTK_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
GTK_TYPE_WINDOW, GtkWindow))
비슷한 예로 GtkLabel을 GtkWidget으로 바꿀때는 GTK_WIDGET(label) 반대는 GTK_LABEL(widget)이다. 매크로를 외울필요는 없다.
***** 참고 ***
(GtkWidget*) window 와 같은 방법으로 타입캐스팅이 가능하지만 별로 권장하지는 않는다.
가급적 매크로가 있다면 매크로를 사용하자.
*************************************************************************************
-
위젯의 생성밥법을 참 길게 설명했는데 개략적인 내용이라도 이해해야한다.
모든 위젯은 GtkWidget을 상속받고 생성함수 리턴타입은 GtkWidget의 포인터이며 타입캐스팅은 쉽게 유추가능한 이름을 쓴다.
GtkWidget *widget;
widget = gtk_window_new(어쩌구);
더 간단하게는 위와같은 코드만 알아도 윈도우를 생성할 수 있고 언급한 몇가지만 알아도 당장의 프로그램을 작성은 가능하겠지만 나중을 생각해서라도 "아 이게 대략 이런 저런 과정을 거치는구나" 정도는 알아두시는게 좋다.
2. 정리 해보자
-
Widget의 생성함수 반환(return)타입은 GtkWidget의 포인터이다.
-
Widget의 생성은 메모리를 동적으로 할당하고 기본적인 사항을 처리한뒤 GtkWidget* 으로 반환한다.
-
타입캐스팅은 대부분 매크로를 통해 이루어지며 매크로는 유추하기 쉽게 구성되어있다.
-
GTK는 객체지향적으로 만들어졌지만 흔히 생각하는 객체지향과는 다소 차이가 있다. 이해를 돕기위해 객체지향스럽게 설명을 하고 있는것 뿐이니 이점을 유의하기 바랍니다.
강좌를 써나가며 느끼는것인데 사람들이 나를 보면 만두만 사줄까 두렵다.
"sohalee는 말이 너무 많아요"
거기다 썰렁하기까지 하니 이거 원 --;
질문은 이곳의 질답 게시판이나 이메일로 보내주시기 바란다
참고로 본인의 이메일은 스팸으로 그득해서 카드 고지서외에는 거의 눈에 띄지 않지만
미모의 여성이 보낸 편지는 본능적으로 클릭해 낸다.
너는 잘난것이 아니다.
남과는 서로 다른것을 알고 있을 뿐이다.