head	1.1;
access;
symbols;
locks
	root:1.1; strict;
comment	@# @;


1.1
date	2009.12.16.15.54.18;	author root;	state Exp;
branches;
next	;


desc
@/opt/nforge/var/wiki/easylogiclib/data/text/Window_ec_99_80_ec_9d_b4_eb_b2_a4_ed_8a_b8
@


1.1
log
@211.179.76.5;;cyberuls easylogic ;;
@
text
@이번 강좌는 윈도우 프로그래밍에 있어서 가장 중요한 이벤트에 대해서 말하고자 합니다. 

일단은 winbinder에 제공하는 이벤트에 대해서 한번 알아보고 진행하도록 하죠. 

= 1. WinBinder 에서 제공하는 이벤트 = 

WinBinder 는 아래와 같은 형태로 이벤트 실행이 된다고 저번 강좌에서 말씀드렸습니다. 

<php> 
<?

// 윈도우 생성 
$window = wb_create_window();

// 이벤트 핸들러 등록 
wb_set_handler($window, 'process_main');

// 이벤트 대기 시작 
wb_main_loop();


// 이벤트를 실행 
function process_main(....) { 

}


?>
</php>
 

여기서 실제 이벤트를 처리 하는 부분은 process_main 이라는 함수 입니다. 

Window는 이벤트를 받는 하나의 객체가 되고 실제 처리는 process_main 이라고 지정한 함수로 처리를 하게끔 되어 있습니다. 

자, 그럼 process_main() 함수를 어떻게 작성해야하는지 한번 볼까요? 

 
<php>
<?

... 중략 ...

function process_main($window, $id, $ctrl, $param1, $param2, $param3) { 
    switch($id) { 
       case ID_TEXT1 : 
           echo "ID_TEXT1 아이디에 이벤트가 발행하였습니다. ";
           break;
    }
}

... 중략 ...

?>
</php>
 

이벤트가 하나씩 발생할때마다 매번 위와같은 형식의 process_main() 함수를 부르게 되고 거기에는 총 6가지의 매개변수를 지정해놓아서 실제 어떤 이벤트가 발생했는지 구분합니다. 

 

* $window : wb_create_window() 함수에 의해서 나온 instance 입니다. 
* $id : wb_create_control() 에서 지정한 id 입니다. id는 각 Control 들이 가지고 있는 고유의 숫자라고 보시면 됩니다. (control 생성에 관련해서는 다음 강좌때 알아볼 것 입니다.)
* $ctrl : wb_create_control() 함수에 의해서 나온 instance 입니다. 실제 control을 가리킵니다. 
* $param1 : 각 이벤트마다 전달되는 특수한 값이며, 대부분 어떤 이벤트가 발생했는지에 대한 구분을 던져줍니다. (이벤트의 종류에 대해서는 잠시후에 알아보겠습니다.) 
* $param2 : $param1에서 발생한 이벤트 종류에 대해서 연결되는 부가 정보를 저장해놓은 매개변수입니다. 예를 들어 마우스를 움직이는 이벤트 감지는 $param1 으로 하고 실제 마우스 위치는 $param2 로 찾는 형태입니다. 
* $param3 : $param2 와 마찬가지로 부가적인 정보를 던져줍니다. 


이상 6가지 매개변수를 가지고 이벤트를 분기하고 처리하게 됩니다. 

위의 변수를 process_main 에 지정하지 않으면 해당 값을 사용 할 수가 없습니다. 


자, 이벤트 발생한 정보에 대해서 받았다면 실제 처리 하는 코드를 만들어야 하는데요, 

 
<php>
    switch($id) { 

       case ID_TEXT1 : 

           echo "ID_TEXT1 아이디에 이벤트가 발행하였습니다. ";

           break;

    }
</php>
 

이 코드가 그러한 부분이 됩니다. 

위의 코드는 $id 변수로 구분을 해서, 실제 control에 부여된 유일한 키로 구분을 하여 이벤트를 실행하는 코드입니다. 

그렇다면 case ID_TEXT1 에 나온 ID_TEXT1 상수는 무엇일까요? 

 
WinBinder는 Win32Api를 php로 구현할 수 있게 해주는 서브셋입니다. 

