WxPerl은 OOP 이며 MFC와 비슷한 방식으로 동작한다.
Perl 에서의 class 는 package 로 구분하며 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 사이트가 있지만 위의 사이트가 제일 보기좋고 깔끔하다.