BeOS Programming 2

From 흡혈양파의 인터넷工房
Jump to navigation Jump to search
BeOS 프로그래밍의 시작-윈도우를 만들어보자


백성수 (rainbow@hnc.co.kr)


여러분과 마찬가지로 필자 역시 BeOS프로그램을 이제 시작하는 초보로 많은 것은 알려 드릴수가 없습니다. 좀더 구체적이고 자세한 것들은 Be Developer's Guide나 이 그룹의 실력 있는 다른 분들에게 물어보길 바라며, 이 글은 아주 기초적인 BeOS프로그래밍에 대해서 설명할 것이며 이번 시리즈는 텍스트 에디터를 만들어보는 것을 목표로 하겠습니다.


강좌 1 : 윈도우를 만들어 보자

MS-Windows시스템의 프로그래밍(이하 MS 프로그래밍)에 비해서 BeOS의 GUI프로그램이 얼마나 체계적이고 프로그래머 편의성을 제공하고 있는지 하나씩 느껴 보기로 합시다. 아마 MS프로그래밍을 해봤던 독자라면 "Hello C"라는 간단한 문장을 출력하기 위해서 얼마나 많은 코드들이 필요했는지 말하지 않아도 알 것입니다. 이에 비해서 시스템 자체가 객체지향 기반으로 디자인된 BeOS는 프로그래머를 얼마나 편하게 해 주는지 모릅니다.(고급 프로그래밍 측면에서...)