그래서 대부분의 형식이 win32api 를 그대로 이어받게 되는데요.

그 중에 하나가 win32api 에서 컨트롤을 구분하기 위해서 상수를 선언하고 그 상수로 제어하는 부분들이 많습니다. 

 
WinBinder도 같은 형식을 따르기 때문에 아래와 같이 ID_TEXT1 이라는 상수를 정해주고 실제 control을 생성하게 됩니다. 

 
<php>
define("ID_TEXT1", 10003); 
</php>


그렇게 되면 우리는 process_main() 함수에서 $id 라는 값으로 구분지어서 특정 control에 대한 실행코드를 작성 할 수 있게 됩니다. control은 id를 지정해야한다는 것만 아시면 될 것 같습니다. 

 
실제로 이벤트가 위와 같은 형식으로 실행되기 위해서는 wb_create_window () 함수에서 몇가지 옵션을 설정해야 합니다. 

wb_create_window() 생성 양식은 아래 링크와 같습니다. 

 

http://winbinder.org/manual/functions/wb_create_window.html

 

여기를 참고하시면서 보세요. 

여기서 이벤트를 받아 들이는 설정을 하게 되는데요, 그 역할을 하는 것이 

$style , $param 매개변수 입니다. 

* $style 에서는 WBC_NOTIFY 라는 상수를 설정해야하구여, 
* $param 에서는 실제로 어떤 이벤트를 받을 것인지를 정해서 이벤트에 관련된 상수를 설정해야합니다. 

그렇게 해야만 실제로 윈도우가 이벤트를 받아들이고 실행하게됩니다. 

그럼 이벤트를 실행하기 위해서 wb_create_window() 에서 사용되는 옵션의 값들을 살펴보겠습니다. 

$style 에는 아래의 2가지 상수를 가지고 이벤트를 설정합니다. 

* WBC_NOTIFY : 윈도우가 새로그려지는 이벤트를 제외한 모든 이벤트를 받아들이기 위한 설정 
* WBC_CUSTOMDRAW : 윈도우가 새로 그려질때 이벤트를 발생시킬 것인지에 대한 설정 

$param 에는 실제로 받아들일 이벤트를 지정을 하게 됩니다. 이벤트 종류는 아래의 표를 참조해주세요. 

Notification flag 
 Sent when

WBC_DBLCLICK  -> 
 The control or the parent window was double-clicked.
 
WBC_MOUSEMOVE  ->
 The mouse cursor was moved over the main window.
 
WBC_MOUSEDOWN  -> 
 A mouse button was pressed on the main window.
 
WBC_MOUSEUP -> 
 A mouse button was released on the main window.
 
WBC_KEYDOWN -> 
 A key was pressed when a given control has the focus.
 
WBC_KEYUP -> 
 A key was released when a given control has the focus.
 
WBC_GETFOCUS -> 
 A control has received the keyboard focus.
 
WBC_REDRAW -> 
 A request for screen redraw was posted on the message queue.
 
WBC_RESIZE -> 
 The parent window was resized.
 
WBC_HEADERSEL -> 
 A ListView column header was clicked or a TabControl tab is changed.
 
Winbinder 에서는 위와 같은 이벤트가 지원이 되고 그 이벤트마다 상수로 지정이 되어 있어서 설정이 가능합니다. 

다음과 같이 여러개 이벤트가 동시에 설정가능합니다. 

 
<php>
$mainwin = wb_create_window(NULL, ResizableWindow, "Resize me", 200, 100, 410, 400, WBC_NOTIFY, WBC_RESIZE | WBC_MOUSEMOVE | WBC_MOUSEDOWN | WBC_MOUSEUP); 
</php>
 

참고로 WBC_REDRAW 이벤트는 WBC_CUSTOMDRAW 상수가 $style 변수에  설정이 되어 있어야 합니다. 

 
</php>
$mainwin = wb_create_window(NULL, ResizableWindow, "Resize me", 200, 100, 410, 400, WBC_NOTIFY | WBC_CUSTOMDRAW, WBC_RESIZE | WBC_MOUSEMOVE | WBC_MOUSEDOWN | WBC_MOUSEUP | WBC_REDRAW); 
</php>
 

