Posted on 1월 30, 2009 at 3:15 오후
Building a Menu Bar Application
개인적으로 메뉴바에 이것 저것 잔뜩 떠있는 것을 별로 좋아하지 않는 편이지만, 메뉴 바 프로그램은 여러모로 유용할 수 있다. 사용자가 언제나 바로 접근하기 쉽고, 항상 화면에 떠있기 때문에 즉각적인 시각 정보를 전달하면서도 사용자의 작업에 방해가 되지 않는다. 언제나 떠있어야하는 상주 프로그램의 경우 메뉴바에 약간의 공간만 차지하고선 사용자에게 인터페이스를 제공할 수 있다.
C4TaskLauncher 프레임웍을 사용하면 UNIX 프로그램을 쉽게 이용할 수 있으므로, 좋은 커맨드라인 툴을 사용하고 그 결과를 메뉴바에 디스플레이하는데 사용할 수 있을 것이다.
사실, 최근에 우리 프레임웍을 사용하여 UNIX 프로그램에 작은 GUI 래핑 작업을 하고 있었는데, 이 글도 거기서부터 파생된 것이다.
메뉴바 응용프로그램은 약간의 코드와 예쁜 이미지로 매우 쉽게 만들 수 있다. 직접 만들어 보도록 하자.
컨트롤러의 인터페이스에 다음 변수를 추가하자.
-
IBOutlet NSMenu *statusMenu;
-
NSStatusItem *statusItem;
구현 파일에서는 statusItem을 설정한다. StatusItem은 실제 메뉴바에 뜨는 객체인데, 자신만의 메뉴, 아이콘, 텍스트 등을 설정해 줄 수 있다.
-(void)awakeFromNib 메소드에 다음과 비슷한 코드를 입력하자.
-
statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
-
[statusItem setImage:[NSImage imageNamed:@"synergy_gray_icon"]];
-
[statusItem setAlternateImage:[NSImage imageNamed:@"synergy_white_icon"]];
-
[statusItem setMenu:statusMenu];
-
[statusItem setHighlightMode:YES];
메뉴바는 시스템 전반에서 공유하므로, NSStatusBar 클래스에서 systemStatusBar를 얻어온다.
이 경우, statusItem에 쓰이는 이미지가 정사각형이기에 statusItem이 메뉴바의 두께와 동일한 넓이를 갖도록 설정하였다. 만일 사용중에 statusItem의 크기가 변해야한다면 NSVariableStatusItemLength를 대신 설정해야한다.
대체 이미지(Alternate Image)는 사용자가 메뉴바의 아이콘을 클릭했을때 뜰 아이콘이다. 따라서, 하이라이트 모드를 설정한다면 이 대체 이미지가 하이라이트된 영역에서 잘 보이도록 디자인해야 한다. (우리의 경우는 대체 이미지를 흰색으로 디자인하였다.)
코드는 이게 전부다.
이제 인터페이스 빌더를 열자. 라이브러리 창에서 NSMenu를 가져다가 메뉴를 만든다. 이 메뉴가 StatusItem을 클릭했을때 뜰 메뉴이다.
컨트롤러의 statusMenu 아웃렛과 방금 만든 메뉴를 연결하자.
메뉴를 만들고 각 메뉴 항목의 액션 생성 및 연결이 끝났다면, 이제 프로그램을 빌드하고 실행시켜 볼 차례다.
위의 그림에서 보이듯이 이제 메뉴 바 프로그램 생성이 끝났다!
아, 한가지 남은 일이 있다. 만일 진정한 메뉴바 프로그램을 만들고자 한다면, 창도 뜨지 않고 닥(dock)에도 아이콘이 뜨지 않는 프로그램이 되어야 할 것이다. (메뉴바 외에는 다른 인터페이스가 없음을 의미한다.)
Info.plist 파일을 열고 LSUIElement 키를 만들고 값을 1로 설정하자. 자동으로 다음 이미지처럼 키 이름이 변경될 것이다.
이제 프로그램 구동시에 띄워놓은 창이 없다면(NSWindow의 인스펙터에 Visible at Launch 체크박스 해제) 프로그램은 창도, 독에도 뜨지 않는 프로그램이 될 것이다.
자! 이제 Xcode를 열고 끝내주는 메뉴바 응용프로그램을 만들어보자!!

.png)




