페이지

2016년 3월 17일 목요일

pvdevelop 프로젝트 -UI 편집 방법 - 라벨 위젯 사용법-이벤트 관련

서론

"pvdevelop 프로젝트 -UI 편집 방법 - 라벨 위젯 사용법" 에서 위젯의 특성을 변경하여, 외관을 변경하였다면 이번에는 무엇을 해야 할까?
 만약 라벨 위젯을 마우스로 눌렀을때 TEXT 내용을 다른 내용으로 바꾸거나, pushbutton을 눌렀을 때 특정 위젯을 나타나게 하거나, 특정 마스크(GUI 화면) 로 전환하던가, 기타 등등...
이런것들을 어떻게 하는지 알아보기 전에, 반드시 알아야 하는 기본 개념이 있다. 바로 이벤트 드라이븐(발음 하는대로 썼다. 이해하시기를)...
 명칭이나, 설명 방식이 틀릴수도 있지만 윈도우 OS 의 윈도우 화면에서 마우스를 누르거나 키보드를 누르면, 그 동작에 대응하는 event를 발생시킨다. 발생된 이벤트는 이벤트 풀이라는 링버퍼로 들어가 OS가 사용자가 원하는 동작을 순차적으로 수행한다. 발생하는 이벤트의 우선 순위에 따라 처리순서가 달라질 수 있지만...
여하튼 pvserver 프로그램도 개별 마스크 프로그램 마다 내부적인 이벤트 풀을 이용하여 클라이언트(pvbrowser)가 요구하는 동작을 수행한다. 



자, 그럼 pvserver 가 관리하는(처리하는) 이벤트의 종류에 대해 알아보자.
이벤트 종류를 분류해보면 마우스 관련 이벤트, 키보드 관련 이벤트, 그리고 개별 위젯별 이벤트 와 NULL, default 와 같은 기본 이벤트로 분류할 수 있다.

마우스 관련 이벤트를 좀더 분류해 보면, 위젯 같은 GUI 요소 위에 마우스에 위치할 경우 발생하는 MOUSE_OVER_EVENT, 마우스 버튼이 눌러졌는 지, 눌러졌다 떨어 졌는지에 따라 BUTTON_PRESSED_EVENT, BUTTON_RELEASED_EVENT 같은 것 들이 있다. 그림 1 은 이에 따라 발생하는 서버 창 메시지이다.

그림 1마우스동작에 대한 서버 메시지
 서버창 메시지를 살펴보자.
  • MOUSE_OVER_EVENT 0
    UI 배경에 마우스가 위치한 경우
  • MOUSE_OVER_EVENT 1
    위젯 위에 마우스가 위치한 경우
  • BUTTON_PRESSED_EVENT id=1
    마우스 버튼이 id=1 인 위젯을 누른 경우
  • BUTTON_RELEASED_EVENT id=1
    마우스 버튼이 id=1인 위젯을 눌렀다 뗀 경우
 출력되는 메시지 뒤에 보면 "id=3" 이라고 되어 있는데 이것은 3번 위젯을 마우스로 조작하고 있다는 것을 의미한다. 위젯 이름을 지정하였지만 메시지에서는 번호로 나타난다. 나중에 이벤트 처리 구문을 작성할 때도 id 번호를 이용하여야 한다.
마우스 메시지와 다르게 키보드 메시지는 다음과 같이 나타난다.

KEYBOARD_EVENT modifier=1 key=16777219

modifier와 key를 이요하면 어떤 키가 눌러졌는지 확인할 수 있다.

pvserver EVENT 종류

  • NULL_EVENT
  • BUTTON_EVENT
  • BUTTON_PRESSED_EVENT
  • BUTTON_RELEASED_EVENT
  • TEXT_EVENT
  • SLIDER_EVENT
  • CHECKBOX_EVENT
  • RADIOBUTTON_EVENT
  • GL_INITIALIZE_EVENT
  • GL_PAINT_EVENT
  • GL_RESIZE_EVENT
  • GL_IDELE_EVENT
  • TAB_EVENT
  • TABLE_TEXT_EVENT
  • TABLE_CLICKED_EVENT
  • SELECTION_EVENT
  • CLIPBOARD_EVENT
  • RIGHT_MOUSE_EVENT
  • KEYBOARD_EVENT
  • PLOT_MOUSE_MOVED_EVENT
  • PLOT_MOUSE_PRESSED_EVENT
  • MOUSE_OVER_EVENT
  • USER_EVENT
  • DEFAULT
 클라이언트 프로그램 (pvbrowser)에서 마우스 조작이나 위젯관련 변경사항이 발생하면, 대응하는 이벤트가 서버쪽으로 전송된다. 이 이벤트들은 mask 프로그램의 int show_mask*(PARAM *p) 함수에서 다음과 같이 처리된다.


간단히 설명하면 발생한 이벤트풀을 계속 감시하면서 이벤트가 있는 경우, 이벤트 종류를 판단한 후 해당하는 함수를 실행하는 구조다.

그럼, 간단하게 살펴보자. 우선은 NULL_EVENT
NULL_EVENT는 쉽게 말하자면 UI에서(클라이언트로 부터) 아무런 이벤트가 발생하지 않을 때 수행할 동작을 처리하기 위한 구문이다. NULL_EVENT에서는 가장 기본적인 shared memory, database,... 로 부터 데이터 읽어 들이는 함수(readData())를 실행한 후 데이터를 나타내는(?) 함수인(showData())를 실행한다.



readData(&d) 함수는 mask 프로그램에 다음과 같이 정의되어 있다.
주석을 보면 "shared memory, data or someghing else " 라고 적혀있다. 있는 그대로 받아 들이면 된다. 만약 통신된 데이터(shared memory)에서 특정한 데이터를 읽어 들이거나. database와 연결이 되어 있는 경우 데이터 베이스에서 값을 읽어 들일 수 있다. 이외에도 필요한 내용을 이 곳에 넣어 주면 된다.



showData(p, &d)함수는 mask 프로그램에 다음과 같이 정의되어 있다. 


다음으로 가장 빈번하게 사용하는 마우스 버튼이 눌러졌을 때 발생하는 event에 대해 알아보자.
클라이언트 화면에서 마우스 버튼을 누르면 발생하는 이벤트는 아래와 같다.



모든 이벤트에 보면 printf 구문을 사용하여 발생한 이벤트를 서버 도스 창에 메시지 형태로 보여 준다. 이 메시지를 잘 활용하면 어떤 부분의 코드를 수정하여야 원하는 동작을 얻을 수 있는지 알 수 있다. 활용도가 매우 높은 부분이다.
메시지를 표시한 후 mask*_slot.h에 정의된 함수를 수행한다. 대부분의 경우 mask*_slot.h에 정의 된 함수를 수정하여 서버 프로그램을 작성하게 된다.
 서버 프로그램 작성시 필요한 어떤 위젯,... 기타 등등 필요한 정보들은 함수 인자인 p, i, &d 값을 사용하면 된다. 추후 사용 방법은 알아 보기로 하고, 이런 것들이 있구나 하면 된다.

가장 중요한 것은 클라이언트 프로그램인 pvbrowser의 요청 사항은 서버 프로그램의 이벤트 풀에서 처리되며, 이벤트 처리를 담당하는 프로그램을 수정(작성)하면 실시간(거의) 방식으로 처리가 가능하다는 것이다.


댓글 없음:

댓글 쓰기