자, 그럼 전체 코드 구성을 보시면 아래와 같이 이벤트가 동작을 합니다. 

<php>
<?

// 윈도우 생성 , 발생 할 수 있는 이벤트를 적어주세요. 
$window = wb_create_window(NULL, ResizableWindow, "Resize me", 200, 100, 410, 400, WBC_NOTIFY, WBC_RESIZE | WBC_MOUSEMOVE | WBC_MOUSEDOWN | WBC_MOUSEUP);  

// control 생성코드 중략 

// 이벤트 핸들러 등록 
wb_set_handler($window, 'process_main');


// 이벤트 대기 시작 
wb_main_loop();

function process_main($window, $id, $ctrl, $param1, $param2, $param3) { 

    switch($id) { 
       case ID_TEXT1 : 
           echo "ID_TEXT1 아이디에 이벤트가 발행하였습니다. ";
           break;
    }
}

?>
</php>

= 2. easylogic lib 에서 이벤트 =

이제는 실제 라이브러리에서 사용되는 이벤트에 대해서 설명해보겠습니다. 일단 기본 구조부터 보시죠. 

 
<php>
<?php

// 윈도우 생성 

$window = new WBAppWindow(array(
 'title' => '버튼 테스트',
 'width' => 300,
 'height' => 300,
));

 

// 버튼 생성 

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

 

// 윈도우 활성화 
$window->setVisible(true);

// 이벤트 받기 시작 
WBApplication::start();


// 버튼 클릭시 실행될 이벤트 
function test($eo) { 
 WBDialog::info($eo->window(), $eo->object()->getText(), 'Button Click');
}

?>
</php>
 

보시는 바와 같이 함수형태로 사용하던 이벤트처리와는 많이 다른 형태로 되어있습니다. (실제 코드보다는 주석에 달린 흐름 위주로 보시기 바랍니다. )

winbinder에서 사용되었던 WBC_NOTIFY 를 설정하거나 WBC_RESIZE 와 같은 이벤트를 설정하는 형태가 아닙니다. 

그리고 차이점이 process_main() 함수를 따로 지정하지 않고 WBPushButton 에 바로 click 이벤트를 설정합니다. 

 
easylogic lib 에서는 기본적으로 모든 이벤트를 받아들이도록 상수 설정을 미리 해놓았습니다. 

그리고 실제 실행되는 control 마다 이벤트를 실행하도록 내부코드가 짜여있기 때문에 control에 일어나는 이벤트는 모두 window에 이벤트를 지정하지 않고 control 에 미리 정해진 이벤트 명으로 실행할 수 있는 함수만 연결시키면 됩니다. 

 
그리고 중요한 점 하나는 click 이벤트가 발생했을 때 test() 함수에 $eo 라는 변수를 던져주게 됩니다. 

$eo 는 WBEvent 클래스의 객체로써 process_main 에서 받았던 모든 정보를 가지고 있고 그것을 객체형태로 사용 할 수 있게 해주는 유틸리티 클래스 입니다. 


* 참고

WBEvent 클래스는 몇가지 이벤트를 구분할 수 있는 메소드를 제공합니다. 이벤트 상수 지정하는 것과 거의 1:1로 매칭됩니다. 

 

이벤트 상수  -> 
 WBEvent 메소드 
 
WBC_DBLCLICK -> 
 $eo->isDoubleClick() 
WBC_MOUSEMOVE -> 
 $eo->isMouseMove() 
WBC_MOUSEDOWN -> 
 $eo->isMouseDown() 
WBC_MOUSEUP -> 
 $eo->isMouseUp() 
WBC_KEYDOWN -> 
 $eo->isKeyDown() 
WBC_KEYUP -> 
 $eo->isKeyUp() 
WBC_GETFOCUS -> 
 $eo->isFocus() 
WBC_REDRAW -> 
 $eo->isRedraw() 
WBC_RESIZE -> 
 $eo->isResize() 
WBC_HEADERSEL -> 
 $eo->isHeaderSelected() 


그 외에 사용할 수 있는 부가적인 메소드들이 많이 있습니다.
@
