[perl] WxPerl 프로그래밍

WxPerlOOP 이며 MFC와 비슷한 방식으로 동작한다.

Perl 에서의 classpackage 로 구분하며 main package를 먼저 선언해준다.

package main;                             #메인클래스 선언
my $app  = Wx::SimpleApp->new;       #SimpleApp 생성
my $frame = MyFrame->new;             #프레임 생성
$frame->Show;                             #프레임 을 띄운다.
$app->MainLoop;                          #루프를 돈다.

그다음 MyFrame 패키지를 선언하고

use base qw(Wx::Frame); 을 써준다.

new 메소드를 오버로딩해준다.

메인프레임의 new 의 경우 하나의 인자를 받는다.

my $class = shift; #클래스 포인터 (c++ 에서의 this ) 를 받는다.

그리고 루트를 하나만든다.

루트를 만드는이유, Wx 에서의 루트프레임에선 할 수 없는것이많다.( 키 입력같은경우)

그래서 패널을 깔고 패널에서 작업을 해야한다.

루트는 책상과같고 패널은 책상위의 하얀 도화지이다.

my $root = $class->SUPER::new(undef,-1,'2048 Program', .....

와 같은식으로 루트를 생성한다.

$root->{panel}=Wx::Panel->new($root,-1,Wx::wxDefaultPosition(),Wx::wxDefaultSize(),0,);

그다음 패널을 만드는 함수인데 Perl에서의 package 멤버변수는 ->{이름} 과 같은방식으로 쓰면 만들어진다.

패널의 스타일을 default 인자를 사용하게 하면, Enter키나 방향키등이 먹지않는다.

default style 이 탭으로 이동하는 스타일을 가지기 때문, 아마 Enter가 포커스를 가지게 하는 특별한 키가 되어서 그런것 같다.

키이벤트로 Enter나 방향키를 받게 하고 싶다면, 패널의 스타일에 TAB_TRAVERSAL 옵션은 제거하여만 한다.

이제 이 패널이 this가 된다.

$this=$root->{panel};

또한 이벤트 핸들러에대해 말하자면
메뉴의 핸들러는 EVT_MENU 이고, 그림그리는것의 핸들러는 EVT_PAINT 이다.
이것들을 사용하려면 상단에서
use Wx::Event qw(EVT_MENU EVT_PAINT);
와 같이 선언하여만한다. 각각의 이벤트는 스페이스바로 구분한다.

new 함수는 반드시 root를 리턴해야한다.

이제 메소드들을 작성할때에는 인자를 받아야한다. 클래스포인터와 이벤트변수이다.
이는 다음과 같이 받는다.

sub OnQuit{
    my ($his,$event) = @_;
}

추가적인 팁은 DC는 패널에 그릴때 지우고 그리지 않는다.
Clear() 메소드를 쓰면 모든 DC를 지운다.

레퍼런스에 나와있는것을 사용할땐 Perl에선 함수형식으로 사용한다.
WXK_UP 이란 매크로상수는 Wx::WXK_UP() 과 같이 쓴다.

나머지는 구글링과 http://docs.wxwidgets.org/3.0/annotated.html 에 모든것이 다 나와있다.
많은 wxwidget 사이트와 wxperl 사이트가 있지만 위의 사이트가 제일 보기좋고 깔끔하다.