= Control 과 이벤트 = 

지금까지는 Window에 기본되는 정보들과 Control 들이 어떠한 모양을 갖추고 있느냐를 보았습니다. 
물론 이벤트에 대해서도 보았는데요. 

이번 강좌에서는 Control 과 이벤트를 어떻게 연결 시키는지에 대해서 좀 더 자세히 알아보도록 하겠습니다. 

Winbinder에서는 간단하게 

{{{#!vim php 
<?php 

// 윈도우 생성 
$window = wb_create_window();
 
// 이벤트 핸들러 등록 
wb_set_handler($window, 'process_main');
 
// 이벤트 대기 시작 
wb_main_loop();

// 이벤트를 실행 
function process_main(....) { 
 
}
 
?>
}}}
이런 구조로 실행을 하고 

{{{#!vim php 
<?php
... 중략 ...

function process_main($window, $id, $ctrl, $param1, $param2, $param3) { 
    switch($id) { 
       case ID_TEXT1 : 
           echo "ID_TEXT1 아이디에 이벤트가 발행하였습니다. ";
           break;
    }
}
... 중략 ...
?>
}}}
이런식으로 이벤트를 실행한다고 간단하게 설명드렸습니다. 

일단 이것만 먼저 기억해두시고 읽어보시면 이해하는게 좀 더 빠르실 것입니다. 


== 이벤트 지정하는 형태 ==
 * easylogic lib 에서는 process_main() 과 같이 이벤트 핸들러 역할을 하는 함수는 숨겨진 함수로 적용을 하고 거기서는 실제로 이벤트가 일어나는 각각의 Control 에서 실제 이벤트를 실행하도록 지정합니다. 


{{{#!vim php 
<?

// 버튼 생성 
$button = new WBPushButton(array(
 'parent' => $window,
 'caption' => '안녕하세요',
 'event' => array(
  'click' => 'test'     // 클릭 이벤트 설정 
 ),
));

?>
}}}


위의 코드는 PushButton 을 생성하고 , click 이벤트가 발생할때 test() 함수를 실행하라는 의미입니다. 

즉, PushButton 이라는 Control(실제로는 $button으로 지정된 객체)에  직접적으로 이벤트를 지정하는 형태입니다. 

이런형태는 대부분의 window 프로그래밍을 oop 형태로 하는 곳에서 많이 보시게 됩니다. 

각각의 Control 들은 자신들에 맞는 이벤트 형태를 가지고 있고 이벤트를 실행할 수 있는 함수를 지정하는 형태로 되어있으니 좀 더 쉽게 이벤트를 사용 하실 수 있을 것입니다. (Control 에만 집중하면 됩니다.)


== 이벤트 실행 내부 들여다보기 ==

=== 이벤트 설정하기 ===


각 Control에 이벤트를 설정하는 방법은 2가지가 있습니다. 

내부 클래스 메소드를 사용 할 수 있는 방법(상속)과 외부 함수를 이벤트 실행 함수로 넘기는 방법(callback)이 있습니다. 


2가지의 차이점은 

 * 클래스 메소드를 이용하는 방법은 상속관계에서 미리 정해진 메소드를 사용 할 수 있게해줍니다. 

click 이벤트의 경우 Control에 $button->onClick() 메소드 형태로 지정되어있어서 

{{{#!vim php 
<?php
class PButton extends WBPushButton { 
    public function __construct($options = array()) { 
         parent::__construct($options);
   }

    // 클래스 메소드는 상속관계에서 바로 지정해서 사용 할 수 있습니다. 
    public function onClick($eo) { 
         echo $eo->object()->getText(), PHP_EOL;
    }
}
?>
}}}

 * 외부함수를 이벤트 실행함수로 넘기는 방법은 

{{{#!vim php 
<?php

// 버튼 생성 
$button = new WBPushButton(array(
 'parent' => $window,
 'caption' => '안녕하세요',
 'event' => array(
  'click' => 'test'     // 클릭 이벤트 설정 
 ),
));

// 이벤트 실행함수 지정 
function test($eo) { 
    echo $eo->object()->getText(), PHP_EOL;
}

?>
}}}

위와 같은 코드로 외부 함수를 사용해서 click 이벤트에 대한 함수를 그대로 지정할 수 있습니다.

=== 이벤트 설정하는 메소드 ===
[WBObject] 를 상속받은 모든 클래스는 동일하게 이벤트를 설정하는 메소드를 가집니다. 

 * 클래스 메소드를 이용하는 방법은  $button->setEvent(); 를 통해서 실제 실행될 메소드를 지정합니다. 