먼저 Application Kit(자세한 것은 Be Developer's Guide나 Be Book 참고)에 대해서 알아보기로 합시다. 이 키트는 프로그램을 좀더 편하게 할 수 있도록 도와주는 응용 프로그램을 위한 클래스들의 모임입니다. 이중에서 우리가 관심을 가져야할 클래스로 BApplication, BWindow, BView등이며, 이들은 프로그램을 구성하는 기본 클래스들로 응용 프로그램(Application)은 윈도우(Window)를 가지며, 윈도우(Window)는 뷰(View)를 갖습니다. BApplication은 프로그램을 전체적으로 관리하는 메인 쓰레드 역할을 하는 클래스입니다.

먼저 이해를 돕기 위해서 전체 소스 코드를 봅시다.

#include <BApplication.h>

class HelloApp : public BApplication
{
public:
  HelloApp();

  BWindow *pWindow;
};

HelloApp::HelloApp()
         :BApplication("application/x-vnd.BeKrAge-Hello")
{
  BRect  frame;
  frame.Set(100, 100, 300, 500);
  pWindow = new BWindow(frame, "Hello",
			B_TITLED_WINDOW, 
			B_NOT_RESIZABLE|B_NOT_ZOOMABLE);
  pWindow->Show();
}

void main(void)
{
  HelloApp *theApp;
  theApp = new HelloApp;
  theApp->Run();
  delete theApp;
}


이번 강좌에서 다루게 될 소스코드 전부입니다. 간단하죠. 하마 C++에 익숙한 독자라면 느낌이 팍 올 줄로 압니다. BeOS화면의 DeskBar에서 Application-BeIDE메뉴를 선택합니다. 아마 간단한 에디터가 화면에 나타날 것이다. 여기에 위의 코드를 쳐 넣고 저장을 합니다. 그리고 File-New Project를 열고 위에서 저장한 파일을 추가하면 됩니다. BeIDE에 대한 자세한 설명은 다른 것들을 참고하도록 하고 하나하나 알아보기로 합시다.

void main(void) 
{
  HelloApp *theApp; // Pointer to our application object
  theApp = new HelloApp;
  theApp->Run();
  delete theApp;
}


프로그램 엔트리 포인트인 main()함수는 BApplication의 파생 객체인 HelloApp개체를 생성합니다. Run()멤버 함수는 프로그램이 실제 구현되는 것으로 종료될 때까지 이벤트 루프를 계속 돌면서 메시지들을 처리합니다.


Run()함수가 리턴 되었을 때, 더 이상 필요 없는 theApp개체(Application 개체)를 제거하고 프로그램을 종료합니다. 한가지 알아둘 사실이 있는데 be_app라는 전역 변수가 그것으로 여러분이 BApplication객체를 생성하면 이 변수에 자동 할당되어서 프로그램내 어디서나 이용할 수 있습니다. 즉, theApp를 be_app변수에 할당하지 않아도 BeOS에서는 자동적으로 이를 가지고 처리할 수 있도록 되어 있습니다. 따라서 위의 코드를 다음과 같이 작성할 수도 있습니다.

void main(void) 
{
  new HelloApp;
  be_app->Run();
  delete be_app;
}


HelloApp클래스를 봅시다.

class HelloApp : public BApplication
{
public:
  HelloApp();

  BWindow *pWindow;
};


이미 앞에서 언급했듯이 HellpApp는 BApplication에서 계승받습니다. 우리가 원하는 결과를 얻기 위해서 단지 생성자만 필요하기 때문에 public 선언으로 클래스를 설계했습니다.


HelloApp생성자를 보면

HelloApp::HelloApp()
         :BApplication("application/x-vnd.BeKrAge-Hello")
{
  BRect  frame;
  frame.Set(100, 100, 300, 500);
  pWindow = new BWindow(frame, "Hello", 
			B_TITLED_WINDOW, 
 		    	B_NOT_RESIZABLE|B_NOT_ZOOMABLE);
  pWindow->Show();
}


제일 먼저 "application/x-vnd.Be-HelloWorld"문자열 인수를 가진 BApplication 생성자를 처리하고 있습니다. 이상해 보이는 문자열은 프로그램의 특정 정보를 나타내는 MS윈도우의 윈도클래스와 같은 역할을 하는 식별자입니다. 이를 간략히 해석해 보면 응용 프로그램이고 BeKrAge에서 만들었으며 프로그램의 이름은 "Hello"라는 것을 의미합니다. 이것이 프로그램을 확인하는 일반적인 방법으로 이미 첫 번째 강좌에서 얘기한바 있습니다. 더욱이 여러분의 프로그램이 다른 프로그램과 메시지를 주고받을 때 이 문자열을 가지고 처리합니다.

HelloApp개체가 생성되었을 때, 사각형 개체인 BRect(사각형을 만드는 개체:MS윈도우의 MFC내 CRect와 비슷한 클래스)를 만든다. 이는 화면의 사각형 영역을 설정하고 사각형의 크기나 위치를 가져오거나 설정하는 몇몇 멤버 함수를 제공합니다.

이런 멤버 함수중의 하나가 Set()인데 이걸 이용해서 (100,100)와 (300,500)사이의 영역을 가진 사각형을 설정합니다. 따라서 가로 200, 세로 400픽셀의 사각형 크기를 갖습니다. 참고로 Set()함수는 왼쪽, 위, 오른쪽, 아래순의 인자를 갖습니다. BRect개체를 인수로 갖는 HelloWindow생성자의 윈도우 개체를 만들고, 바로 이 사각형이 화면내의 윈도우의 위치와 크기가 되는 것이죠.

다음으로 Application내에 윈도우를 포함하는 작업을 해야합니다. 이를 위해서 BWindow클래스의 인스턴스를 하나 만들어 pWindow멤버 변수에 넣습니다. 즉, BWindow객체의 인스턴스 포인터가 pWindow에 할당됨으로서 추후 HelloApp클래스내 어느 곳에서나 이를 제어할 수 있습니다.

그럼 BWindow 생성자를 자세히 보기로 합시다.

응용 프로그램의 초기 위치가 설정된 frame인수는 BWindow생성자를 통해서 넘겨지고, 윈도우 이름은 "Hello"가 설정됩니다. B_TITLED_WINDOW는 윈도우 생성 형태를 가리키는 상수로, 윈도우 상단에 윈도우 이름 탭을 가지고 있고 닫기 버튼을 가지는 윈도우를 말합니다. B_NOT_RESIZABLE와 B_NOT_ZOOMABLE는 윈도우 크기를 조절할 수 없고 최대 크게 할 수 없도록 윈도우 상태를 설정하는 상수.

BWindow의 멤버함수중의 하나인 Show()함수는 현재 윈도우를 화면에 나타나도록 하는 함수로 이를 호출하지 않으면 윈도우가 화면에 나타나지 않는다. 따라서 위의 코드에서 pWindow-> Show()는 없어서는 안 될 중요한 부분입니다.

끝으로 에러 없이 위 소스코드를 입력해서 빌드를 마치고 실행해 보면 약간 이상한 점을 발견할 수 있을 것입니다. 아마도 윈도우 이름 탭의 닫기 버튼을 눌렀는데도 프로그램이 끝나지 않을 것입니다. 이 부분에 대한 자세한 얘기는 다음시간에 다루기로 하고, 오른쪽 Alt+Ctrl버튼을 누르고 마우스 왼쪽 버튼으로 Desk Bar의 "Hello"부분을 누르면 삭제됩니다.

다음 강좌는 BView와 몇몇 추가 함수를 통해서 화면에 "Hello BeOS"를 출력하는 완벽한 BeOS프로그램을 만들어 보기로 합시다.