다음 이전 차례

6. Widget의 개요

GTK에서 widget을 만드는 일반적인 절차는 다음과 같다.

  1. gtk_*_new - 새로운 widget을 만들기 위한 다양한 함수. 이것들 모두는 여기서 자세히 보여질 것이다.
  2. 적당한 핸들러에 사용할 모든 시그널을 결합시킨다.
  3. Widget의 속성을 세팅한다.
  4. gtk_container_add()나 gtk_box_pack_start()같은 적당한 함수를 써서 widget을 컨테이너 안으로 패킹한다.
  5. gtk_widget_show()로 widget을 보인다.

gtk_widget_show()는 우리가 widget의 속성을 모두 세팅했음을 GTK에게 알리고, 그것은 이제 보여질 준비가 다 된 것이다. 우리는 그것을 다시 보이지 않게 하기 위해 gtk_widget_hide를 이용할 수도 있다. Widget들이 보여지는 순서는 중요 하지 않다. 내가 말하려는 것은, 각각의 widget이 생겨나는 대로 스크린에 보여지게 하는 것보다는, 윈도를 가장 나중에 보여지게 해서 모든 구성요소가 한번에 튀어오르게 하는 것이 낫다는 것이다. gtk_widget_show()함수를 이용하게 되면 어떤 widget(윈도 역시 하나의 widget이다)의 구성요소들은 그 윈도 자체가 보여지기 전에 먼저 보여지지 않는다.

6.1 캐스팅(자료형의 강제변환)

계속하면서 알겠지만, GTK는 자료형의 강제변환 시스템을 쓴다. 이것은 주어진 대상을 캐스팅하는 능력을 테스트할 때나, 그리고 캐스팅을 실행할 때나, 언제나 매크로를 이용함으로써 이루어진다. 우리가 보게 될 몇몇은 다음과 같다.

이것들은 모두 함수의 인자들을 캐스트하기 위해 쓰였다. 우리는 이들을 예제들에서 볼 것이며, 함수의 선언부를 보는 것만으로 그들을 이용할 때를 말할 수 있을 것이다.

아래의 클래스 계층구조에서 볼 수 있듯이, 모든 GtkWidget들은 기반클래스인 GtkObject에서 파생된 것이다. 이것은 어떤 함수가 object를 요구할 때 어디서 든지 widget을 이용할 수 있음을 의미한다 - 단순히 GTK_OBJECT() 매크로를 이용해서. 예를 들어 보자.

gtk_signal_connect(GTK_OBJECT(button), "clicked",
                   GTK_SIGNAL_FUNC(callback_function), callback_data);

이것은 버튼을 하나의 object로 캐스트하고, 함수 포인터를 callback으로 캐스트한다.

많은 widget들은 또한 컨테이너다. 아래의 클래스 계층구조를 보면 상당수의 widget들이 GtkContainer에서 파생되었음을 알 수 있을 것이다. 그들 중 어떤 widget이라도 컨테이너를 요구하는 함수에 넘겨주기 위해 GTK_CONTAINER 매크로를 이용할 수 있다.

불행하게도 이런 매크로들은 이 문서에서 광범위하게 다루어지지 않았다. 나는 여러분이 GTK의 헤더파일들을 살펴보기를 권한다. 사실, 함수의 선언부를 보면서 widget이 어떻게 작용하는지 공부하는 것은 그리 어렵지 않다.

6.2 Widget의 계층구조

여러분이 참고할 수 있도록, 여기 widget들을 보충하기 위한 클래스 계층구조 트리가 있다.

  GtkObject
   +GtkData
   | +GtkAdjustment
   | `GtkTooltips
   `GtkWidget
     +GtkContainer
     | +GtkBin
     | | +GtkAlignment
     | | +GtkEventBox
     | | +GtkFrame
     | | | `GtkAspectFrame
     | | +GtkHandleBox
     | | +GtkItem
     | | | +GtkListItem
     | | | +GtkMenuItem
     | | | | `GtkCheckMenuItem
     | | | |   `GtkRadioMenuItem
     | | | `GtkTreeItem
     | | +GtkViewport
     | | `GtkWindow
     | |   +GtkColorSelectionDialog
     | |   +GtkDialog
     | |   | `GtkInputDialog
     | |   `GtkFileSelection
     | +GtkBox
     | | +GtkButtonBox
     | | | +GtkHButtonBox
     | | | `GtkVButtonBox
     | | +GtkHBox
     | | | +GtkCombo
     | | | `GtkStatusbar
     | | `GtkVBox
     | |   +GtkColorSelection
     | |   `GtkGammaCurve
     | +GtkButton
     | | +GtkOptionMenu
     | | `GtkToggleButton
     | |   `GtkCheckButton
     | |     `GtkRadioButton
     | +GtkCList
     |  `GtkCTree
     | +GtkFixed
     | +GtkList
     | +GtkMenuShell
     | | +GtkMenuBar
     | | `GtkMenu
     | +GtkNotebook
     | +GtkPaned
     | | +GtkHPaned
     | | `GtkVPaned
     | +GtkScrolledWindow
     | +GtkTable
     | +GtkToolbar
     | `GtkTree
     +GtkDrawingArea
     | `GtkCurve
     +GtkEditable
     | +GtkEntry
     | | `GtkSpinButton
     | `GtkText
     +GtkMisc
     | +GtkArrow
     | +GtkImage
     | +GtkLabel
     | | `GtkTipsQuery
     | `GtkPixmap
     +GtkPreview
     +GtkProgressBar
     +GtkRange
     | +GtkScale
     | | +GtkHScale
     | | `GtkVScale
     | `GtkScrollbar
     |   +GtkHScrollbar
     |   `GtkVScrollbar
     +GtkRuler
     | +GtkHRuler
     | `GtkVRuler
     `GtkSeparator
       +GtkHSeparator
       `GtkVSeparator

6.3 윈도와 무관한 widget

여기의 widget들은 관련된 윈도가 없는 것들이다. 만약 어떤 이벤트를 포착 하려면 GtkEventBox를 이용해야 할 것이다. The EventBox Widget에 대한 section을 참조하라.

GtkAlignment
GtkArrow
GtkBin
GtkBox
GtkImage
GtkItem
GtkLabel
GtkPaned
GtkPixmap
GtkScrolledWindow
GtkSeparator
GtkTable
GtkViewport
GtkAspectFrame
GtkFrame
GtkVPaned
GtkHPaned
GtkVBox
GtkHBox
GtkVSeparator
GtkHSeparator

우리는 각각의 widget을 차례로 시험하고 그들을 보일 수 있는 간단한 함수들을 만들어 가며 GTK에 대한 탐구를 계속할 것이다. 또다른 훌륭한 소스는 GTK와 함께 배포된 testgtk.c 이다. 그것은 gtk/testgtk.c 에서 찾을 수 있을 것이다.


다음 이전 차례