{{{#!vim php 
<?php 

... 

 protected function initEvent() { 
  parent::initEvent(); 

  // 이벤트 등록 
  $this->setEvent('show',   'onShow');
  $this->setEvent('hide',   'onHide');
  $this->setEvent('close',  'onClose');
  $this->setEvent('mousedown', 'onMouseDown');
  $this->setEvent('mousemove', 'onMouseMove');
  $this->setEvent('mouseup',  'onMouseUp');
  $this->setEvent('focus',  'onFocus');
  $this->setEvent('dblclick',  'onDoubleClick');
  $this->setEvent('active',  'onActive');
  $this->setEvent('accel',  'onAccel');
 }

.... 

?>
}}}


위의 코드는 [WBWindow] 클래스에서 사용되는 이벤트를 미리 지정해놓은 형태입니다. 
위의 이벤트 말고 다른 이벤트를 지정하고 싶다면 setEvent() 메소드를 통해서 추가하시면 됩니다. 

 * 외부함수를 이벤트 실행함수로 넘기는 방법은 $button->addEvent(); 를 통해서 지정합니다. 

{{{#!vim php 
<?php 

// 메소드를 통해서 지정 

$button = new WBPushButton(array(...));

$button->addEvent('click', 'test');
or 
$button->on('click', 'test');


// 속성으로 이벤트 지정 

$button = new WBPushButton(array(
 'parent' => $window,
 'caption' => '안녕하세요',
 'event' => array(
  'click' => 'test'     // 클릭 이벤트 설정 
 ),
));

?>
}}}

위와 같이 control을 생성할때 이벤트를 지정할 수 있습니다.

=== 사용자 이벤트 지정 ===
 * setEvent()나 addEvent() 의 경우는 단순히 함수 또는 메소드를 연결하는 역할만하고 실제로 이벤트를 실행시키지는 않습니다. 실제로 이벤트를 실행할려면 fireEvent(), fire() 두가지 메소드를 상속 관계에서 사용하게 됩니다. 

{{{#!vim php 
<?php

....

 /**
  * 이벤트 실행 
  *
  * @param WBEvent $eo 이벤트 객체 
  */
 public function fire($eo) {    // 메소드 재정의 
  // focus
  if ($eo->isFocus()) { $this->fireEvent('focus', $eo); return; }

  // double click 
  if ($eo->isDoubleClick()) { $this->fireEvent('doubleclick', $eo); return; }

  // default click event 
  $this->fireEvent('click', $eo); 
 }

... 

?>
}}}

굵은 글씨로 표시된 부분들이 실제 이벤트를 실행하는 방법 입니다. 
fire() 메소드는 이벤트를 구분해서 fireEvent() 에 실제로 실행될 이벤트를 지정하는 형태입니다. 
만약 사용자 이벤트를 직접 실행하고 싶다면 아래와 같은 형태로 fireEvent()를 직접 실행해주시 됩니다. 


{{{#!vim php 
<?php

class PButton extends WBPushButton { 
   .... 
   // click() 메소드를 실행할때 click 이벤트를 실행합니다. 
   public function click() { 
       $eo = new WBEvent($this->parent, $this->getInstance());
       $this->fireEvent('click', $eo);
   } 
   .... 
}

?>
}}}

== easylogic lib 에서 사용되는 기본 이벤트 ==

 * window 이벤트 공통 

{{{
//이벤트   => 실행메소드

resize    => onResize
mousedown => onMouseDown
mousemove => onMouseMove
mouseup   => onMouseUp
redraw    => onRedraw
focus     => onFocus
close     => onClose
}}}
 * Control 이벤트 공통 
{{{
//이벤트     => 실행메소드
focus       => onFocus
doubleclick => onDoubleClick
click       => onClick
}}}

최소한의 기본적인 이벤트만 지정해놓았습니다. 다른 이벤트가 필요하면 그때 그때 추가해서 사용하시면 됩니다. 
지금까지 간단하게 이벤트의 기본 원리를 알아보았습니다. ^^ 감이 조금씩 오시나요? 
다음 강좌부터는 실전 예제를 하나 정해서 조금씩 살을 붙여가면서 Control 에 대해서 설명해볼 생각입니다. 

그래서 무엇을 할까 생각해보다가 윈도우에 포함된 Window Media Player 를 가지고 간단한 MP3 플레이어를 만들어볼 생각입니다. ^^

괜찮은 프로그램 하나 만들 수 있게 많은 도움 주시면 감사하겠습니다. ^^ 담에 또 뵐게요 ~ ^^
